一、Assimp
Assimp(Open Asset Import Library)是一个用于加载和处理三维模型数据的跨平台开源库。它支持许多常见的3D模型格式,包括OBJ、FBX、DAE(Collada)、STL等,使得开发者可以方便地将各种格式的3D模型加载到他们的应用程序中。
首先,Assimp会将所有的模型数据加载至Assimp的通用数据结构中。当Assimp加载完模型之后,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式,它都能够将我们从这些不同的文件格式中抽象出来,用同一种方式访问我们需要的数据。
当使用Assimp导入一个模型的时候,它通常会将整个模型加载进一个场景(Scene)对象,它会包含导入的模型/场景中的所有数据。Assimp会将场景载入为一系列的节点(Node),每个节点包含了场景对象中所储存数据的索引,每个节点都可以有任意数量的子节点。Assimp数据结构的(简化)模型如下:
- 所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。
- 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景对象中mMeshes数组中储存的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象,节点中的mMeshes数组保存的只是场景中网格数组的索引。
- 一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。
- 一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是非常简单的。
- 最后,一个网格也包含了一个Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图)。
所以,我们需要做的第一件事是将一个物体加载到Scene对象中,遍历节点,获取对应的Mesh对象(我们需要递归搜索每个节点的子节点),并处理每个Mesh对象来获取顶点数据、索引以及它的材质属性。最终的结果是一系列的网格数据,我们会将它们包含在一个Model
对象中。
二、构建
Assimp源码下载:点击跳转
直接用Qt Creator打开源码下的CMakeList.txt
,点击【构建】:
三、链接
1、新建assimp文件夹
2、将【源码文件夹/include】、【编译文件夹/include/】复制到【新建的assimp/】文件夹中
3、把文件【编译文件夹/lib/】复制到【新建的assimp/】文件夹中
4、复制文件【编译文件夹/bin/libassimp-5d.dll】到 【新建的assimp/lib】文件夹中
5、链接库到工程中
6、修改工程和代码如下:
#include "mainwindow.h"
#include <QApplication>
#include <Assimp/Importer.hpp>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Assimp::Importer importer;
MainWindow w;
w.show();
return a.exec();
}
最后编译,顺利运行就说明成功了!!
觉得有帮助的话,打赏一下呗。。