制作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_v1
	Ns 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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐