OpenGL学习笔记18-Assimp

Assimp

到目前为止,在所有的场景中,我们都和我们的容器朋友玩得很开心,但是随着时间的推移,即使是我们最好的朋友也会变得有点无聊。在较大的图形应用程序中,通常会有许多复杂而有趣的模型,这些模型看起来比静态容器漂亮得多。然而,与容器对象不同,我们不能真正手动定义所有的顶点、法线和复杂形状的纹理坐标,比如房屋、车辆或类人字符。我们想要的是,将这些模型导入到应用程序中;模型是由3D艺术家在Blender, 3DS Max或Maya等工具中精心设计的。Blender, 3DS Max or Maya.

这些所谓的3D建模工具允许艺术家创建复杂的形状,并通过一种称为uv-mapping的过程应用纹理。然后工具自动生成所有的顶点坐标、顶点法线和纹理坐标,同时将它们导出为我们可以使用的模型文件格式。这样,艺术家就有了一个广泛的工具包来创建高质量的模型,而不必太在意技术细节。所有的技术方面都隐藏在导出的模型文件中。作为图形程序员,我们确实需要关心这些技术细节。

我们的工作是解析这些导出的模型文件并提取所有相关信息,这样我们就可以以OpenGL能够理解的格式存储它们。一个常见的问题是有几十种不同的文件格式,每种格式都以自己独特的方式导出模型数据。模型格式的波阵面.objWavefront .obj只包含模型数据和次要材料信息,如颜色和扩散/镜面映射,而模型格式基于xml的Collada文件格式Collada file format 非常广泛,包含模型,灯光,许多类型的材料,动画数据,相机,完成场景信息,等等。波前对象格式通常被认为是一种易于解析的模型格式。建议至少访问一次Wavefront的wiki页面,看看这种文件格式的数据是如何构造的。这将使您对模型文件格式的一般结构有一个基本的了解。

总的来说,有许多不同的文件格式,它们之间通常不存在一个通用的结构。因此,如果我们想要从这些文件格式导入模型,我们必须自己为每个我们想要导入的文件格式编写一个导入器。对我们来说幸运的是,刚好有这样一个库。

A model loading library

一个非常流行的模型导入库叫做Assimp ,它代表开放资产导入库。通过将所有模型数据加载到Assimp的通用数据结构中,Assimp能够导入几十种不同的模型文件格式(以及导出到某些格式)。一旦Assimp加载了模型,我们就可以从Assimp的数据结构中检索所需的所有数据。因为Assimp的数据结构保持不变,无论我们导入的文件格式是什么类型,它都将我们从所有不同的文件格式中抽象出来。

当通过Assimp导入模型时,它会将整个模型加载到一个场景对象中,这个场景对象包含导入模型/场景的所有数据。Assimp有一个节点集合,其中每个节点包含存储在场景对象中的数据索引,每个节点可以有任意数量的子节点。Assimp的结构(简化)模型如下所示:

 

  • 场景/模型的所有数据都包含在场景对象中,比如所有的材质和网格。它还包含了对场景根节点的引用。
  • 场景的根节点可能包含子节点(像所有其他节点一样),并且可能有一组指向场景对象的mMeshes数组中的网格数据的索引。场景的mMeshes数组包含了实际的网格对象,一个节点的mMeshes数组中的值只是场景网格数组的索引。
  • 网格对象本身包含渲染所需的所有相关数据,例如顶点位置、法向量、纹理坐标、面和对象的材质。
  • 一个网格包含几个面。面代表对象的渲染原语(三角形、正方形、点)。面包含形成原语的顶点的索引。因为顶点和索引是分开的,这使得我们很容易通过索引缓冲区进行渲染(参见Hello Triangle)。
  • 最后,网格还链接到一个Material对象,该对象承载多个函数来检索对象的Material属性。想想颜色和/或纹理贴图(比如漫反射贴图和高光贴图)。

我们要做的是:首先将一个对象加载到场景对象中,然后递归地从每个节点中检索对应的网格对象(我们递归地搜索每个节点的子节点),然后处理每个网格对象以检索顶点数据、索引及其材质属性。结果就是我们想要包含在单个模型对象中的网格数据集合。

Mesh

在建模工具包中建模对象时,艺术家通常不会从单个形状创建整个模型。通常,每个模型都有几个子模型/形状,由它们组成。每一个单一的形状被称为网格。想象一个类人的角色:艺术家通常将头部、四肢、衣服和武器作为单独的组件建模,所有这些网格的组合结果代表最终的模型。单个网格是我们在OpenGL中绘制一个对象(顶点数据、索引和材质属性)所需要的最小表示。一个模型(通常)由几个网格组成。

在下一章中,我们将创建自己的模型和Mesh类,使用我们刚刚描述的结构来加载和存储导入的模型。如果我们想要绘制一个模型,我们不渲染整个模型,而是渲染所有由模型组成的独立网格。然而,在我们开始导入模型之前,我们首先需要在我们的项目中实际包含Assimp。

Building Assimp

您可以从其下载页面下载downloadAssimp并选择相应的版本。在本文中,使用的Assimp版本是版本3.1.1。建议您自己编译这些库,因为它们的预编译库并不总是在所有系统上工作。如果您忘记了如何通过CMake自己编译一个库,请查看创建窗口Creating a window这一章。

在构建Assimp的过程中会出现一些问题,所以我将在这里记下它们和它们的解决方案,以防你们中有人遇到同样的错误:

  • 当检索有关DirectX库丢失的配置列表时,CMake会不断地给出错误信息
    
    Could not locate DirectX
    CMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):
    Required library DirectX not found! Install the library (including dev packages) 
    and try again. If the library is already installed, set the missing variables 
    manually in cmake.
    
    这里的解决方案是安装DirectX SDK,以防以前没有安装它。您可以从这里here.下载SDK
  • 在安装DirectX SDK时,可能会弹出s1023的错误代码。在这种情况下,在安装SDK之前,您首先需要卸载c++可重新分发包。

 

一旦配置完成,您就可以生成一个解决方案文件,打开它,并编译库(作为发布版本或调试版本,随您的需要而定)。确保为64位编译,因为所有的LearnOpenGL代码都是64位的。

默认配置将Assimp构建为一个动态库,因此我们需要将结果DLL Assimp . DLL(或一些后修正)包含在应用程序二进制文件中。您可以简单地将DLL复制到应用程序可执行文件所在的相同文件夹中。

编译生成的解决方案之后,生成的库和DLL文件位于code/Debug或code/Release文件夹中。然后,只需将库和DLL移动到适当的位置,将它们从解决方案链接起来,并确保将Assimp的头文件复制到包含目录(头文件可以在从Assimp下载的文件的include文件夹中找到)。

到目前为止,您应该已经编译了Assimp并将其链接到您的应用程序。如果您仍然收到任何未报告的错误,请随时在评论中寻求帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值