OpenGL学习(七)通过assimp库读取多种格式的模型
目录
- 前言
- obj 模型读取问题
- assimp 库简介
- 封装我们的网格对象
- 网格对象的最小需求
- draw 的实现
- bindData 的实现
- 封装模型对象
- load 函数的实现
- 加载模型!
- 完整代码
- c++
- 着色器
前言
上一篇回顾:OpenGL学习(六)纹理与obj格式模型的读取
好久没更新 OpenGL 系列了。这个月忙着搞图形学的大作业,发现需要用到读模型,而读取 obj 模型就很麻烦了,我是个终极懒狗,怎么可能会自己动手写模型解析器?于是直接下载别人写好的轮子来用了。
顺便提一句题外话,最近搞图形学大作业踩了个坑。关于法线的变换:
在等轴缩放的情况下,法线可以通过
模型矩阵 * 模型坐标系下的法线
来实现而如果我们执行的缩放不是等轴缩放,那么我们应该乘以 模型矩阵的逆矩阵的转置,而不是模型矩阵,来得到世界空间下的法向量。
而助教师兄师姐给的模板代码,直接乘以了模型矩阵,这在大部分情况下是正确的。
因为等轴缩放,模型矩阵是正交矩阵,那么,逆矩阵等于转置矩阵,我们直接乘即可。
注:
结论引自 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库读取多种格式的模型相关推荐
- OpenGL绘制罗纳尔多三维模型-Assimp库
本文主要讲解assimp库的使用. 先看效果-资源在文末 正视图: 后视图: 侧视图: 主要使用assimp库进行加载obj模型: 核心代码: 通过加载完的scene对象解析模型的数据: void l ...
- netcdf库读取nc格式文件中的字符串类型的数据
netcdf库读取nc格式文件 一.背景 二.工具使用 三.测试代码 四.测试结果 一.背景 这两天解析数据需要解析nc格式的文件,时间是字符串类型的,最开始还以为这个数据有问题呢,使用panoply ...
- OpenGL基础26:Assimp库
一.模型文件 游戏中有很多复杂的模型往往都是美术通过3D建模工具构建出来的,当然不是程序将顶点写死在代码里的,想想看一个简单的人物模型可能就有上千个顶点,这个时候按之前"生成木箱子" ...
- 使用Assimp库读取mtl文件数据
最近在使用opengl做学校的大作业,在读取模型时遇到了无法显示材质的问题,在通过研究obj与mtl文件格式时发现了原因. 由于之前一直是使用别人做好的读取类,对于有贴图的模型可以正常处理,但是这次的 ...
- 使用Assimp库读取mtl文件数据-光照模型Shader
最近在使用opengl做学校的大作业,在读取模型时遇到了无法显示材质的问题,在通过研究obj与mtl文件格式时发现了原因. 由于之前一直是使用别人做好的读取类,对于有贴图的模型可以正常处理,但是这次的 ...
- 使用pyxlsb库读取xlsb格式excel文件,转为DataFrame(详细)
.xlsb 格式是Binary格式存储的excel文件,比普通的xlsx文件的体积要小很多,在数据量极大的场景比较多用.对于这类格式,Pandas 自带的Excel库xlrt xlwt不支持,而通过p ...
- python读取多种格式文件(txt,csv,json,sqlite)
1.txt ①读取全部内容 txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', en ...
- 使用pygal.maps.world库读取JSON格式文件,显示世界人口地图图示
import json import pygal.maps.world #引入世界地图 from pygal_maps_world.i18n import COUNTRIES #引入世界个国家def ...
- OpenGL学习(九)阴影映射(shadowMapping)
目录 写在前面 阴影映射原理简介 封装 Camera 类 帧缓冲 阴影映射 准备工作 创建帧缓冲与深度纹理附件 从光源方向进行渲染 正常地渲染场景 如何查找bug(⚠重要) 多纹理传送 查看深度纹理数 ...
- Assimp库调用mtl加载obj模型
网上查阅了很多资料,通过测试都未通过,后来在两位大神博客的帮助下最终完成了obj及mtl的加载. 参考博客链接: OpenGL学习: uniform blocks(UBO)在着色器中的使用_arag2 ...
最新文章
- c++自底向上算符优先分析_PHP程序员从入门到佛系第十弹:PHP 运算符
- 经典C语言程序100例之七八
- android 讯飞语音评测,讯飞语音评测demo
- python记录程序运行时间的几种方法
- matlab绘图z=sin(x,用matlab编写函数文件,实现绘制函数 z= sin(x+y)/(x+y)在【-2:2,-2:2]的图像...
- 将Application按钮从任务栏中去掉
- 液滴型单细胞测序技术比较(二)
- 右军:为张逸《解构领域驱动设计》推荐序
- arcgis影像怎么去黑边_ArcGIS镶嵌数据集某些比例尺下显示黑白格解决方案
- 超低代码拓荒记 | 工业互联网新边疆
- afc系统服务器维护,自动售检票系统AFC中央系统维护员中级业务模型.PDF
- GCN、GAT、凸优化、贝叶斯、MCMC、LDA
- python中button中command_tkinter模块的button控件不点击也运行command
- 谷歌地球尝试验证时检测到错误_深思考丨验证码为何越来越难了?
- 小说阅读翻页分页实现思路
- android 实现ble蓝牙自动配对连接
- 判断字符串是否为回文的三种常用编程语言实现
- VS Code很好用的markdown插件
- TVS二极管选型指南
- 算法四:跳楼梯问题2
热门文章