[OpengGL] 模型加载库Assimp[17]

您所在的位置:网站首页 丢失opencldll [OpengGL] 模型加载库Assimp[17]

[OpengGL] 模型加载库Assimp[17]

#[OpengGL] 模型加载库Assimp[17]| 来源: 网络整理| 查看: 265

英文原文:https://learnopengl.com/Model-Loading/Assimp

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

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

  我们的工作是解析这些导出的模型文件并提取所有相关信息,以便我们可以将它们存储为 OpenGL 可以理解的格式。 一个常见的问题是有几十种不同的文件格式,每种格式都以自己独特的方式导出模型数据。 Wavefront .obj 等模型格式仅包含模型数据和模型颜色和漫反射/高光贴图等次要材料信息,而基于 XML 的 Collada 文件格式等模型格式非常广泛,包含模型、灯光、多种材料、动画 数据、相机、完整的场景信息等等。 wavefront 对象格式通常被认为是一种易于解析的模型格式。 建议至少访问 Wavefront 的 wiki 页面一次,以查看此类文件格式的数据是如何构建的。 这应该让您对模型文件格式的一般结构有一个基本的了解。

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

模型加载库

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

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

在这里插入图片描述

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

  我们要做的是:首先将一个对象加载到 Scene 对象中,递归地从每个节点中检索相应的 Mesh 对象(我们递归地搜索每个节点的子节点),并处理每个 Mesh 对象以检索顶点数据、索引和 它的材料特性。 结果是我们想要包含在单个模型对象中的网格数据集合。

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

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

构建 Assimp

  您可以从他们的 GitHub 页面下载 Assimp 并选择相应的版本。 在撰写本文时,使用的 Assimp 版本是 3.1.1 版。 建议自己编译这些库,因为它们的预编译库并不总是适用于所有系统。 如果您忘记了如何通过 CMake 自行编译库,请查看创建窗口一章。

  在构建 Assimp 时可能会出现一些问题,所以我会在这里记录下它们及其解决方案,以防你们中的任何人遇到相同的错误:

CMake 在检索有关丢失的 DirectX 库的配置列表时不断出错,消息如下:

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,以防您之前没有安装过它。 您可以从此处下载 SDK。

安装 DirectX SDK 时,可能会弹出 s1023 错误代码。 在这种情况下,您首先要在安装 SDK 之前卸载 C++ Redistributable 包。

  配置完成后,您可以生成一个解决方案文件,将其打开并编译库(作为发布版本或调试版本,随您所愿)。 请务必针对 64 位编译它,因为所有 LearnOpenGL 代码都是 64 位的。

  默认配置将 Assimp 构建为一个动态库,因此我们需要将生成的名为 assimp.dll(或带有一些后修复)的 DLL 包含在应用程序的二进制文件中。 您只需将 DLL 复制到应用程序可执行文件所在的同一文件夹即可。

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3