Qt5.11 Qt 3D入门(一)
最近工作中可能需要用到3D技术,虽然在工作中使用Qt的年限超过了十年,但对3D技术还是非常陌生的,有很多知识需要恶补。
研究了几天的Qt 3D,包括Qt 3D Studio,总算有了一些眉目,但需要恶补的知识还非常多,后面再说吧。
Qt 3D不仅可以使用C++来进行编程,更方便的还是使用Qt Quick,对于一个十几年都是用Widget来写界面的人,又是一个头大的事,虽然这应该说是一个更现代的方法,程序与界面分得更加清楚,但很多思维方法比较难转过弯来。其实说白了就是对它不熟,就不太愿意去用,用起来很别扭。
但现在要使用Qt 3D的话,还是逼着自己学一下吧。
1. 新建一个Qt Quick Application - Empty的工程,Qt Creator现在还没有Qt 3D的模板,只能任意拿一个最相近的模板来改啦。
没有特别要求的话,后面的设置都用默认也可以。
2. 修改.pro文件,主要加入3d的库支持,在任意位置加入下面一行
QT += 3dcore 3drender 3dinput 3dquick 3dlogic qml quick 3dquickextras 3dextras
3. 修改main.c文件,全部清空,然后使用下面的代码,以后有个模板就不需要改这些了。
Qt 3D使用Qt3DExtras::Quick::Qt3DQuickWindow作为程序的主窗口,加载qrc:/main.qml作为界面文件,进行显示。与QWidget和Qt Quick的方式非常类似,也非常简洁和优美。Qt3DExtras模块提供了一套编译好的用于开发Qt 3D程序的要素,当然,它仍然还在开发之中,随时可能会改变。这些要素包括实体(Entity)、材质(Materials)、模型(Meshes and Geometries)、相机(Camera Controllers)、窗口(Window)和渲染器(FrameGraphs)。
#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <QGuiApplication>
int main(int argc, char* argv[])
{
QGuiApplication app(argc, argv);
Qt3DExtras::Quick::Qt3DQuickWindow view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();
return app.exec();
}
4. 修改main.qml文件,全部清空,然后使用下面的代码。
import QtQuick 2.2 as QQ2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0
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 )
}
OrbitCameraController {
camera: camera
}
components: [
RenderSettings {
activeFrameGraph: ForwardRenderer {
clearColor: Qt.rgba(0, 0.5, 1, 1)
camera: camera
}
},
// Event Source will be set by the Qt3DQuickWindow
InputSettings { }
]
}
QEntity是Qt3DCore::QNode的子类,可以集合多个Qt3DCore::QComponent实例,并由这些实例定义它的行为。本质上,QEntity只是一个空壳,它的行为由QComponent定义。Qt3D后端将解析和处理QEntity,识别有哪些QComponent,然后调用相应的aspect去执行,比如有的aspect专门处理QComponent的变形(Qt3DCore::QTransform),而另外有一个aspect专门处理鼠标事件(Qt3DInput::QMouseHandler)。
上面的代码定义了一个Camera和一个Renderer,Camera的参数定义了它是一个16:9,视角为45度,视点中心在原点,位置在(0,0,-40)的Camera;Render是一个ForwardRenderer,告诉我们按照普通前向渲染的方式进行,里面我们指定了一个刷新的颜色clearColor。ForwardRenderer是FrameGraph的默认实现,也是OpenGL传统使用的方式。它一次渲染一个物体对象,默认情况下,视窗占据整个屏幕,默认的颜色是白色。
5. 搞定,一个最简单的Qt 3D程序就出来了。以后也可以把它作为一个模板,在这上面添加功能。