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)。

 1 #include <Qt3DQuickExtras/qt3dquickwindow.h>
 2 #include <QGuiApplication>
 3  
 4 int main(int argc, char* argv[])
 5 {
 6     QGuiApplication app(argc, argv);
 7     Qt3DExtras::Quick::Qt3DQuickWindow view;
 8     view.setSource(QUrl("qrc:/main.qml"));
 9     view.show();
10  
11     return app.exec();
12 }

4. 修改main.qml文件,全部清空,然后使用下面的代码。

 1 import QtQuick 2.2 as QQ2
 2 import Qt3D.Core 2.0
 3 import Qt3D.Render 2.0
 4 import Qt3D.Input 2.0
 5 import Qt3D.Extras 2.0
 6  
 7 Entity {
 8     id: sceneRoot
 9  
10     Camera {
11         id: camera
12         projectionType: CameraLens.PerspectiveProjection
13         fieldOfView: 45
14         aspectRatio: 16/9
15         nearPlane : 0.1
16         farPlane : 1000.0
17         position: Qt.vector3d( 0.0, 0.0, -40.0 )
18         upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
19         viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
20     }
21  
22     OrbitCameraController {
23         camera: camera
24     }
25  
26     components: [
27         RenderSettings {
28             activeFrameGraph: ForwardRenderer {
29                 clearColor: Qt.rgba(0, 0.5, 1, 1)
30                 camera: camera
31             }
32         },
33         // Event Source will be set by the Qt3DQuickWindow
34         InputSettings { }
35     ]
36 }

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程序就出来了。以后也可以把它作为一个模板,在这上面添加功能。


原文地址:https://www.cnblogs.com/ybqjymy/p/14376084.html