制作3D模型的软件有很多,例如3D max, Blender, Maya等。于是就有很多模型文件格式。 例如.obj、.max、.fbx .3ds。 其中obj最简单,关键是,还可以文本方式打开,对窥探3D模型的数据格式比较有用。所以,我们这里用obj格式来说明3D模型文件。

objWavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,各大3D建模软件都支持,也很适合用于3D软件互相做格式转换。

obj文件需要搭配一个附属文件,叫mtl。全称就是material,也就是材质的意思。
怎么分工呢?
几何信息由.obj文件提供,材质信息由.mtl文件提供
啥是几何信息?就是顶点/纹理坐标,索引值等。 啥是材质信息?就是纹理用哪一张,光照参数用多少等等。

一个模型可以由多个子模型组成,每个子模型,称为网格(Mesh)。例如,一个人物模型,可以包括头和手,脚,衣服,道具等子模型。
所以obj文件,可以包含1个或者多个object对象。

同理,mtl文件也可以声明多种材质,比如衣服的材质,道具的材质等等。

好了,话不多说,开始来深入了解OBJ文件的结构。

OBJ 文件的结构

我们下载一个3D模型文件来具体打开看看。
有很多下载3D模型的网站,当然了,有兴趣,你也可以自己下载个软件画个模型。

网站例子:

https://free3d.com/3d-models/

我下载了一只可爱的小鸭子。

解压后,有3个文件:

mtl和obj都可以用文本编辑器打开。
我们打开第一个,并直接加一些注解如下:

# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 09.12.2011 14:44:16##chenxf: obj对应的mtl材质文件,一般放在同一级目录
mtllib 12248_Bird_v1_L2.mtl##chenxf: o开头,表示对象名称
o 12248_Bird_v1##chenxf: v开头,表示顶点
v  12.0437 -1.8030 28.0499
v  12.5763 -0.5349 27.5635
v  11.8189 0.5112 28.9634
....省略....
v  -2.0651 -8.0560 53.2951
v  -2.1582 -7.8612 53.3584
# 8758 vertices##chenxf:  vn开头, 顶点法向量
vn 0.8496 -0.1740 0.4978
vn 0.8701 -0.1437 0.4715
vn 0.7973 -0.0563 0.6009
....省略....
vn 0.9099 0.4028 0.0992
vn 0.9549 0.2840 0.0870
vn 0.8520 0.5001 0.1548
# 8685 vertex normals##chenxf: vt 开头,表示存放的是纹理坐标,三个数分别表示一个纹理坐标的(s,t,p)分量值,其中 p 分量一般用于 3D 纹理;
vt 0.3554 0.7424 0.0000
vt 0.3366 0.7172 0.0000
vt 0.3719 0.6891 0.0000
vt 0.3883 0.7135 0.0000
....省略....
vt 0.5612 0.6731 0.0000
vt 0.5779 0.6691 0.0000
vt 0.5904 0.6572 0.0000
# 9582 texture coords##chenxf: 组名称
g 12248_Bird_v1##chenxf: 使用哪个mtl
usemtl 12248_Bird_v1##chenxf: s开头,Smooth shading across polygons, 大于0表示开启平滑渲染
s 2##chenxf: f开头,face,表示存放的是一个三角面的信息,后面有三组数据分别表示组成三角面的三个顶点的信息,每个顶点信息的格式为:顶点位置索引/纹理坐标索引/法向量索引。
f 1/1/1 2/4801/2 3/2613/3 4/4804/4
f 2/4801/2 5/2/5 6/4802/6 3/2613/3
f 7/3/7 8/4803/8 3/2613/3 6/4802/6
f 8/4803/8 9/4/9 4/4804/4 3/2613/3
....省略....
f 8749/9171/8676 8700/2601/8627 8745/9170/8672 8758/4800/8685
f 8742/2611/8669 8741/9169/8668 8758/4800/8685 8745/9170/8672
f 8741/9169/8668 8738/2610/8665 8756/9176/8683 8758/4800/8685
# 8752 polygons

MTL材质文件

接下来,再打开mtl文件看看:

# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 09.12.2011 14:44:16##chenxf: 声明一个名字叫12248_Bird_v1的材质,obj文件usemtl需要用到
newmtl 12248_Bird_v1Ns 28.0000 # Ns 表示材质的反射指数,反射指数越高则高光越密集,取值范围在一般为 [0,1000]Ni 1.5000  # Ni 表示材质的折射值(折射率),一般取值范围是 [0.001,10] ,取值为 1.0,表示光在通过物体的时候不发生弯曲,玻璃的折射率为 1.5 d 1.0000   # d 表示材质的渐隐指数(通透指数),取值为 1.0 表示完全不透明,取值为 0.0 时表示完全透明Tr 0.0000  # Tr 表示材质的透明度(与 d 的取值相反),默认值为0.0(完全不透明)Tf 1.0000 1.0000 1.0000 # Tf 表示材质的滤光折射率,三维向量表示illum 2 # illum 表示材质的光照模型,范围0-10,这里2表示开启高光Ka 1.0000 1.0000 1.0000 # Ka 表示材质的环境光(Ambient Color)(r,g,b);Kd 1.0000 1.0000 1.0000 # Kd 表示材质的散射光(Diffuse Color)(r,g,b);Ks 0.2880 0.2880 0.2880 # Ks 表示材质的镜面光(Apecular Color)(r,g,b);Ke 0.0000 0.0000 0.0000 # Ke 表示材质的发射光,它与环境光,散射光和镜面光并存,代表材质发出的光量;map_Ka 12248_Bird_v1_diff.jpg # map_Ka 表示为材质的环境反射指定纹理文件(纹理采样值与环境光相乘作为输出颜色的一部分加权);map_Kd 12248_Bird_v1_diff.jpg # map_Kd 表示为材质的漫反射指定纹理文件# 还有map_Ke表示为材质的发射光指定纹理文件, map_d 表示为材质的透明度指定纹理文件, 这个例子不需要

注释已经写的很明白了。

另外,再次啰嗦一下,上面的例子虽然只有一个模型对象和一个材质。但再复杂一些的模型,是可以一个obj文件,声明多个子模型(即,网格)。 每个网格,也可以使用多个材质,材质也不要求一定有纹理图片。

不信请看我下载的另一个模型文件的obj和mtl的截图:

参考

NDK OpenGL ES 3.0 开发(二十):3D 模型
NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染
mtl dataformat

OBJ 模型文件与MTL材质文件 介绍相关推荐

  1. unity 导入obj后没有关联mtl材质

    今天测试发现自己导出的obj在unity中加载出来都是默认材质,没有引用到mtl文件. 下图中,右下角显示的是导出的obj,很明显都是默认的白色材质 然后再看下导出的mtl文件,都是没问题的. 再看下 ...

  2. obj文件和mtl文件格式说明

    以一个大理石地板的3d模型为例,如下图: 其包含三个文件,模型文件marble.obj,材质文件marble.mtl,及纹理贴图文件marble.png.obj构成了模型的主体,mtl为其材质,材质中 ...

  3. obj模型文件的格式

    obj模型的格式 带纹理的obj模型 mtl材质文件 推荐参考库文件 tiny_obj_loader assimp 带纹理的obj模型 一般带纹理的obj模型需要有以下三个文件,分别是.obj文件,. ...

  4. solidworks导出obj模型和mtl材质

    目录 0.使用STL格式中转 1.使用solidworks宏 2.使用opencascade软件+step格式中转 为何会有这种需求?因为大多数3D库,都支持导入obj模型和mtl材质,例如webGL ...

  5. DirectX的OBJ模型加载与渲染

    在之前的DirectX例子里我用的模型是.x文件,DirectX有一个方法D3DXLoadMeshFromX可以加载.x模型,但是这里有个问题,.x文件是没法用文本编辑器打开查看结构的,这里我来演示一 ...

  6. 【我的OpenGL学习进阶之旅】关于3D模型知识之:什么是obj文件和mtl文件

    文章目录 一.学习3D模型的背景 二.3D模型效果展示 三.好奇3D模型文件是啥内容? 3.1 打开.obj文件 3.2 打开.obj文件 3.3 在外部使用查看3D模型的软件打开.obj文件 3.3 ...

  7. C++写纹理贴图中OBJ文件和MTL(材质)文件

    在VTK 或者Opengl纹理贴图中都会用到模型文件,当使用vtkOBJImporter函数读取模型数据时,需要对应的MTL文件才能实现纹理贴图,但是网上大多数的OBJ文件和MTL文件都是由模型软件导 ...

  8. obj文件、mtl文件结构说明

    obj文件 obj文件是Alias|Wavefront公司开发的一种标准3D模型文件格式,适合用于3D软件模型之间的互导. obj文件是一种文本文件,可以直接用写字板打开进行查看.编辑和修改,由一行行 ...

  9. OBJ模型文件的结构、导入与渲染

    在[3DS文件结构的初步认识]中提及了3DS格式模型文件.固然3DS格式很常用,但OBJ格式的模型也是很常见的,于是咔嚓了一下心,熟悉了一下格式,并写了一个导入OBJ格式模型的类,顺便有此文.--Zw ...

  10. python 分离obj模型文件数据

    今天在分离.obj模型数据时,遇到一个问题,就是每行数据存在换行符,导致末尾添加的符号出现在下一行的行首.因此,需要先删除末尾的换行符,再添加符号. 知识点 replace(a,b) 将a替换为b,比 ...

最新文章

  1. LeetCode-字符串-反转字符串中的单词 II
  2. resource 注解下的name爆红
  3. html修改details范围,HTML details 标签
  4. Event Handling Guide for iOS——由触摸事件传递想到的
  5. 重名剔除(Deduplicate)
  6. 9.数据库服务器部署之------3步实现远程访问
  7. C++ 对象间通信框架 V2.0 ××××××× 之(五)
  8. kali linux nmap命令的使用
  9. 超浪漫-HTML5生日祝福网页制作 ❤粉色少女系列为你定制❤ HTML+CSS+JavaScript
  10. 迅为IMX8MM开发板Linux系统修改默认屏幕
  11. (未完待续)概率论学习笔记之假设检验
  12. 百度地图,坐标反查,拾取坐标位置
  13. 浅谈MES系统追溯功能五大关键作用
  14. 3D立体书架切换效果(一)
  15. 音乐播放器微信小程序开发-歌单界面(简陋版)
  16. 基于verilog的CRC校验(汇总)
  17. 敏涵·精致遮暇乳打造“新国妆”专场 致力新锐品牌强势“出圈”
  18. 设备管理——Spooling技术原理
  19. Timer定时器详解
  20. 批量修改文件后缀名(脚本)

热门文章

  1. ShuffleNet网络学习笔记
  2. NTP-网络时间协议
  3. MAC 配置svn比较工具diffmerge
  4. coap python_一步步搭建物联网系统——RESTful的CoAP协议
  5. 公众号运营工具有哪些?
  6. MyBatis 缓存原理梳理
  7. 特来电支付中心总体介绍
  8. 通过ARP查询目标路由器的MAC地址
  9. 企业微信的好处和功能介绍 | 最新企业微信电脑版下载
  10. 串口通讯---实现 PC 端之间串口连接传输文件