当前位置:   article > 正文

Qt编译Assimp_qt assimp

qt assimp

一、前言

到目前为止,我们在OpenGL中一直是在跟容器盒子打交道,有些许的枯燥。

我们也可以导入别人搭建好的、漂亮的模型,因此,我们的工作就是去解析这些导出的模型文件,并将其中的模型数据存储为OpenGL能够使用的数据。

一个常见的问题是,导出的模型文件通常有几十种格式,不同的工具会根据不同的文件协议把模型数据导出到不同格式的模型文件中。

  • 有的模型文件格式只包含模型的静态形状数据和颜色、漫反射贴图、高光贴图这些基本的材质信息,比如Wavefront的.obj文件。
  • 而有的模型文件则采用XML来记录数据,且包含了丰富的模型、光照、各种材质、动画、摄像机信息和完整的场景信息等,比如Collada文件格式。
  • Wavefront的obj格式是为了考虑到通用性而设计的一种便于解析的模型格式。
  • 建议去Wavefront的Wiki上看看obj文件格式是如何封装的。这会给你形成一个对模型文件格式的一个基本概念和印象。

Assimp

现在市面上有一个很流行的模型加载库,叫做Assimp,全称为Open Asset Import LibraryAssimp可以导入几十种不同格式的模型文件(同样也可以导出部分模型格式)。只要Assimp加载完了模型文件,我们就可以从Assimp上获取所有我们需要的模型数据。Assimp把不同的模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型数据。

当导入一个模型文件时,即Assimp加载一整个包含所有模型和场景数据的模型文件到一个scene对象时,Assimp会为这个模型文件中的所有场景节点、模型节点都生成一个具有对应关系的数据结构,且将这些场景中的各种元素与模型数据对应起来。下图展示了一个简化的Assimp生成的模型文件数据结构:
在这里插入图片描述

  • 所有的模型、场景数据都包含在scene对象中,如所有的材质和Mesh。同样,场景的根节点引用也包含在这个scene对象中
  • 场景的根节点可能也会包含很多子节点和一个指向保存模型点云数据mMeshes[]的索引集合。根节点上的mMeshes[]里保存了实际了Mesh对象,而每个子节点上的mMesshes[]都只是指向根节点中的mMeshes[]的一个引用(译者注:C/C++称为指针,Java/C#称为引用)
  • 一个Mesh对象本身包含渲染所需的所有相关数据,比如顶点位置、法线向量、纹理坐标、面片及物体的材质
  • 一个Mesh会包含多个面片。一个Face(面片)表示渲染中的一个最基本的形状单位,即图元(基本图元有点、线、三角面片、矩形面片)。一个面片记录了一个图元的顶点索引,通过这个索引,可以在mMeshes[]中寻找到对应的顶点位置数据。顶点数据和索引分开存放,可以便于我们使用缓存(VBO、NBO、TBO、IBO)来高速渲染物体。(详见Hello Triangle)
  • 一个Mesh还会包含一个Material(材质)对象用于指定物体的一些材质属性。如颜色、纹理贴图(漫反射贴图、高光贴图等)

所以我们要做的第一件事,就是加载一个模型文件为scene对象,然后获取每个节点对应的Mesh对象(我们需要递归搜索每个节点的子节点来获取所有的节点),并处理每个Mesh对象对应的顶点数据、索引以及它的材质属性。最终我们得到一个只包含我们需要的数据的Mesh集合。

用建模工具构建物体时,美工通常不会直接使用单个形状来构建一个完整的模型。一般来说,一个模型会由几个子模型/形状组合拼接而成。而模型中的那些子模型/形状就是我们所说的一个网格。例如一个人形模型,美工通常会把头、四肢、衣服、武器这些组件都分别构建出来,然后在把所有的组件拼合在一起,形成最终的完整模型。一个网格(包含顶点、索引和材质属性)是我们在OpenGL中绘制物体的最小单位。一个模型通常有多个网格组成。


二、获取Assimp

推荐方式二,方式一卡死,下不动!

方式一:官网下载 https://assimp.sourceforge.net/main_downloads.html

在这里插入图片描述
方式二:GitHub下载 https://github.com/assimp/assimp/releases
在这里插入图片描述


三、编译Assimp

3.1、下载安装DirectX

下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=8109
在这里插入图片描述
下载好之后,直接双击运行安装即可。

3.2、CMake编译

在这里插入图片描述
我点击Configure之后报错了,说是CMake的版本太低了,至少要3.22,而我的CMake是3.15.5
在这里插入图片描述
CMake升级
CMD下输入如下指令:

choco upgrade cmake
  • 1

在这里插入图片描述
如果提示没有choco命令,则以管理者身份打开Power Shell,输入如下指令:

Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
  • 1
  • 2

这个命令会下载并安装Chocolatey。


重启CMake,发现版本变成3.29.2了,继续点击Configure
在这里插入图片描述
shit,又说我MinGW版本太低了,淦!
在这里插入图片描述
重新下一个低版本一点的Assimp,我下的是5.0.0
在这里插入图片描述
换了版本之后,继续点击Configure,如果出现红色项,就继续点击Configure,没有红色项,就点击Generate
在这里插入图片描述
最终卡在mingw32-make -j 8这编译一直不通过!!!


3.3、Qt编译

使用CMake编译一直不通过,索性就放弃CMake,直接用Qt Creator打开源码下的CMakeList.txt,【执行CMake】–>【构建】

尝试了好几个版本,只有这个版本编译成功了!!!

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在构建生成的文件夹中,按住Shift,鼠标右键,打开Power Shell,输入如下指令:

mingw32-make -j 8
  • 1

中间在51%的时候,在Link什么,一直卡住不动,按了一下Ctrl + c,然后继续开始编译了

在这里插入图片描述
在这里插入图片描述


四、QT链接Assimp库

1、将文件【编译文件夹/include/assimp/config.h】复制到【源码文件夹/include/assimp】文件夹中
在这里插入图片描述
2、将【源码文件夹/include】复制到工程文件夹中新建的Assimp文件夹中
在这里插入图片描述
3、把文件【编译文件夹/lib/libassimpd.dll.a】复制到【工程文件夹/Assimp】文件夹中
在这里插入图片描述
4、添加库
在这里插入图片描述
在这里插入图片描述
5、复制文件【编译文件夹/bin/libassimp-5d.dll】到工程可执行文件路径
在这里插入图片描述
6、测试,在工程中导入头文件,并创建一个变量,编译运行看看报不报错

#include <Assimp/Importer.hpp>

int main()
{
	......
	
	Assimp::Importer importer;
	
	......
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

编译通过则说明Assimp环境搭建成功

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/619105
推荐阅读
相关标签
  

闽ICP备14008679号