(持續更新)Qt3D 學習資源


一、前言

最近用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 學習資料

**掌握以下概念,差不多足夠Qt3D 入門使用 **:

  1. OpenGL pipeline
  2. vertex, attribute,shader, transform ,camera,texture

2.2 Qt3D 資料

2.2.1 視頻資料

  1. introduction to Qt3D
  2. 與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 教程

  1. 使用Qt3D 游戲開發的一個實例,主要基於QML,需要一定的QML 基礎和OpenGL 基礎,這個例子也提供了一些參考鏈接。
    http://ftp.jaist.ac.jp/pub/qtproject/learning/developerguides/gamedevelopmentqt3d/GameDevelopmentQt3D.pdf

2.2.4 問答

  1. 知乎 https://www.zhihu.com/question/48708879/answer/112235199
  2. 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
  1. Qt3D 中使用着色器 Shader

https://stackoverflow.com/questions/52836013/how-to-make-color-of-a-section-be-different-on-a-3d-object

2.2.5 源碼

  1. qt3d-example KDAB 官方例程

  2. qt3d 源碼,Github上有源碼(下面這個鏡像在網頁端支持代碼跳轉!)
    qt3d

  3. learnopengl-qt3d

  4. Qt3D Editor 一個可以用來實驗 mesh + camera + transform + render 效果的。主要由QML寫得,核心類是由Cpp寫得。下面是效果。

image


免責聲明!

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



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