OpenGL教程翻译 第二十二课 使用Assimp加载模型

第二十二课 使用Assimp加载模型

原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载)

背景

到现在为止我们都在使用手动生成的模型。正如你所想的,指明每个顶点的位置和其他属性有点时候并不是十分方便。对于一个箱子、锥体和简单平面还好,但是像人们的脸怎么办?现实的商业应用和游戏中,程序中使用模型一般都是由美术人员通过如 Blender, Maya 或 3ds Max 等建模软件来解决这个问题。这些软件提供了高级的工具帮助他们创造很复杂的模型。模型完成后可以以不同格式的文件保存。文件中包含了这个模型的所有几何解释。这些文件可以被加载到一个游戏引擎(提供支持特定格式的引擎)里面,文件中的内容可用来填充到渲染所需要的顶点缓存和索引缓存中。使用这些专业的模型对于场景效果的提升是十分关键的。

自己开发解析器将耗费你很长的时间。如果你想从不同格式的模型文件中加载模型,你需要学习每一种格式然后为其开发一个特定的解释器。有些模型的格式简单,但是一些也很复杂,你最终可能花费很多时间在这些并不是 3D 设计的核心内容上。因此,这章介绍的内容就是使用外加的库负责从文件中解释和加载模型。

Open Asset Import Library,也称 Assimp,是一个可以处理许多 3D 格式的开源库,包括最受欢迎的二进制反码格式。它是跨平台的,可用于 Linux 和 Windows,非常容易使用和嵌入到以 C/C++ 程序中。

这课没有太多的理论。让我们直接去看如何使用 Assimp 库中提供的函数来导入 3D 模型。在开始之前,请先确认你已经从上面的链接安装了 Assimp。

代码

(mesh.h:50)
class Mesh
{
public:
Mesh();
~Mesh();
bool LoadMesh(const std::string& Filename);
void Render();
private:
bool InitFromScene(const aiScene* pScene, const std::string& Filename);
void InitMesh(unsigned int Index, const aiMesh* paiMesh);
bool InitMaterials(const aiScene* pScene, const std::string& Filename);
    void Clear();
 #define INVALID_MATERIAL 0xFFFFFFFF
    struct MeshEntry {
   MeshEntry();
   ~MeshEntry();
   bool Init(const std::vector& Vertices,
   const std::vector& Indices);
   GLuint VB;
   GLuint IB;
   unsigned int NumIndices;
   unsigned int MaterialIndex;
};
std::vector<MeshEntry> m_Entries;
std::vector<Texture*> m_Textures;
};

这个 Mesh 类是 Assimp 和 OpenGL 程序之间的接口。这个类使用一个文件名参数作为 LoadMesh() 函数的参数,借助于 Assimp 加载模型,然后我们对加载进的模型数据进行解析,并将这些模型数据填充到顶点缓存、索引缓存以及纹理对象。为了渲染 mesh,我们定义了 Render() 函数。Mesh 类的内部结构与 Assimp 加载模型的方法相匹配。Assimp 用一个 aiScene 对象来代表被加载的 mesh, aiScene 对象中封装了包含模型各部分的 mesh 结构体。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中使用OpenGL和Assimp加载骨骼动画,需要进行以下步骤: 1. 在Qt中使用OpenGL:首先,需要使用Qt的OpenGL模块来创建OpenGL窗口和上下文。可以使用Qt自带的QGLWidget类或者QOpenGLWidget类来创建OpenGL窗口。然后,需要在OpenGL上下文中加载Assimp导入的模型和动画数据。 2. 加载Assimp导入的模型使用Assimp库导入模型文件,并将所有顶点数据存储在内存中。Assimp库还提供了一些函数来访问模型的骨骼和动画数据。 3. 加载骨骼动画:使用Assimp库提供的函数来加载骨骼动画数据。这些数据通常包括关键帧和骨骼层次结构。可以使用这些数据来计算每个骨骼在每个时间步长中的变换矩阵。 4. 动画播放:将每个骨骼的变换矩阵应用于每个顶点,以在每个时间步长中更新动画。可以使用OpenGL的顶点着色器来执行此操作。 以下是一些代码示例,演示如何在Qt中加载Assimp导入的模型和动画数据,并将其渲染到OpenGL窗口中: ```cpp #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) { } void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); Assimp::Importer importer; const aiScene* scene = importer.ReadFile("model.dae", aiProcess_Triangulate | aiProcess_FlipUVs); // Load mesh data into VBOs ... // Load bone data into VBOs ... // Load animation data into VBOs ... } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); // Update animation ... // Render mesh ... } }; ``` 在上面的示例中,`initializeGL()`函数将加载模型和动画数据,并将它们存储在OpenGL缓冲区中。`paintGL()`函数将更新动画并呈现模型。这些步骤的具体实现将取决于您的应用程序需求和Assimp库的版本。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值