程序运行截图如下:
还是动的。
官方出这篇博文的目的是如何教我们使用Qt Quick 3D去渲染简单的场景。
首先是设置其场景。
在main.qml文件中设置整个场景,导入QtQuick3D组建,用于使用各种3D数据类型:
import QtQuick3D 1.14
Window {
id: window
width: 1280
height: 720
visible: true
View3D {
id: view
anchors.fill: parent
//! [environment]
environment: SceneEnvironment {
clearColor: "skyblue"
backgroundMode: SceneEnvironment.Color
}
//! [environment]
//! [camera]
PerspectiveCamera {
position: Qt.vector3d(0, 200, -300)
rotation: Qt.vector3d(30, 0, 0)
}
//! [camera]
//! [light]
DirectionalLight {
rotation: Qt.vector3d(30, 70, 0)
}
//! [light]
//! [objects]
Model {
position: Qt.vector3d(0, -200, 0)
source: "#Cylinder"
scale: Qt.vector3d(2, 0.2, 1)
materials: [ DefaultMaterial {
diffuseColor: "red"
}
]
}
Model {
position: Qt.vector3d(0, 150, 0)
source: "#Sphere"
materials: [ DefaultMaterial {
diffuseColor: "blue"
}
]
SequentialAnimation on y {
loops: Animation.Infinite
NumberAnimation {
duration: 3000
to: -150
from: 150
easing.type:Easing.InQuad
}
NumberAnimation {
duration: 3000
to: 150
from: -150
easing.type:Easing.OutQuad
}
}
}
//! [objects]
}
}
定义了场景所处的环境。在这个例子中将background的颜色改成了‘skyblue’。
environment: SceneEnvironment {
clearColor: "skyblue"
backgroundMode: SceneEnvironment.Color
}
随后定义了场景中的相机。在此官方实例中使用了PerspectiveCamera充当相机,将相机向后移,这个后是指人倒退向后这个,并且给一个看的角度
PerspectiveCamera {
position: Qt.vector3d(0, 200, -300)
rotation: Qt.vector3d(30, 0, 0)
}
在画物体前,还需要一个光源去照,在物理里面,只有光照到物体上,反射的光进入眼睛才会有颜色,没有光就是一坨黑。
DirectionalLight {
rotation: Qt.vector3d(30, 70, 0)
}
其次是画简单的物体。
画一个用红色圆柱弄的圆盘,并且画一个球,这个球有一些动态效果
Model {
position: Qt.vector3d(0, -200, 0)
source: "#Cylinder"
scale: Qt.vector3d(2, 0.2, 1)
materials: [ DefaultMaterial {
diffuseColor: "red"
}
]
}
Model {
position: Qt.vector3d(0, 150, 0)
source: "#Sphere"
materials: [ DefaultMaterial {
diffuseColor: "blue"
}
]
SequentialAnimation on y {
loops: Animation.Infinite
NumberAnimation {
duration: 3000
to: -150
from: 150
easing.type:Easing.InQuad
}
NumberAnimation {
duration: 3000
to: 150
from: -150
easing.type:Easing.OutQuad
}
}
}
源码如下:
simple.pro
QT += quick quick3d-private
target.path = $$[QT_INSTALL_EXAMPLES]/quick3d/simple
INSTALLS += target
SOURCES += \
main.cpp
RESOURCES += \
qml.qrc
OTHER_FILES += \
doc/src/*.*
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtGui>
#include <QtQuick3D/private/qquick3dviewport_p.h>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QSurfaceFormat::setDefaultFormat(QQuick3DViewport::idealSurfaceFormat(4));
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick3D 1.14
Window {
id: window
width: 1280
height: 720
visible: true
View3D {
id: view
anchors.fill: parent
//! [environment]
environment: SceneEnvironment {
clearColor: "skyblue"
backgroundMode: SceneEnvironment.Color
}
//! [environment]
//! [camera]
PerspectiveCamera {
position: Qt.vector3d(0, 200, -300)
rotation: Qt.vector3d(30, 0, 0)
}
//! [camera]
//! [light]
DirectionalLight {
rotation: Qt.vector3d(30, 70, 0)
}
//! [light]
//! [objects]
Model {
position: Qt.vector3d(0, -200, 0)
source: "#Cylinder"
scale: Qt.vector3d(2, 0.2, 1)
materials: [ DefaultMaterial {
diffuseColor: "red"
}
]
}
Model {
position: Qt.vector3d(0, 150, 0)
source: "#Sphere"
materials: [ DefaultMaterial {
diffuseColor: "blue"
}
]
SequentialAnimation on y {
loops: Animation.Infinite
NumberAnimation {
duration: 3000
to: -150
from: 150
easing.type:Easing.InQuad
}
NumberAnimation {
duration: 3000
to: 150
from: -150
easing.type:Easing.OutQuad
}
}
}
//! [objects]
}
}