最近工作中可能需要用到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程序就出來了。以后也可以把它作為一個模板,在這上面添加功能。

