如何使用qml qt3d(qt)将对象旋转一个角度?
Posted
技术标签:
【中文标题】如何使用qml qt3d(qt)将对象旋转一个角度?【英文标题】:How to rotate the object about an angle using qml qt3d (qt)? 【发布时间】:2020-07-28 08:39:04 【问题描述】:我想旋转窗口屏幕中的对象。我正在使用 Qt/QML/Qt3D。
我编写了一些代码here 在对象窗口显示屏幕中添加一个按钮。借助此按钮,我可以将显示屏中的对象旋转大约(90 和 180)度。
QML 源代码:
import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Scene3D 2.0
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0
ApplicationWindow
visible: true
width: 640
height: 480
title: qsTr("3D Viewer")
header: ToolBar
ToolButton
text: "Open 3D Model"
onPressed:
fileDialog.open()
FileDialog
id: fileDialog
onAccepted:
sceneLoader.source = fileDialog.fileUrl
Scene3D
anchors.fill: parent
aspects: ["input", "logic"]
cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
Entity
id: sceneRoot
Camera
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 30
aspectRatio: 16/9
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d( 10.0, 0.0, 0.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
OrbitCameraController
camera: camera
components: [
RenderSettings
activeFrameGraph: ForwardRenderer
clearColor: Qt.rgba(0, 0.5, 1, 1)
camera: camera
,
InputSettings
]
Entity
id: monkeyEntity
components: [
SceneLoader
id: sceneLoader
]
所以,主要问题是:什么(假设Transform
组件?)以及应该在源文件中的何处添加代码以更改加载模型的角度?
【问题讨论】:
【参考方案1】:这是一个如何在 Qt(不是 Qt3D)中执行此操作的示例: https://doc.qt.io/qt-5/qml-qtquick-item.html#rotation-prop
Rectangle
color: "red"
x: 25; y: 25; width: 50; height: 50
rotation: 30 // !
您也可以绕其他轴旋转,以下是有关它的信息: https://doc.qt.io/qt-5/qml-qtquick-rotation.html
例子:
Rectangle
width: 100; height: 100
color: "blue"
transform: Rotation
origin.x: 25;
origin.y: 25;
axis x: 0; y: 1; z: 0 ;
angle: 45
更新。对于 Qt3D,Qt3D.Core
至少使用 2.15 版并使用 Transform
。这是编辑您的代码:
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.15
import QtQuick.Dialogs 1.2
import QtQuick.Scene3D 2.15
import Qt3D.Core 2.15
import Qt3D.Render 2.15
import Qt3D.Input 2.15
import Qt3D.Extras 2.15
ApplicationWindow
visible: true
width: 640
height: 480
title: qsTr("3D Viewer")
header: ToolBar
RowLayout
ToolButton
text: "Open 3D Model"
onPressed:
fileDialog.open()
ToolButton
text: "Rotate"
onPressed:
transform.rotation = Qt.quaternion(1, 0.1, 0, 0);
FileDialog
id: fileDialog
onAccepted:
sceneLoader.source = fileDialog.fileUrl
Scene3D
anchors.fill: parent
aspects: ["input", "logic"]
cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
Entity
id: sceneRoot
Camera
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 30
aspectRatio: 16/9
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d( 10.0, 0.0, 0.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
OrbitCameraController
camera: camera
components: [
RenderSettings
activeFrameGraph: ForwardRenderer
clearColor: Qt.rgba(0, 0.5, 1, 1)
camera: camera
,
InputSettings
]
Entity
id: monkeyEntity
components: [
SceneLoader
id: sceneLoader
,
Transform
id: transform
]
【讨论】:
感谢您。先生,如果我想在窗口屏幕中添加一个新按钮。为此,我在 main.qml(bitbucket.org/amahta/3d_viewer/src/master/main.qml) 中添加了一些代码。这样当我单击按钮时,对象会旋转大约 90 度和 180 度。所以请帮我为按钮编写一些代码 您能与我分享您的应用可以加载的 3D 模型吗?它将帮助我调查您的问题。另外,也许您可以尝试使用来自Qt 3D
模块的Transform
:doc.qt.io/qt-5/qml-qt3d-core-transform.html
先生,你能告诉我在我的代码中添加你的代码的位置,以便我的对象与这个旋转角度进行交互。并成功运行。
抱歉,此代码用于标准控件。对于 Qt3D,您应该使用另一个。但是如果没有您的 3D 模型,我无法测试您的代码,因此无法为 exactly Qt3D 提供经过充分测试的答案。如果您共享 3D 模型 - 它会尝试编辑 Qt3D 特定的答案。
是的,你可以。角度指定为quaternion
或rotationX
, ..Y, ..Z 为欧拉角以上是关于如何使用qml qt3d(qt)将对象旋转一个角度?的主要内容,如果未能解决你的问题,请参考以下文章
Qt3D:如何将 Scene2D 缩放为与窗口相同的大小(逐像素)?