#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.