如何使用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
    


更新。对于 Qt3DQt3D.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 特定的答案。 是的,你可以。角度指定为quaternionrotationX, ..Y, ..Z 为欧拉角

以上是关于如何使用qml qt3d(qt)将对象旋转一个角度?的主要内容,如果未能解决你的问题,请参考以下文章

Qt3D:如何将 Scene2D 缩放为与窗口相同的大小(逐像素)?

如何在 Qt3D 中创建撤消/重做操作? [关闭]

围绕特定轴动画qt3d旋转

带有几个键的 QT3D QML RenderPassFilter 似乎有问题

C ++中的Qt3d输入

QT3D Multiview - 小部件中的单一视图