(持续更新)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
  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

猜你喜欢

转载自www.cnblogs.com/sunchaothu/p/11141212.html