QML 3D — изменить размер (развернуть / уменьшить) модели, отображаемой в пользовательском интерфейсе, чтобы она помещалась в текущем окне

#qt #qml #qt3d

#qt #qml #qt3d

Вопрос:

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

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

Текущее отображение выглядит следующим образом —

скриншот

Вот мой код —

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. Привет, у меня есть очень похожий фрагмент кода, но я не могу открыть свое окно. Не могли бы вы поделиться своим main.cpp файл? @RahulChowdhury

2. Привет @Cjolsen06, извините, у меня больше нет с собой кода. В то время я работал над POC для моей предыдущей компании, с которой я больше не связан. Извините, что здесь ничем не могу помочь. Кроме того, не вникая подробнее в ваш код, я не могу больше комментировать, почему окно не отображается. Может быть, вы могли бы сделать новый пост, поделиться там своими фрагментами кода, и каждый сможет посмотреть?

Ответ №1:

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

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

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

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