目录

  • 前言
  • obj 模型读取问题
  • assimp 库简介
  • 封装我们的网格对象
    • 网格对象的最小需求
    • draw 的实现
    • bindData 的实现
  • 封装模型对象
    • load 函数的实现
  • 加载模型!
  • 完整代码
    • c++
    • 着色器

前言

上一篇回顾:OpenGL学习(六)纹理与obj格式模型的读取

好久没更新 OpenGL 系列了。这个月忙着搞图形学的大作业,发现需要用到读模型,而读取 obj 模型就很麻烦了,我是个终极懒狗,怎么可能会自己动手写模型解析器?于是直接下载别人写好的轮子来用了。


顺便提一句题外话,最近搞图形学大作业踩了个坑。关于法线的变换:

  1. 在等轴缩放的情况下,法线可以通过 模型矩阵 * 模型坐标系下的法线 来实现

  2. 而如果我们执行的缩放不是等轴缩放,那么我们应该乘以 模型矩阵的逆矩阵的转置,而不是模型矩阵,来得到世界空间下的法向量。

而助教师兄师姐给的模板代码,直接乘以了模型矩阵,这在大部分情况下是正确的。

因为等轴缩放,模型矩阵是正交矩阵,那么,逆矩阵等于转置矩阵,我们直接乘即可。

注:
结论引自 szsszz 大佬的博客:http://blog.hakugyokurou.net/?p=1653

szsszz,我的超人!咚咚咚(磕头
Orz

当然如果你不需要在大作业中添加什么骚操作,比如光追或者 SSR,那么这个致命的 bug 可以忽略不计

obj 模型读取问题

还记得我们在上一篇博客:OpenGL学习(六)纹理与obj格式模型的读取 中是怎么读取 obj 模型的吗?我们直接读取其 v,vt,vn,f 信息,但是对于其他的信息,比如 usemtl,p 等标签,我们一概不管。

如果你尝试去下载互联网上的 obj 模型,你会发现,我们的代码几乎无法正常工作,这是因为 obj 模型的格式过于多样化,我们只是实现了其中一种特例的读取罢了。。。

我们默认模型只有三角面片,并且只有一张纹理。但是实际上我们下载下来的模型,不止一张纹理,并且被分为了不同的【网格】

注:
所谓网格,就是一组三角面片,一个模型可以有很多个网格。
因为模型的不同部分,往往有不同的纹理贴图,所以需要建模师人为地划分网格出来。
此外,网格的划分还涉及到一些模型动画的制作,这里不细

OpenGL学习(七)通过assimp库读取多种格式的模型相关推荐

  1. OpenGL绘制罗纳尔多三维模型-Assimp库

    本文主要讲解assimp库的使用. 先看效果-资源在文末 正视图: 后视图: 侧视图: 主要使用assimp库进行加载obj模型: 核心代码: 通过加载完的scene对象解析模型的数据: void l ...

  2. netcdf库读取nc格式文件中的字符串类型的数据

    netcdf库读取nc格式文件 一.背景 二.工具使用 三.测试代码 四.测试结果 一.背景 这两天解析数据需要解析nc格式的文件,时间是字符串类型的,最开始还以为这个数据有问题呢,使用panoply ...

  3. OpenGL基础26:Assimp库

    一.模型文件 游戏中有很多复杂的模型往往都是美术通过3D建模工具构建出来的,当然不是程序将顶点写死在代码里的,想想看一个简单的人物模型可能就有上千个顶点,这个时候按之前"生成木箱子" ...

  4. 使用Assimp库读取mtl文件数据

    最近在使用opengl做学校的大作业,在读取模型时遇到了无法显示材质的问题,在通过研究obj与mtl文件格式时发现了原因. 由于之前一直是使用别人做好的读取类,对于有贴图的模型可以正常处理,但是这次的 ...

  5. 使用Assimp库读取mtl文件数据-光照模型Shader

    最近在使用opengl做学校的大作业,在读取模型时遇到了无法显示材质的问题,在通过研究obj与mtl文件格式时发现了原因. 由于之前一直是使用别人做好的读取类,对于有贴图的模型可以正常处理,但是这次的 ...

  6. 使用pyxlsb库读取xlsb格式excel文件,转为DataFrame(详细)

    .xlsb 格式是Binary格式存储的excel文件,比普通的xlsx文件的体积要小很多,在数据量极大的场景比较多用.对于这类格式,Pandas 自带的Excel库xlrt xlwt不支持,而通过p ...

  7. python读取多种格式文件(txt,csv,json,sqlite)

    1.txt ①读取全部内容 txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', en ...

  8. 使用pygal.maps.world库读取JSON格式文件,显示世界人口地图图示

    import json import pygal.maps.world #引入世界地图 from pygal_maps_world.i18n import COUNTRIES #引入世界个国家def ...

  9. OpenGL学习(九)阴影映射(shadowMapping)

    目录 写在前面 阴影映射原理简介 封装 Camera 类 帧缓冲 阴影映射 准备工作 创建帧缓冲与深度纹理附件 从光源方向进行渲染 正常地渲染场景 如何查找bug(⚠重要) 多纹理传送 查看深度纹理数 ...

  10. Assimp库调用mtl加载obj模型

    网上查阅了很多资料,通过测试都未通过,后来在两位大神博客的帮助下最终完成了obj及mtl的加载. 参考博客链接: OpenGL学习: uniform blocks(UBO)在着色器中的使用_arag2 ...

最新文章

  1. c++自底向上算符优先分析_PHP程序员从入门到佛系第十弹:PHP 运算符
  2. 经典C语言程序100例之七八
  3. android 讯飞语音评测,讯飞语音评测demo
  4. python记录程序运行时间的几种方法
  5. matlab绘图z=sin(x,用matlab编写函数文件,实现绘制函数 z= sin(x+y)/(x+y)在【-2:2,-2:2]的图像...
  6. 将Application按钮从任务栏中去掉
  7. 液滴型单细胞测序技术比较(二)
  8. 右军:为张逸《解构领域驱动设计》推荐序
  9. arcgis影像怎么去黑边_ArcGIS镶嵌数据集某些比例尺下显示黑白格解决方案
  10. 超低代码拓荒记 | 工业互联网新边疆
  11. afc系统服务器维护,自动售检票系统AFC中央系统维护员中级业务模型.PDF
  12. GCN、GAT、凸优化、贝叶斯、MCMC、LDA
  13. python中button中command_tkinter模块的button控件不点击也运行command
  14. 谷歌地球尝试验证时检测到错误_深思考丨验证码为何越来越难了?
  15. 小说阅读翻页分页实现思路
  16. android 实现ble蓝牙自动配对连接
  17. 判断字符串是否为回文的三种常用编程语言实现
  18. VS Code很好用的markdown插件
  19. TVS二极管选型指南
  20. 算法四:跳楼梯问题2

热门文章

  1. 苹果电脑怎样禁用首字母自动大写?
  2. 剩余电流互感器互感电流放大转真有效值
  3. 自动控制原理分析工作原理以及方框图做题过程
  4. 云队友丨知乎10万赞回答:真正厉害的人,是怎么分析问题的?
  5. minimax算法和Alpha-Beta pruning实现英式跳棋
  6. 【Aspose for .NET】Aspose.word操作表格:在表格中插入行
  7. 星上SAR实时处理调研2-典型应用
  8. # 稳了github star突破9k即时通讯IM开源项目OpenIM版本发布-生产环境重点关注
  9. 一些比较好的国外IT网站
  10. CSS3科技雷达扫描动画js特效