OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包。该格式已被其他3D图形应用供应商采纳,是一种被绝大多数普遍公认的格式。
OBJ文件格式为简单数据格式,它仅表现3D几何体,即顶点的位置、以顶点列表方式定义每个多边形的顶点、法向量和面的UV坐标,以及纹理顶点。顶点默认以逆时针方向存储,不必显式声明法向。
1. 文件格式
注释行以#号起首
# 这是注释
一个OBJ文件包含几类定义:
# 顶点列表,用(x,y,z[,w])坐标表示,w为可选
v 0.123 0.234 0.345 1.0
v ...
...
# 纹理坐标,用(u,v[,w])坐标表示,w为可选
vt 0.500 -1.352 [0.234]
vt ...
...
# 法向量,用(x,y,z)的形式,法向量非单位向量
vn 0.707 0.000 0.707
vn ...
...
# 面的定义详见下
f 1 2 3
f 3/1 4/2 5/3
f 6/4/1 3/5/3 7/6/5
f ...
...
2. 面的定义
面通过顶点列表、纹理及法向的索引来定义。定义多边形(诸如四边形)时可超过三张顶点/纹理/法向索引。OBJ文件也支持自由曲面,如NURB(非均匀有理B样条)。
有多种方式定义一个面,然而每行面定义语句都以f起首。
2.1 顶点
合法的顶点索引从1开始,对应于预先定义的顶点列表中相应的顶点元素。每个面可以包含三个以上元素。
f v1 v2 v3 v4 ...
2.2 顶点/纹理坐标
可选地,纹理坐标索引可以用来指定面的纹理坐标。在定义一个面时,如需为顶点索引添加纹理坐标索引,须在顶点索引之后附上纹理坐标索引,并用/号分隔。注意/号之前或之后都不允许有空格。合法的纹理坐标索引从1开始,对应于预先定义的纹理坐标列表中相应的元素。每个面可以包含三个以上元素。
f v1/vt1 v2/vt2 v3/vt3 ...
2.3 顶点/纹理坐标/法向
可选地,法向索引可以用来指定顶点的法向量。在定义一个面时,如需为顶点索引添加法向索引,须在纹理坐标索引之后附上法向索引,并用/号分隔。合法的法向索引从1开始,对应于预先定义的法向列表中相应的元素。每个面可以包含三个以上的元素。
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
2.4 顶点/法向
由于纹理坐标是可选的,在定义几何体时可以忽略,但在索引中不能少,所以顶点索引之后须画两道/,即//,再写上法向索引。
f v1//vn1 v2//vn2 v3//vn3 ...
3. 引用材质
用来描述多边形可视面貌的材质存储于外部.mtl文件中。.mtl文件可包含一至多个命名的材质。
mtllib [外部 .mtl 文件名]
...
命名的对象、多边形群组和材质群组通过以下标签指定:
o [对象名]
...
g [群组名]
...
usemtl [材质名]
...
材质名对应于外部.mtl文件中的已命名材质。每个标签应用于所有后续面,直到下一个同类型标签出现。如果当前材质定义中不包括纹理,则纹理坐标可以被忽略。
f v1//vn1 v2//vn2 v3//vn3
...
多边形之间的平滑描影由平滑群组控制。
s 1
...
# 平滑描影也可以取消。
s off
...
一个OBJ文件中可引用一个以上的外部MTL材质文件。
4. 相对和绝对索引
由于其列表结构,OBJ文件可以以绝对或相对列表位置引用顶点、法向等。绝对索引值以1为基准,相对索引值可以是负数。不过,不是所有的软件都支持后者,也有些软件在写格式时内置使用相对索引形式(由于这样便于在添加元素时不用重新计算顶点偏移等因素)。这些偶尔会造成不兼容。
5. 材质模板库(MTL)
在3D计算机图形学中,最为普遍的几何体交换文件格式之一就是OBJ,MTL文件则是其附属文件,用以描述几何体的表面描影属性。
尽管MTL格式被广泛使用,它已经过时,无法完全支持最新技术,诸如镜面贴图和视差贴图。然而,由于格式的开放和直观,不足之处可用定制MTL文件生成器轻易补完。
5.1 基础材质
单独一个.mtl文件包含多个材质。材质在文件中逐个定义,每一条语句以newmtl起首。
# 定义一个名为 'Colored'的材质
newmtl Colored
材质的阴影色(ambient color)用Ka声明。颜色用RGB定义,每条通道的值从0到1之间取。
Ka 1.000 1.000 1.000 # 白色
类似地,固有色(diffuse color)用Kd。
Kd 1.000 1.000 1.000 # 白色
高光色(specular color)用Ks。带权高光色则用高光系数Ns表示。
Ks 0.000 0.000 0.000 # 黑色(即关闭高光)
Ns 10.000 # 范围从0到1000
材质可以是透明的,即是说“溶解的”。与真透明度不同,其结果并不依赖于物体厚度。
d 0.9 # 有些用'd'实现
Tr 0.9 # 其他的用'Tr'
每个材质允许使用多照明模型。枚举如下:
0. 色彩开,阴影色关
1. 色彩开,阴影色开
2. 高光开
3. 反射开,光线追踪开
4. 透明: 玻璃开 反射:光线追踪开
5. 反射:菲涅尔衍射开,光线追踪开
6. 透明:折射开 反射:菲涅尔衍射关,光线追踪开
7. 透明:折射开 反射:菲涅尔衍射开,光线追踪开
8. 反射开,光线追踪关
9. 透明: 玻璃开 反射:光线追踪关
10. 投射阴影于不可见表面
illum 2
5.2 纹理贴图
带纹理材质使用如上相同的属性,并额外定义纹理贴图。
newmtl Textured
Ka 1.000 1.000 1.000
Kd 1.000 1.000 1.000
Ks 0.000 0.000 0.000
d 1.0
illum 2
map_Ka lenna.tga # 阴影色纹理贴图
map_Kd lenna.tga # 固有色纹理贴图 (多数情况下与其阴影色纹理贴图相同)
map_Ks lenna.tga # 高光色纹理贴图
map_d lenna_alpha.tga # alpha通道纹理贴图
map_bump lenna_bump.tga # 凹凸贴图
bump lenna_bump.tga # 也有用'bump'而非'map_Bump'标签