[toc]html
1、前言
最近用Qt3D作了一個三維顯示的項目,過程比較艱辛,主要是Qt3D這個庫雖然推出了有幾年,可是資料並很少,官方的例程比較少且大可能是QML的,雖然他自己是徹底支持C++的,而API 接口的文檔寫得又比較簡略,用的人少產生的資料就更少了,在google和stackoverflow 搜索相關問題也每每找不到答案,在作項目的過程當中我收集了不少資料,在這裏列出來分享給你們,同時歡迎你們找到好的相關資料在評論裏留言,我會更新到博客中。python
1.1 什麼是Qt3D
Qt3D 是Qt官方支持的3D實時渲染引擎,和Qt同樣幾乎支持全部平臺,對OpenGL pipeline進行了封裝,支持C++ 和腳本語言QML,甚至支持 python (pyQt和pySide), 目的是爲了讓開發者快速地開發出三維渲染的程序。與OSG、VTK和OGRE等相似,可是是Qt原生的,對於Qt開發來講兼容性會更好,能夠天然地使用Qt的信號-槽機制。git
Qt3D 具備如下基本特性:github
- 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會被修復。app
Qt3D 有兩種License: GNU LGPL v3協議和GNU GPL v2協議。框架
1.2 Qt3D 的利與弊
Qt3D 的利和弊我只能根據個人直觀體驗來寫,未必客觀,可是真實。ide
利:原生支持
- 若是你原本就在用Qt做爲GUI庫,那麼使用Qt3D將會得到徹底兼容的3D庫,而且不須要安裝額外的依賴,在移植的時候也很方便, 可使用Qt的信號-槽和事件機制
- 性能上號稱支持作遊戲引擎 near real-time simulation
- 工具庫相對很豐富了,相比純擼 OpenGL 來講仍是節省了很大的開發工做
- 和Qt一致的跨平臺能力
弊處:資料過少
- 相比與OSG、Unity3D庫這些成熟的庫來講不夠流行(可是原理是相通的)
- 資料過少,官方文檔和例程不夠充實(或許這也是廣大開發者加入開源社區的好機會)
- 若是不使用Qt做爲GUI框架,那麼單獨使用Qt3D彷佛又優勢沉重
最終建議是:若是你使用Qt開發,那麼使用Qt3D 將會很方便,不然,則不必。工具
2、學習建議
若是要使用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的網站, 同時有人用Qt3D 實現了 learnopengl 裏面的example[]learnopengl-qt3d(https://github.com/MidoriYakumo/learnopengl-qt3d]
- 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
- Qt3D 中使用着色器 Shader
2.2.5 源碼
-
qt3d-example KDAB 官方例程
-
qt3d 源碼,Github上有源碼(下面這個鏡像在網頁端支持代碼跳轉!)
qt3d -
Qt3D Editor 一個能夠用來實驗 mesh + camera + transform + render 效果的。主要由QML寫得,核心類是由Cpp寫得。下面是效果。
原文出處:https://www.cnblogs.com/sunchaothu/p/11141212.html