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

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM