目录

  • 0. 说明
  • 1. Assimp
    • 1.1 模型加载库
    • 1.2 构建Assimp

0. 说明

写本文的初衷是能够更好的让自己理解,同时便于日后查询,对有相同需求且过去完全没有接触过OpenGL的开发者来说,也许能提供一定的帮助。

目前学习OpenGL也许是最好的教程是来自Joey de Vries的LearnOpenGL,很幸运,该文章也有对应的中文版LearnOpenGL CN。因此文章绝大部分文字教程来自翻译Joey de Vries的LearnOpenGL CN,由于原文已经相当出色,并不需要过多修改(当然也没有那个水平),我仅根据原文增减成适合Qt开发的教程,读者也可以自行查看原文或翻译好的中文版。

如果查看目录,可以点击这里。

1. Assimp

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

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

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

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

1.1 模型加载库

一个非常流行的模型导入库是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对象中。

网格
当使用建模工具对物体建模的时候,艺术家通常不会用单个形状创建出整个模型。通常每个模型都由几个子模型/形状组合而成。组合模型的每个单独的形状就叫做一个网格(Mesh)。比如说有一个人形的角色:艺术家通常会将头部、四肢、衣服、武器建模为分开的组件,并将这些网格组合而成的结果表现为最终的模型。一个网格是我们在OpenGL中绘制物体所需的最小单位(顶点数据、索引和材质属性)。一个模型(通常)会包括多个网格。

在下一节中,我们将创建我们自己的Model和Mesh类来加载并使用刚刚介绍的结构储存导入后的模型。如果我们想要绘制一个模型,我们不需要将整个模型渲染为一个整体,只需要渲染组成模型的每个独立的网格就可以了。然而,在我们开始导入模型之前,我们首先需要将Assimp包含到我们的工程当中。

1.2 构建Assimp

============================= 待修改 ===============================
你可以在Assimp的下载页面中选择相应的版本。截止写作时官网的最新版本为5.2.0,而原教程使用的Assimp版本为3.1.1,这里为了和原教程统一,依然使用3.1.1版本。我们建议你自己编译Assimp库,因为它们的预编译库在大部分系统上都是不能运行的。如果你忘记如何使用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 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物体!
============================= 待修改 ===============================

Assimp(LearnOpenGL With Qt)相关推荐

  1. 你好,三角形(LearnOpenGL With Qt)

    目录 0. 说明 1. 你好,三角形 1.1 顶点输入 1.2 顶点着色器 1.3 编译着色器 1.4 片段着色器 1.5 链接顶点属性 1.6 索引缓冲对象 2. 练习 0. 说明 写本文的初衷是能 ...

  2. 材质(LearnOpenGL With Qt)

    目录 0. 说明 1. 材质 2. 设置材质 2.1 光的属性 2.2 不同的光源颜色 2.3 练习 0. 说明 写本文的初衷是能够更好的让自己理解,同时便于日后查询,对有相同需求且过去完全没有接触过 ...

  3. 【FCL学习第二讲】使用Assimp库导入外部模型碰撞检测

    测试模型 首先,使用Solidworks新建一个正方体,边长20mm,另存为stl格式 使用Assimp库Assimp - LearnOpenGL CN (learnopengl-cn.github. ...

  4. Qt 静态编译(5.15.2 MinGW 32-bit)

    Qt 静态编译(5.15.2 MinGW 32-bit) 文章目录 Qt 静态编译(5.15.2 MinGW 32-bit) 摘要 1 编译前准备 1.1 编译环境准备 系统环境 Qt 版本 gcc ...

  5. 交叉编译Qt5.9.6

    准备 主机平台:Ubuntu 16.04 LTS(x64)     目标平台:ARM40-A5D3     Qt版本:Qt5.9.6     tslib github     sqlite3     ...

  6. 树莓派安装Ubuntu22.04后使用X86_Linux交叉编译Qt5+opencv4

    文章目录 准备工作 环境搭建 准备编译 未完待续 准备工作 树莓派安装Ubuntu,直接从官网下载对应的镜像烧写工具下载地址,工具里面准备好了对应的镜像地址,直接烧写入SD卡就行了 进入系统,ubun ...

  7. QT+OpenGL模型加载 - Assimp

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

  8. qt使用assimp加载模型_有关Assimp与Qt3D

    有关Assimp与Qt3D 最近朋友们会向我提及有关Qt3D的问题,我这里统一地向大家分析一下,希望我自己的一点对Qt3D和Assimp库的一些看法对大家能够有所帮助. 原创文章,反对未声明的引用.原 ...

  9. Qt和OpenGL:使用Open Asset Import Library(ASSIMP)加载3D模型

    Qt和OpenGL:使用Open Asset Import Library(ASSIMP)加载3D模型 翻译自:https://www.ics.com/blog/qt-and-opengl-loadi ...

  10. qt使用assimp加载模型_iOS使用assimpKit加载FBX模型步骤详解

    研究背景 体积:一个.dae模型大概有1M那么大 而.fbx模型0.5M 现状 xcode现在不能直接读取.fbx模型 方案 1.使用assimpKit加载 2.使用Wish3D加载 结果 1.使用a ...

最新文章

  1. net use 命令集合详解
  2. “毕设导师互选系统”项目产品宣传推广方案
  3. Object类和常用的API
  4. linux下如何运行脚本程序设计,Uboot 如何运行脚本
  5. python两个列表匹配_Python:检查两个列表之间的字符串是否部分匹配
  6. Web3.0中国峰会将于7月在成都召开
  7. 一个将汉字转换成拼音的npm包
  8. Windows 环境下 onenote中表格插入行和列的问题
  9. ❤️❤️新生代农民工熬夜整理Python入门教程,包教包会!附源码❤️❤️
  10. 2015年国内数据安全事件盘点
  11. 土木工程计算机设计考试科目一模拟试题,科目一电脑模拟考试,原来这么简单,看完这个科一不用愁!...
  12. 最新最强短视频SDK——来自RDSDK.COM
  13. IT行业为何如此吃香?2019学习IT就业前景分析
  14. java集成阿里大于第三方平台发送短信验证码
  15. 鸿蒙系统体验报告,我雷某人摊牌了,鸿蒙2.0版本使用体验汇报
  16. Ubuntu下C语言程序编写与运行
  17. 扎心!原来在月薪3000和30000的差距竟是这样
  18. MySQL表连接查询
  19. 微信小程序分销系统有哪些营销模式?看完你就秒懂了!
  20. 树莓派PCA9685的舵机MG996R二度自由云台操控代码,搭配mqtt进行远程操控

热门文章

  1. 打开eclipse翻译错误值13 的解决办法
  2. 制作u盘winpe启动盘_u盘启动盘制作工具软件哪个好?
  3. 2019春计算机基础在线作业,2019春计算机基础在线作业100分
  4. SSM开发书评网25:写短评;
  5. HS0038红外接收模块遇到的问题
  6. 微众银行软件测试笔试题面试题
  7. 测试工程师如何渡过互联网寒冬
  8. 2022-2028年中国位置大数据行业市场专项调查及投资前景分析报告
  9. [匈牙利算法] 洛谷 P1640 连续攻击
  10. word 生成pdf_为什么Microsoft Word生成的PDF文件这么大?