下面是一个简单的四边形的.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开头的四行表示有四个顶点(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
开头的行,描述的是一个面(face),后面紧接着至少三个整数,数字表示的是前面定义的顶点的索引值。在示例文件中定义了四个顶点,f后面的1 2 3 4表示的正是前面的四个顶点,按照顶点的索引顺序并按照右手法则构成了一个面(face)。
所以,这个文件就是代表了一个简单的xy平面上长宽分别为1,中心在(0, 0, 0)
的正方形。
处理真实世界中一些复杂的物体时,往往会在OBJ文件中创建一些group简化文件结构,并添加material模拟更真实的效果。
当使用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,hood和exhaust。
通常使用三维图形软件(例如blender)生成OBJ文件时,会一起生成一个MTL格式的文件。MTL文件是用来描述几何物体的材质属性的。在OBJ文件中有两个关键字行表示几何体使用的材质,这两个关键字是mtllib
和usemtl
。
下面是一个包含材质的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
表示的是材质库,会指向一个MTL格式文件, 表示这个obj文件中的几何体使用的材质来自于指定的MTL文件。 上面的例子中mtllib example.mtl
表示这个几何体材质文件是example.mtl。
usemtl
表示后续的几何模块使用的材质是usemtl指定的材质,直到指定新的material(新的usemtl出现)。 上面的例子有两行是以usemtl开头的。分别指定了材质mat1
和mat2
, 对应example.mtl中的mat1
和mat2
描述。
有纹理的描述,当然会存在纹理坐标。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
(顶点坐标索引/纹理坐标索引
),所以这里第二个分量,定义的是前面定义的纹理坐标的索引。
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/
(完)