日期:2021年7月8日

Wavefront OBJ文件格式

一.一个四边形

下面是一个简单的四边形的.obj文件内容。

v -0.5 -0.5 0.0
v +0.5 -0.5 0.0
v +0.5 +0.5 0.0
v -0.5 +0.5 0.0
f 1 2 3 4

v标记

文件中每一行都由一个标记和一串数字组成。v表示顶点,前面以v开头的四行表示有四个顶点(vertex), 标记v后面包括三个数字,表示x、y、z三个分量。所以文件中描述了四个顶点,分别是(-0.5, -0.5, 0.0)(0.5, -0.5, 0.0)(0.5, 0.5, 0.0)(-0.5, 0.5, 0.0)

f标记

f开头的行,描述的是一个面(face),后面紧接着至少三个整数,数字表示的是前面定义的顶点的索引值。在示例文件中定义了四个顶点,f后面的1 2 3 4表示的正是前面的四个顶点,按照顶点的索引顺序并按照右手法则构成了一个面(face)。

所以,这个文件就是代表了一个简单的xy平面上长宽分别为1,中心在(0, 0, 0)的正方形。

二.复杂的几何结构

处理真实世界中一些复杂的物体时,往往会在OBJ文件中创建一些group简化文件结构,并添加material模拟更真实的效果。

g标记

当使用OBJ文件描述一个复杂的几何结构体时,创建group(组)会大大减少文件的复杂度。例如,一个小汽车有四个轮子、两扇门、排气管等等。在OBJ文件中,可以创建一些逻辑group代表一些组件。一个group定义也是以某一行开始,以g关键字开头,后接group名称。后面所有出现的几何定义都属于这个group,直到出现新的group定义。

v -0.5 -0.5 0.0
v +0.5 -0.5 0.0
v +0.5 +0.5 0.0
v -0.5 +0.5 0.0
...
g hood
f 1 2 3 4
...
f 96 97 98 99
g exhaust
f 100 102 103 104

上面定义了两个group,hoodexhaust

添加材质(Materials)

通常使用三维图形软件(例如blender)生成OBJ文件时,会一起生成一个MTL格式的文件。MTL文件是用来描述几何物体的材质属性的。在OBJ文件中有两个关键字行表示几何体使用的材质,这两个关键字是mtllibusemtl

下面是一个包含材质的obj文件内容:

mtllib example.mtl
v -0.5 -0.5 0.0
v +0.5 -0.5 0.0
v +0.5 +0.5 0.0
v -0.5 +0.5 0.0
...
usemtl mat1
f 1 2 3 4
...
f 96 97 98 99
usemtl mat2
f 100 102 103 104

mtllib

mtllib表示的是材质库,会指向一个MTL格式文件, 表示这个obj文件中的几何体使用的材质来自于指定的MTL文件。 上面的例子中mtllib example.mtl表示这个几何体材质文件是example.mtl。

usemtl

usemtl表示后续的几何模块使用的材质是usemtl指定的材质,直到指定新的material(新的usemtl出现)。 上面的例子有两行是以usemtl开头的。分别指定了材质mat1mat2, 对应example.mtl中的mat1mat2描述。

纹理坐标——vt

有纹理的描述,当然会存在纹理坐标。OBJ文件中,以vt开头行的表示纹理坐标,后接x、y、z分量。

v -0.5 -0.5 0.0
v +0.5 -0.5 0.0
v +0.5 +0.5 0.0
v -0.5 +0.5 0.0
vt 0.0 0.0 0.0
vt 1.0 0.0 0.0
vt 1.0 1.0 0.0
vt 0.0 1.0 0.0
f 1/1 2/2 3/3 4/4

类似v,示例中四个vt行表示(0, 0, 0)(1, 0, 0)(1, 1, 0)(0, 1, 0)四个纹理坐标。

有了纹理坐标,f标记的内容发生了一些变化。f后接着的索引值变成了1/1 2/2 3/3 4/4,每对值由两个索引值和一个斜杠描述。每对值表示的是v/vt(顶点坐标索引/纹理坐标索引),所以这里第二个分量,定义的是前面定义的纹理坐标的索引。

法向量-vn

OBJ文件也支持每个顶点法向量的描述,以vn开头的行表示一个顶点的法向量,也是有x、y、z三个分量组成。

v -0.5 -0.5 0.0
v +0.5 -0.5 0.0
v +0.5 +0.5 0.0
v -0.5 +0.5 0.0
vt 0.0 0.0 0.0
vt 1.0 0.0 0.0
vt 1.0 1.0 0.0
vt 0.0 1.0 0.0
vn 0.0 0.0 1.0
vn 0.0 0.0 1.0
vn 0.0 0.0 1.0
vn 0.0 0.0 1.0
f 1/1/1 2/2/2 3/3/3 4/4/4

上面的示例有四个vn定义的法向量,此时f的每个值变成了三个分量,分别对应v/vt/vn(顶点坐标索引/纹理坐标索引/法向量索引)。示例中的面的四个顶点的法向量索引值为1 2 3 4

face的定义比较灵活,vertex索引是必须包括的,但是vt和vn是可选的。

1/1/1 # 顶点索引为1,纹理坐标索引为1,法向量索引为1
1//1  # 顶点索引为1,法向量索引为1,不包括纹理坐标索引

继续阅读:MTL文件格式解析

附:参考资料

obj文档字段描述:http://paulbourke.net/dataformats/obj/

Wavefront OBJ File Format

(完)

留言(0
发表评论
邮箱地址不会被公开。*表示必填项。
评论(支持部分html标签)*
姓名*
站点