文章目录

  • 写在前面
  • Assimp
    • 模型加载库
    • 构建Assimp
  • 总结

写在前面

原文链接。原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题。

Assimp

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

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

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

总而言之,不同种类的文件格式有很多,它们之间通常并没有一个通用的结构。所以如果我们想从这些文件格式中导入模型的话,我们必须要去自己对每一种需要导入的文件格式写一个导入器。很幸运的是,正好有一个库专门处理这个问题。

模型加载库

一个非常流行的模型导入库是Assimp,它是Open Asset Import Library(开放的资产导入库)的缩写。Assimp能够导入很多种不同的模型文件格式(并也能够导出部分的格式),它会将所有的模型数据加载至Assimp的通用数据结构中。当Assimp加载完模型之后,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式,它都能够将我们从这些不同的文件格式中抽象出来,用同一种方式访问我们需要的数据。

当使用Assimp导入一个模型的时候,它通常会将整个模型加载进一个场景(Scene)对象,它会包含导入的模型/场景中的所有数据。Assimp会将场景载入为一系列的节点(Node),每个节点包含了场景对象中所储存数据的索引,每个节点都可以有任意数量的子节点。Assimp数据结构的(简化)模型如下:

  • 和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。
  • 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景对象中mMeshes数组中储存的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象节点中的mMeshes数组保存的只是场景中网格数组的索引
  • 一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。
  • 一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是非常简单的(见你好,三角形)。
  • 最后,一个网格也包含了一个Material对象(的索引),它包含了一些函数能让我们获取物体的材质属性,比如说颜色纹理贴图(比如漫反射和镜面光贴图)。

所以,我们需要做的第一件事是将一个物体加载到Scene对象中,遍历节点,获取对应的Mesh对象(我们需要递归搜索每个节点的子节点),并处理每个Mesh对象来获取顶点数据、索引以及它的材质属性。最终的结果是一系列的网格数据,我们会将它们包含在一个Model对象中。

构建Assimp

你可以在Assimp的下载页面中选择相应的版本。在写作时使用的Assimp最高版本为3.1.1。我们建议你自己编译Assimp库,因为它们的预编译库在大部分系统上都是不能运行的。如果你忘记如何使用CMake自己编译一个库的话,可以复习创建窗口小节。

构建Assimp时可能会出现一些问题,所以我会将它们的解决方案列在这里,便于大家排除错误:

  • CMake在读取配置列表时,不断报出DirectX库丢失的错误。报错如下:

这个问题的解决方案是安装DirectX SDK,如果你之前没安装过的话。你可以从这里下载SDK。

  • 安装DirectX SDK时,可能遇到一个错误码为s1023的错误。这种情况下,请在安装SDK之前根据这个先卸载C++ Redistributable package(s)。
  • 一旦配置完成,你就可以生成解决方案文件了,打开解决方案文件并编译Assimp库(可以编译为Debug版本也可以编译为Release版本,只要能工作就行)。
  • 使用默认配置构建的Assimp是一个动态库(Dynamic Library),所以我们需要包含所生成的assimp.dll文件以及程序的二进制文件。你可以简单地将DLL复制到我们程序可执行文件的同一目录中。
  • Assimp编译之后,生成的库和DLL文件位于code/Debug或者code/Release文件夹中。
  • 接着把编译好的LIB文件和DLL文件拷贝到工程的相应目录下,并在解决方案中链接它们。并且记得把Assimp的头文件也复制到你的include目录中(头文件可以在从Assimp中下载的include目录里找到)。

如果你仍遇到了未报告的错误,欢迎在评论区中寻求帮助。

如果你想让Assimp使用多线程来获得更高的性能,你可以使用Boost库来编译Assimp。你可以在它们的安装页面找到完整的安装介绍。

现在,你应该已经编译完Assimp库并将它链接到你的程序中了。下一步:导入漂亮的3D物体!

更新:鉴于文章中的链接已经丢失了,我在github上找到了Assimp的下载地址。

下载好第三个压缩包后开始用CMake构建Assimp,关于CMake的下载安装过程就不多说了,启动CMake:


然后点击左下角的Configure,选择IDE的版本:

点击Finish,等待一段时间:


等待生成完成,就可以在之前指定的目录下看到工程文件了:

因为CMake已经配置好了项目,所以我们直接点击Build Solution(生成解决方案)按钮(解决方案处右键即可看到)。生成完成后,可以在对文件夹下找到lib和dll文件:

接下来就是最终的配置和链接了,主要有以下两种方法:

这里使用第二种方法:

  • 把上面文件夹中的lib文件拷贝到对应目录下,在解决方案中(需要用到这个库的项目中)链接它。
  • 把Assimp的头文件也复制到你的include目录中(头文件可以在从Assimp中的include目录里找到,生成的include目录里面的内容也要复制过去)。
  • 把上面文件夹中的dll文件拷贝到exe的目录下,或者将其路径添加到系统环境变量中。
  • 设置项目的属性:包含目录、库目录、链接器的输入。

以下是图示:

  • 首先是lib文件:

  • 然后是头文件:


  • 然后是dll文件:

  • 在属性页添加包含目录(include)和库目录(lib),就是把上面提到的文件的路径加进去:

  • 最后需要在Linker(链接器)选项卡里的Input(输入)选项卡里添加要链接的库的文件名,就是那个lib文件的名字。

总结

细品这张图,对学习后面的内容有很大的帮助。

  • 和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。
  • 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景对象中mMeshes数组中储存的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象节点中的mMeshes数组保存的只是场景中网格数组的索引
  • 一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。
  • 一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是非常简单的(见你好,三角形)。
  • 最后,一个网格也包含了一个Material对象(的索引),它包含了一些函数能让我们获取物体的材质属性,比如说颜色纹理贴图(比如漫反射和镜面光贴图)。

要搞清楚模型、网格之间的关系:

  • 一个模型(通常)会包括多个网格。
  • 通常每个模型都由几个子模型/形状组合而成。组合模型的每个单独的形状就叫做一个网格(Mesh)。比如人型角色可以划分成头部、四肢等。
  • 一个网格是我们在OpenGL中绘制物体所需的最小单位(顶点数据、索引和材质属性)。

LearnOpenGL 模型加载—Assimp相关推荐

  1. QT+OpenGL模型加载 - Assimp

    QT+OpenGL模型加载 - Assimp 本篇完整工程见gitee:OpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主 模型加载 先来张图: 我们不大可能手 ...

  2. LearnOpenGL 模型加载—模型(二 绘制模型)

    文章目录 写在前面 和箱子模型告别 坑点 回到主题 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 和箱子模型告别 所以,让我们导入一个由真正的艺 ...

  3. 用Assimp模型加载库加载一个Crytek的游戏孤岛危机(Crysis)中的原版纳米装(Nanosuit)

    用这个例子来对GitHub上的LearnOpenGL教程前四个单元用到的所有自定义或者引入的各种头文件和资源进行一个总结,不得不说这个教程简直太美妙了. 这个模型是来自对GitHub上的LearnOp ...

  4. OpenGL Assimp模型加载库

    OpenGL Assimp库 前言 模型加载库 构建Assimp 前言 到目前为止的所有场景中,我们一直都在滥用我们的箱子朋友,但时间久了甚至是我们最好的朋友也会感到无聊.在日常的图形程序中,通常都会 ...

  5. 模型加载库 Assimp

    大家好,接下来将为大家介绍模型加载库 Assimp . 1.Assimp介绍 Assimp 全称为 Open Asset Import Library,可以支持几十种不同格式的模型文件的解析(同样也可 ...

  6. OpenGL模型加载之模型

    参考: https://learnopenglcn.github.io/03%20Model%20Loading/03%20Model/ 定义一个模型类 class Model {public:/* ...

  7. OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

    写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解.但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很 ...

  8. Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行

    Python时间序列模型推理预测实战:时序推理数据预处理(特征生成.lstm输入结构组织).模型加载.模型预测结果保存.条件判断模型循环运行 目录

  9. OpenGL OBJ模型加载.

    在我们前面绘制一个屋,我们可以看到,需要每个立方体一个一个的自己来推并且还要处理位置信息.代码量大并且要时间.现在我们通过加载模型文件的方法来生成模型文件,比较流行的3D模型文件有OBJ,FBX,da ...

  10. OpenGL模型加载和渲染

    OpenGL模型加载和渲染 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include "GL/g ...

最新文章

  1. Jenkins的环境部署
  2. 【20181102T2】飞越行星带【智商题+最小瓶颈路】
  3. orm java_Java 8 Friday:不再需要ORM
  4. ResultSetMetaData和ResultSet
  5. JAVA面试要点006---.net中的委托与java中的代理模式和委托
  6. rel=nofollow属性--seo
  7. 2000,XP中显示器和系统匹配的问题?
  8. 利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行
  9. windows7系统的“ .exe”图标显示不正常解决办法
  10. 游戏开发计划——数据元素设计(技能)
  11. 3D建模高手制作魔兽女精灵王教程,制作你心目中的角色,学会你也可以
  12. 微信公众号开发C#系列-12、微信前端开发利器:WeUI
  13. 开篮球馆需要什么_建立一个篮球馆需要什么!
  14. Javascript MVC —— View
  15. “音响”事件对国产豪华品牌车汽车厂商的警示
  16. 软件测试定义/过程/分类
  17. 3分钟快速搞懂Java的桥接方法
  18. 【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通
  19. 聚焦关键要素|打造智慧园区综合运营决策平台解决方案
  20. Vue根据生日计算年龄代码片段

热门文章

  1. 木瓜移动SaaS平台——木瓜大橙直击当下跨境电商企业出海六大痛点
  2. 你在为谁工作——IT帮深圳分站2019年3月线下活动回顾
  3. 计算机硬件acc作用,累加器A的主要作用是什么_一文解析累加器a和acc的区别
  4. 嵌入式单片机网络链路测试
  5. SQL round()函数
  6. python ffmpeg解码视频_利用python+ffmpeg合并B站视频及格式转换的实例代码
  7. excel--text(双坐标图表)
  8. Python中列表的常用方法总结
  9. 双频wifi是什么意思 双频wifi好处有哪些
  10. 2017年CSTQB/ISTQB认证考试时间表