Qt3D本身不依赖除QWindow外的其它模块,但是为了开发一个完整功能的应用程序,C++实现没有widget或QtQuick实现没有QQuickView则很难完成。我们以QtQuick应用为基础,则应用程序架构和普通的qml程序一样,只需要在qml中使用Scene3D元素加入3d内容即可。对于widget应用,需要在widget内创建一个QWindow,然后在QWindow内画图。
main.cpp
#include <QGuiApplication>
#include <QQuickView>
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QQuickView view;
view.resize(500, 500);
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:/main.qml"));
view.show();
return app.exec();
}
main.qml
import QtQuick 2.0
import QtQuick.Scene3D 2.0
Rectangle {
id: scene
anchors.fill: parent
color: "darkRed"
Scene3D {
id: scene3d
anchors.fill: parent
focus: true
aspects: "input"
AnimatedEntity {}
}
}
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import QtQuick 2.0 as QQ2
Entity {
id: sceneRoot
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
aspectRatio: 16/9
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 )
}
Configuration {
controlledCamera: camera
}
components: [
FrameGraph {
activeFrameGraph: Viewport {
id: viewport
rect: Qt.rect(0.0, 0.0, 1.0, 1.0) // From Top Left
clearColor: "transparent"
CameraSelector {
id : cameraSelector
camera: camera
ClearBuffer {
buffers : ClearBuffer.ColorDepthBuffer
}
}
}
}
]
PhongMaterial {
id: material
}
TorusMesh {
id: torusMesh
radius: 5
minorRadius: 1
rings: 100
slices: 20
}
Transform {
id: torusTransform
Scale { scale3D: Qt.vector3d(1.5, 1, 0.5) }
Rotate {
angle: 45
axis: Qt.vector3d(1, 0, 0)
}
}
Entity {
id: torusEntity
components: [ torusMesh, material, torusTransform ]
}
SphereMesh {
id: sphereMesh
radius: 3
}
Transform {
id: sphereTransform
Translate {
translation: Qt.vector3d(20, 0, 0)
}
Rotate {
id: sphereRotation
axis: Qt.vector3d(0, 1, 0)
}
}
QQ2.NumberAnimation {
target: sphereRotation
property: "angle"
duration: 10000
from: 0
to: 360
loops: QQ2.Animation.Infinite
running: true
}
Entity {
id: sphereEntity
components: [ sphereMesh, material, sphereTransform ]
}
}