How to rotate the object about an angle using qml qt3d (qt)?

Viewed 1342

I want to rotate the object in the window screen. I am using Qt/QML/Qt3D.

I write some code here to add a button in the object window display screen. With the help of this button I could rotate the object in the display screen about (90 and 180) degrees.

QML source code:

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
                    }
                ]
            }
        }
    }
}

So, the main question is: what (assume Transform component?) and where should be added code to this source file to change angle of loaded model?

1 Answers

Here is one example of how to do this in Qt (not 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  // !
}

Also you can rotate around other axis, here is information about it: https://doc.qt.io/qt-5/qml-qtquick-rotation.html

Example:

Rectangle {
    width: 100; height: 100
    color: "blue"
    transform: Rotation {
        origin.x: 25;
        origin.y: 25;
        axis { x: 0; y: 1; z: 0 };
        angle: 45
    }
}

Update. For Qt3D use at least version 2.15 for Qt3D.Core and use Transform. Here is edited your code:

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
                    }
                ]
            }
        }
    }
}
Related