QML 3D-更改在UI中渲染的模型的大小(扩展/缩小)以适合当前窗口

时间:2019-03-11 06:30:08

标签: qt qml qt3d

我正在通过读取.obj文件来使用Mesh渲染3D模型,并且我试图动态更改其大小以采用父窗口的尺寸。有没有办法调整对象的大小?目前,当我运行该应用程序时,该模型大约占据了主窗口的一半高度,而宽度只有其三分之一,而且我不确定它是从哪里提取的。

我尝试在ForwardRenderer中使用viewportRect,但这并没有改变显示。我还试图确定是否可以使用相机进行缩放,但是从我在文档中看到的结果来看,缩放比例因子需要硬编码的整数值,而且我又需要它是动态的。

当前显示如下-

screenshot

这是我的代码-

main.qml

Rectangle {
    id: rootWindow
    color: "black"

    Visualizer {}
}

Visualizer.qml

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12
import Qt3D.Input 2.12
import QtQuick.Scene3D 2.12
import QtQuick 2.12 as QQ2

Scene3D {
    id: scene3d
    anchors.fill: parent
    focus: true
    aspects: ["input", "logic"]
    cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
    Entity {
        id: sceneRoot

        Camera {
            id: camera
            projectionType: CameraLens.PerspectiveProjection
            fieldOfView: 45
            nearPlane: 0.1
            farPlane: 1000.0
            position: Qt.vector3d(0.0, 0.0, 40.0)
            upVector: Qt.vector3d(0.0, 1.0, 0.0)
            viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
        }

        FirstPersonCameraController {
            camera: camera
        }

        components: [
            RenderSettings {
                activeFrameGraph: ForwardRenderer {
                    camera: camera
                    clearColor: "transparent"
                    Viewport {
                        id: viewport
                        normalizedRect: Qt.rect(0, 0, 1, 1)
                    }
                }
            },
            InputSettings {
                id: inputSettings
            }
        ]

        PhongMaterial {
            id: material
        }

        Mesh {
            id: sphereMesh
//             source: "images/face3d/face_bse_mesh.obj"
            source: "images/robo-obj-pose4/source/d2f0cff60afc40f5afe79156ec7db657.obj"
        }

        Transform {
            id: modelTransform
            property real userAngle: 0.0
            matrix: {
                var m = Qt.matrix4x4()
                m.rotate(userAngle, Qt.vector3d(0, 1, 0))
//                 m.translate(Qt.vector3d(20, 0, 0))
                return m
            }
        }

        QQ2.NumberAnimation {
            target: modelTransform
            property: "userAngle"
            duration: 10000
            from: 0
            to: 360

            loops: QQ2.Animation.Infinite
            running: true
        }

        Entity {
            id: sphereEntity
            components: [sphereMesh, material, modelTransform]
        }

        OrbitCameraController{
            id: orbitCamera
            camera: camera
        }
    }
}

1 个答案:

答案 0 :(得分:1)

因此,在问了很多问题之后,我找到了解决方案。这是一个相当简单的技巧。

您只需要在Mesh中添加以下代码,即可在其包含的窗口中调整模型的大小。

Mesh {
    ----
    onStatusChanged: {
        if(status == Mesh.Ready)
            camera.viewAll()
    }
}

有时在渲染模型时,其边缘往往会超出父窗口的边界。通常会在根Scene3D中添加一些anchors.margins。