(持續更新)Qt3D 學習資源

行者孫發表於2019-07-05

一、前言

最近用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
  3. 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 原始碼,Github上有原始碼(下面這個映象在網頁端支援程式碼跳轉!)
    qt3d

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

image

相關文章