现代opengl 设计 assimp 3D 模型加载库

本文介绍了如何使用Assimp库加载和解析3D模型,包括下载、编译Assimp,以及在OpenGL中应用3D模型的准备工作。Assimp支持多种3D文件格式,简化了导入和处理复杂模型的流程。
摘要由CSDN通过智能技术生成

本文介绍assimp 库的下载和编译,为我们用opengl 显示复杂3D 做准备。 前面模型库说明部分引用 https://learnopengl-cn.github.io/ 。

到目前为止的所有场景中,我们一直都在滥用我们的箱子朋友,但时间久了甚至是我们最好的朋友也会感到无聊。在日常的图形程序中,通常都会使用非常复杂且好玩的模型,它们比静态的箱子要好看多了。然而,和箱子对象不同,我们不太能够对像是房子、汽车或者人形角色这样的复杂形状手工定义所有的顶点、法线和纹理坐标。我们想要的是将这些模型(Model)导入(Import)到程序当中。模型通常都由3D艺术家在Blender3DS Max或者Maya这样的工具中精心制作。

这些所谓的3D建模工具(3D Modeling Tool)可以让艺术家创建复杂的形状,并使用一种叫做UV映射(uv-mapping)的手段来应用贴图。这些工具将会在导出到模型文件的时候自动生成所有的顶点坐标、顶点法线以及纹理坐标。这样子艺术家们即使不了解图形技术细节的情况下,也能拥有一套强大的工具来构建高品质的模型了。所有的技术细节都隐藏在了导出的模型文件中。但是,作为图形开发者,我们就必须要了解这些技术细节了。

所以,我们的工作就是解析这些导出的模型文件以及提取所有有用的信息,将它们储存为OpenGL能够理解的格式。一个很常见的问题是,模型的文件格式有很多种,每一种都会以它们自己的方式来导出模型数据。像是Wavefront的.obj这样的模型格式,只包含了模型数据以及材质信息,像是模型颜色和漫反射/镜面光贴图。而以XML为基础的Collada文件格式则非常的丰富,包含模型、光照、多种材质、动画数据、摄像机、完整的场景信息等等。Wavefront的.obj格式通常被认为是一个易于解析的模型格式。建议至少去Wavefront的wiki页面上看看文件格式的信息是如何封装的。这应该能让你认识到模型文件的基本结构。

总而言之,不同种类的文件格式有很多,它们之间通常并没有一

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值