QML 3D - 更改 UI 中呈现的模型的大小 (expand/reduce) 以适应当前 window
QML 3D - change size (expand/reduce) of model rendered in UI to fit in the current window
我正在通过读取 .obj 文件使用 Mesh 渲染 3D 模型,并且我正在尝试动态更改其大小以采用父 window 的尺寸。有没有办法调整对象的大小?目前,当我 运行 应用程序时,模型大约占主 window 高度的一半和宽度的三分之一,我不确定它是从哪里获取的。
我尝试在 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
}
}
}
所以在经过大量询问之后,我找到了解决这个问题的方法。这是一个相当简单的技巧。
您只需在 Mesh 中添加以下代码,它会负责调整包含 window.
的模型的大小
Mesh {
----
onStatusChanged: {
if(status == Mesh.Ready)
camera.viewAll()
}
}
有时在渲染模型时,其边缘往往会超出父对象的边界 window。在根 Scene3D 中添加一些 anchors.margins 通常可以解决这个问题。
我正在通过读取 .obj 文件使用 Mesh 渲染 3D 模型,并且我正在尝试动态更改其大小以采用父 window 的尺寸。有没有办法调整对象的大小?目前,当我 运行 应用程序时,模型大约占主 window 高度的一半和宽度的三分之一,我不确定它是从哪里获取的。
我尝试在 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
}
}
}
所以在经过大量询问之后,我找到了解决这个问题的方法。这是一个相当简单的技巧。
您只需在 Mesh 中添加以下代码,它会负责调整包含 window.
的模型的大小Mesh {
----
onStatusChanged: {
if(status == Mesh.Ready)
camera.viewAll()
}
}
有时在渲染模型时,其边缘往往会超出父对象的边界 window。在根 Scene3D 中添加一些 anchors.margins 通常可以解决这个问题。