QT之OpenGL模型加载Assimp
1. Assimp
Assimp(Open Asset Import Library) 开发资产导入库
,主要用来将不同的模型数据进行数据结构统一化,使不同的3D模型数据结构能够通过Assimp
的转换后拥有统一的数据结构,使OpenGL可以方便的加载负载的模型。
Assimp
数据模型如下:
- Scene(场景)
所有的场景/模型数据都包含在场景对象中。场景对象也包含了场景根节点的引用。 - Mesh(网格)
Mesh
是绘制的基本单元。一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。 - Material(材质)
一个网格也包含了一个Material
对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图) - Node(节点)
Node
可能包含子节点,它会有一系列指向场景对象中mMeshes数组中储存的Mesh
数据的索引 - Face(面)
一个网格包含了多个面。面代表的是物体的渲染图元(三角形、方形、点)。一个面包含了组成图元的顶点的索引
根据上述数据结构,可归纳出其使用步骤如下:
- 第一件事是将一个物体加载到Scene对象中,遍历节点,获取对应的Mesh对象(我们需要递归搜索每个节点的子节点),并处理每个Mesh对象来获取顶点数据、索引以及它的材质属性
- 最终的结果是一系列的网格数据,将它们包含在一个Model对象中
2. Assimp使用
2.1 Assimp编译
步骤如下:
- 安装CMake
- 安装
Visual Studio 2019
- 下载Assimp源码
- 在
Assimp
源码目录下,使用cmake -S . -B ./build
命令生成Visual Studio 2019
的解决方案 - 打开
build
目录下的Assimp.sln
生成最终所需的Assimp
库文件
2.2 使用概述
根据上述流程,接下会核心处理两部分Mesh
和Model
。两者的关系是Model
包含Mesh
。
2.3 Mesh类
由于Mesh
是绘制的基本单元,所以Mesh
至少应该包含如下信息:
- 顶点数据
- 位置向量
- 法线向量
- 纹理坐标
- 绘制的数据索引
- 材质
- 纹理ID
- 纹理类型
同时Mesh
应该包含绘制图形的函数draw()
2.4 Model类
Model
类则负责将通过Assimp
将外部模型导入,并将所有的节点转换为Mesh
对象
3. Demo
Demo源码,实例结果如下: