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'標簽