OpenGL加载模型-Assimp

一、简介
现在市面上有一个很流行的模型加载库,叫做Assimp,全称为Open Asset Import Library。Assimp可以导入几十种不同格式的模型文件(同样也可以导出部分模型格式)。只要Assimp加载完了模型文件,我们就可以从Assimp上获取所有我们需要的模型数据。Assimp把不同的模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型数据。
当导入一个模型文件时,即Assimp加载一整个包含所有模型和场景数据的模型文件到一个scene对象时,Assimp会为这个模型文件中的所有场景节点、模型节点都生成一个具有对应关系的数据结构,且将这些场景中的各种元素与模型数据对应起来。下图展示了一个简化的Assimp生成的模型文件数据结构:
在这里插入图片描述
所有的模型、场景数据都包含在scene对象中,如所有的材质和Mesh。同样,场景的根节点引用也包含在这个scene对象中
• 场景的根节点可能也会包含很多子节点和一个指向保存模型点云数据mMeshes[]的索引集合。根节点上的mMeshes[]里保存了实际了Mesh对象,而每个子节点上的mMesshes[]都只是指向根节点中的mMeshes[]的一个引用(译者注:C/C++称为指针,Java/C#称为引用)
• 一个Mesh对象本身包含渲染所需的所有相关数据,比如顶点位置、法线向量、纹理坐标、面片及物体的材质
• 一个Mesh会包含多个面片。一个Face(面片)表示渲染中的一个最基本的形状单位,即图元(基本图元有点、线、三角面片、矩形面片)。一个面片记录了一个图元的顶点索引,通过这个索引,可以在mMeshes[]中寻找到对应的顶点位置数据。顶点数据和索引分开存放,可以便于我们使用缓存(VBO、NBO、TBO、IBO)来高速渲染物体。
• 一个Mesh还会包含一个Material(材质)对象用于指定物体的一些材质属性。如颜色、纹理贴图(漫反射贴图、高光贴图等)

所以我们要做的第一件事,就是加载一个模型文件为scene对象,然后获取每个节点对应的Mesh对象(我们需要递归搜索每个节点的子节点来获取所有的节点),并处理每个Mesh对象对应的顶点数据、索引以及它的材质属性。最终我们得到一个只包含我们需要的数据的Mesh集合。

二、构建Assimp
网格:
用建模工具构建物体时,美工通常不会直接使用单个形状来构建一个完整的模型。一般来说,一个模型会由几个子模型/形状组合拼接而成。而模型中的那些子模型/形状就是我们所说的一个网格。例如一个人形模型,美工通常会把头、四肢、衣服、武器这些组件都分别构建出来,然后在把所有的组件拼合在一起,形成最终的完整模型。一个网格(包含顶点、索引和材质属性)是我们在OpenGL中绘制物体的最小单位。一个模型通常有多个网格组成。
可以在Assimp的下载页面选择一个想要的版本去下载Assimp库,或者使用CMake编译一个库,详细操作可见:https://learnopengl.com/Getting-started/Creating-a-window
如果你想要让Assimp使用多线程支持来提高性能,你可以使用Boost库来编译 Assimp。最后链接Assimp到你的工程里去。
使用Assimp可以把多种不同格式的模型加载到程序中,但是一旦载入,它们就都被储存为Assimp自己的数据结构。我们最终的目的是把这些数据转变为OpenGL可读的数据,才能用OpenGL来渲染物体。

三、总结
本篇文章中,我们了解到了OpenGL加载模型-Assimp,接下来我们会对网格、模型进行深入的介绍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
加载骨骼动画需要使用到三个库:Qt、OpenGL以及Assimp。其中,Assimp是一个跨平台的开源库,可以用来加载多种3D模型格式,包括带有骨骼动画的模型。 首先,你需要通过Assimp加载模型数据。Assimp可以将模型数据加载到一个数据结构中,包括模型的顶点、法向量、纹理坐标、骨骼信息等。在加载模型数据时,需要指定Assimp的一些选项,比如加载模型时是否把模型的坐标系转换为OpenGL的坐标系。 加载完成模型数据后,需要对模型进行骨骼动画的计算。这个过程包括对骨骼的变换矩阵进行计算,以及对模型顶点的变换。这些计算都可以通过Assimp库提供的接口来完成。在计算骨骼变换矩阵时,需要使用到骨骼的层次结构信息。 最后,将计算完成的模型顶点数据和变换矩阵传递给OpenGL进行渲染即可。 下面是一个简单的示例代码: ```c++ #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: GLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { // 初始化OpenGL函数 initializeOpenGLFunctions(); // 加载模型数据 Assimp::Importer importer; const aiScene *scene = importer.ReadFile("model.dae", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace | aiProcess_LimitBoneWeights | aiProcess_GenSmoothNormals | aiProcess_JoinIdenticalVertices); // 计算骨骼动画 // ... // 渲染模型 // ... } void paintGL() override { // 渲染模型 // ... } }; ``` 当然,这只是一个简单的示例代码,实际上骨骼动画的计算和渲染都比较复杂,需要更多的代码来完成。但是,通过Assimp库提供的接口,可以方便地完成这些工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值