QML 3D - изменить размер (развернуть / уменьшить) модели, отображаемой в пользовательском интерфейсе, для размещения в текущем окне - PullRequest
1 голос
/ 11 марта 2019

Я рендерил 3D-модель, используя Mesh, читая из файла .obj, и я пытаюсь динамически изменить ее размер, чтобы взять размеры родительского окна. Есть ли способ изменить размер объекта? В настоящее время, когда я запускаю приложение, модель занимает примерно половину высоты и одну треть ширины главного окна, и я не уверен, откуда оно берется.

Я пытался использовать viewportRect в ForwardRenderer, но это не изменило отображение. Я также пытался выяснить, возможно ли увеличение с помощью камеры, но из того, что я увидел в документах, коэффициент масштабирования нуждается в жестко запрограммированных целочисленных значениях, и снова мне нужно, чтобы он был динамическим.

Текущий дисплей выглядит так -

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 Ответ

1 голос
/ 11 марта 2019

Так что после долгих расспросов я нашел решение этой проблемы.Это довольно простой трюк.

Вам просто нужно добавить следующий код в Mesh, и он позаботится об изменении размера модели в содержащем его окне.

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

Иногда при рендерингеВ модели ее края стремятся выйти за границы родительского окна.Об этом обычно заботится добавление некоторых anchors.margins в корневой каталог Scene3D.

...