LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中引入3D建模工具(3DModelingTool)可以让艺术家创建复杂的形状,并使用一种叫做UV映射(uv-mapping)的手段来应用贴图

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正

我写的项目地址:[https://github.com/liujianjie/LearnOpenGLProject

介绍Assimp

  • 引入

    3D建模工具(3D Modeling Tool)可以让艺术家创建复杂的形状,并使用一种叫做UV映射(uv-mapping)的手段来应用贴图。

    这些工具将会在导出到模型文件的时候自动生成所有的顶点坐标、顶点法线以及纹理坐标。

  • 需要读取这些工具导出的模型文件

    模型的文件格式有很多种,每一种都会以它们自己的方式来导出模型数据,自己写很麻烦。

    有Assimp库专门处理。

模型加载库Assimp

LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

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

Mesh网格

当使用建模工具对物体建模的时候,艺术家通常不会用单个形状创建出整个模型。通常每个模型都由几个子模型/形状组合而成。组合模型的每个单独的形状就叫做一个网格(Mesh)。

比如说有一个人形的角色:艺术家通常会将头部、四肢、衣服、武器建模为分开的组件,并将这些网格组合而成的结果表现为最终的模型。一个网格是我们在OpenGL中绘制物体所需的最小单位(顶点数据、索引和材质属性)。一个模型(通常)会包括多个网格

Assimp生成与使用

cmake编译assimp

  • github网址

    https://github.com/assimp/assimp/tree/v3.3.1

    找到release版本

  • 下载安装包

    请添加图片描述

  • 用cmake

    前提得有dx环境

    • 选择源码路径

      选择生成sln项目路径

      配置2019版本

      请添加图片描述

    • 点击generate

      LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

    • 打开build文件夹下的sln

      生成解决方案

      LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

    • 生成dll与lib

      LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

      LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

其他项目使用assimp库

  • 移动assimp的include到项目下vendor/Assimp下

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 项目包含include目录

    请添加图片描述

  • 使用assimp的头文件

    #include <assimp/Importer.hpp>
    #include <assimp/scene.h>
    #include <assimp/postprocess.h>
    
  • 运行,报错,缺少文件

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

    进入cmake编译的build文件夹下,找到include/config.h头文件,复制到项目的vendor/assimp/include/assimp下

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 写入以下代码并运行

    Assimp::Importer importer;
    const aiScene* scene = importer.ReadFile("assest/model/nanosuit/nanosuit.obj", aiProcess_Triangulate | aiProcess_FlipUVs);
    

    报错,无法找到解析符号,因为cpp中使用了assimp头文件中声明的的函数,却没找到函数的定义

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 将第一步生成的lib文件拷贝到vendor/Assimp/bin下

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 项目附加库目录

    请添加图片描述

  • 项目附加依赖项

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 运行

    会报无法找到dll。因为assimp生成动态库,会生成lib和dll两个文件,lib存的是dll的函数信息以及其在dll的位置

    LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中

  • 将第一步生成的dll拷贝到exe文件夹下

    请添加图片描述

  • 解释

    assimp库是动态库,会有两个文件

    • 有一个lib文件

      存储函数定义在dll中的位置,文件较小

    • 有一个dll文件

      存储函数定义,文件较大

今天的文章LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80738.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注