首页 > 解决方案 > QML 3D - 更改 UI 中呈现的模型的大小(扩大/缩小)以适合当前窗口

问题描述

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

我曾尝试在 ForwardRenderer 中使用 viewportRect,但这并没有改变显示。我还试图弄清楚是否可以使用相机进行缩放,但从我在文档中看到的情况来看,缩放比例因子需要硬编码的整数值,我再次需要它是动态的。

现在的显示是这样的——

截屏

这是我的代码 -

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

标签: qtqmlqt3d

解决方案


因此,经过大量询问后,我找到了解决方案。这是一个相当简单的技巧。

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

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

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


推荐阅读