【五十四,模型加载-1 Assimp】
2019-12-31 本文已影响0人
Woodlouse
3D建模工具
常用的3D建模工具:
- Blender
- 3DS Max
- Maya
建模工具可以让艺术家创建复杂的形状,使用一种叫做UV映射(uv-mapping)的手段来贴图,建模工具在导出模型文件时自动生:
- 顶点坐标
- 顶点法线
- 纹理坐标
每一种建模工具导出的文件格式是不一样的,我们的工作是要解析不同的模型文件以及提取所有有用的信息,将它们存储为OpenGL能理解的格式。
Wavefrongt的.obj模型格式包含了:
- 模型数据
- 材质信息 - 模型颜色和漫反射/镜面光照贴图
Collada文件格式包含:
- 模型
- 光照
- 多种材质
- 动画数据
- 摄像机
- 完整的场景信息
总之,不同种类的文件格式有很多种,它们之间没有一个通用的结构,幸运的是,有一个库专门处理模型文件的解析。
模型加载库
一个非常流行的模型导入库是Assimp,它是Open Asset Import Library的缩写。Assimp能导入很多种不同的模型文件格式,它将素有的模型数据加载至Assimp的通用数据结构中,Assimp会将场景载入为一系列的节点,每个节点包含了场景对象中所储存数据的索引,每个节点都可以有任意数量子节点,数据结构如下:

- 所有的场景/模型数据都包含在Scene对象中,Scene也包含了场景根节点的引用;
- 场景根节点可能包含子节点,它会有一些列指向场景对象中mMeshes数组中储存的网格数据的索引;
- 一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。
- 一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。
- 一个网格也包含了一个Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图)。
我们需要做的第一件事是把一个模型加载到Scene对象中,遍历节点,获取对应的Mesh对象,并处理每个Mesh对象来获取顶点数据、索引以及它的材质属性。最终的结果是一系列的网格数据,我们会将它们包含在一个Model对象中。