目錄
一、前言
最近用Qt3D做了一個三維顯示的專案,過程比較艱辛,主要是Qt3D這個庫雖然推出了有幾年,但是資料並不多,官方的例程比較少且大多是QML的,雖然他本身是完全支援C++的,而API 介面的文件寫得又比較簡略,用的人少產生的資料就更少了,在google和stackoverflow 搜尋相關問題也往往找不到答案,在做專案的過程中我收集了很多資料,在這裡列出來分享給大家,同時歡迎大家找到好的相關資料在評論裡留言,我會更新到部落格中。
1.1 什麼是Qt3D
Qt3D 是Qt官方支援的3D實時渲染引擎,和Qt一樣幾乎支援所有平臺,對OpenGL pipeline進行了封裝,支援C++ 和指令碼語言QML,甚至支援 python (pyQt和pySide), 目的是為了讓開發者快速地開發出三維渲染的程式。與OSG、VTK和OGRE等類似,但是是Qt原生的,對於Qt開發來說相容性會更好,可以自然地使用Qt的訊號-槽機制。
Qt3D 具有以下基本特性:
- C++ 應用或者Qt Quick應用程式的 2D/3D 渲染
- Meshes 和 Geometry (Qt 中三維實體的組織形式,可以載入obj\mesh等物件 或者定義 opengl 中 vertex 集合)
- Materials 材質
- Shaders
- Shadow Mapping 陰影貼圖
- Ambient occlusion 環境光遮蔽
- 高動態範圍
- Deferred rendering 延遲渲染
- Multitexturing 多重紋理
- Instanced rendering
- Uniform Buffer Objects
還有 物理引擎、碰撞檢測和遊戲AI等。
Qt3D 主要由KDAB 設計、開發和維護,和Qt Company 由密切合作, Qt3D 模組整合在Qt5.5以後的版本中, 版本越高功能越完善且一些BUG會被修復。
Qt3D 有兩種License: GNU LGPL v3協議和GNU GPL v2協議。
1.2 Qt3D 的利與弊
Qt3D 的利和弊我只能根據我的直觀體驗來寫,未必客觀,但是真實。
利:原生支援
- 如果你本來就在用Qt作為GUI庫,那麼使用Qt3D將會獲得完全相容的3D庫,並且不需要安裝額外的依賴,在移植的時候也很方便, 可以使用Qt的訊號-槽和事件機制
- 效能上號稱支援做遊戲引擎 near real-time simulation
- 工具庫相對很豐富了,相比純擼 OpenGL 來說還是節省了很大的開發工作
- 和Qt一致的跨平臺能力
弊處:資料過少
- 相比與OSG、Unity3D庫這些成熟的庫來說不夠流行(但是原理是相通的)
- 資料過少,官方文件和例程不夠充實(或許這也是廣大開發者加入開源社群的好機會)
- 如果不使用Qt作為GUI框架,那麼單獨使用Qt3D似乎又優點沉重
最終建議是:如果你使用Qt開發,那麼使用Qt3D 將會很方便,否則,則沒必要。
二、學習建議
如果要使用Qt3D,那麼以下知識是必須的:
- Qt GUI框架,不管是C++或者QML
- OpenGL渲染管線的基本知識,或許不需要成為這方面專家,但是需要知道基本的pipeline。同時如果想開發高效能的3D程式,那麼OpenGL的底子還是要打牢。
- ECS 架構:Entity+Component System, Qt3D 中的任何一個實體由 Mesh + 材質構成;Mesh、材質都屬於 component。
Entity - mesh + material( + transform)
- (可選) QML/QtQucik
因為Qt3D 的大部分例子都是QML的(當然也有C++); 掌握QML有利於讀懂QML的示例程式碼;從而進行C++實現
2.1 OpenGL 學習資料
- https://learnopengl.com 非常有名的學習OpenGL的網站
- learnopengl 中文翻譯版 (https://learnopengl-cn.github.io)
掌握以下概念,差不多足夠Qt3D 入門使用 :
- OpenGL pipeline
- vertex, attribute,shader, transform ,camera,texture
2.2 Qt3D 資料
2.2.1 視訊資料
- introduction to Qt3D
- 與3D 實體互動的QT3D 教程,涉及的關鍵類(QObjectPicker)
Interact with 3D contents
2.2.2 PPT和部落格
https://ervin.ipsquad.net/slides/talks/ak2017-qt3d-advances/ak2017-qt3d-advances.pdf
https://www.kdab.com/wp-content/uploads/stories/Qt_3D_basics_whitepaper_Part2.pdf
https://www.kdab.com/wp-content/uploads/stories/qt3dinteraction.pdf
https://blog.qt.io/blog/2016/06/16/introducing-qt-3d/
2.2.3 教程
- 使用Qt3D 遊戲開發的一個例項,主要基於QML,需要一定的QML 基礎和OpenGL 基礎,這個例子也提供了一些參考連結。
http://ftp.jaist.ac.jp/pub/qtproject/learning/developerguides/gamedevelopmentqt3d/GameDevelopmentQt3D.pdf
2.2.4 問答
- 知乎 https://www.zhihu.com/question/48708879/answer/112235199
Qt3D 是 ECS(Entity-Component-System)架構;什麼是ECS架構
https://zhuanlan.zhihu.com/p/30538626補充:ECS的利弊
- ECS Pros:
- Avoids deep, wide, complex inheritance hierarchies
- Flexible – can change object behaviour at runtime (add/remove components)
- Extensible – add more component types later
- Qt 3D ECS is high performance by Aspects (Systems) offloading work to backend
- ECS Cons:
- Often new to OOP programmers – takes a while to adjust thinking
- More objects – Entity plus Components
- ECS Pros:
Qt3D 中使用著色器 Shader
2.2.5 專案原始碼
qt3d 原始碼,Github上有原始碼(下面這個映象在網頁端支援程式碼跳轉!)
qt3dQt3D Editor 一個可以用來實驗 mesh + camera + transform + render 效果的。主要由QML寫得,核心類是由Cpp寫得。下面是效果。