Skip to content Skip to footer

Wavefront OBJ文件格式#

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,hood和exhaust。

添加材质(Materials) #通常使用三维图形软件(例如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 #mtllib表示的是材质库,会指向一个MTL格式文件, 表示这个obj文件中的几何体使用的材质来自于指定的MTL文件。 上面的例子中mtllib example.mtl表示这个几何体材质文件是example.mtl。

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

纹理坐标——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

(完)

Copyright © 2088 世界杯德国巴西_世界杯为什么四年一次 - lynzzx.com All Rights Reserved.
友情链接