OBJ文件是一種標準的3D模型文件格式,很適合用於3D軟件模型之間的互導。比如在3dsMax或LightWave中建了一個模型,想把它調到Maya裏面渲染或動畫,導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫,不過很多軟件需要通過插件才能做到這一點。
OBJ文件特點
(1)OBJ是一種3D模型文件,因此不包含動畫、材質特性、貼圖路徑、動力學、粒子等信息。
(2)OBJ文件主要支持多邊形(Polygons)模型。
雖然OBJ文件也支持曲線(Curves)、表面(Surfaces)、點組材質(Point Group Materials),但Maya導出的OBJ文件並不包括這些信息。
(3)OBJ文件支持三個點以上的面,這一點很有用。
(4)OBJ文件支持法線和貼圖座標。 在其它軟件中調整好貼圖後,貼圖座標信息可以存入OBJ文件中,這樣文件導入Maya後只需指定一下貼圖文件路徑就行了,不需要再調整貼圖座標了。
(5)OBJ文件不支持有孔的多邊形面。
(6)OBJ文件不包含面的顏色定義信息,不過可以引用材質庫,材質庫信息儲存在一個後綴是".mtl"的獨立文件中。關鍵字"mtllib"即材質庫的意思。
OBJ文件的前綴
OBJ文件以純文本的形式存儲了模型的頂點、法線和紋理座標和材質使用信息。
在OBJ文件中,每行的格式如下:前綴 參數1 參數2 參數3 ...
(前綴標識了這一行所存儲的信息類型。參數則是具體的數據。)
OBJ文件的前綴可以有:
v 表示本行指定一個頂點。此前綴後跟着3個單精度浮點數,分別表示該定點的X、Y、Z座標值
vt 表示本行指定一個紋理座標。此前綴後跟着兩個單精度浮點數。分別表示此紋理座標的U、V值
vn 表示本行指定一個法線向量。此前綴後跟着3個單精度浮點數,分別表示該法向量的X、Y、Z座標值
f 表示本行指定一個表面(Face)。一個表面實際上就是一個三角形圖元。此前綴行的參數格式後面將詳細介紹。
usemtl 此前綴後只跟着一個參數。該參數指定了從此行之後到下一個以usemtl開頭的行之間的所有表面所使用的材質名稱。該材質可以在此OBJ文件所附屬的MTL文件中找到具體信息。
mtllib 此前綴後只跟着一個參數。該參數指定了此OBJ文件所使用的材質庫文件(*.mtl)的文件路徑
以“#”開頭的表示註釋的前綴,以g開頭的表示組的前綴。這些前綴並不影響模型的外觀,可以忽略它們。
建立頂點索引
假設Indices:array of Integer是頂點索引數組,Vertices:array of TVertex是頂點數組,使用下面的代碼段就可以把整個頂點索引對應的所有三角形繪製出來:
procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);
var i :Integer;
begin
glBegin(GL_TRIANGLES);
for i := 0 to (High(Vertices)+1) div 3 -1 do
begin
glVertex3fv(@Vertices[Indices[i*3]]);
glVertex3fv(@Vertices[Indices[i*3+1]]);
glVertex3fv(@Vertices[Indices[i*3+2]]);
end;
glEnd;
end;
OBJ文件爲模型中所有的頂點、法線、紋理座標都建立起相應的索引,以節省更多的空間。
面可以使用負值索引,有時用負值索引描述面更爲簡便。
"f -4 -3 -2 -1"這句索引值"-3"表示從"f"這行往上數第3個頂點,
OBJ文件的結構
在一個OBJ文件中,首先有一些以v、vt或vn前綴開頭的行指定了所有的頂點、紋理座標、法線的座標。然後再由一些以f開頭的行指定每一個三角形所對應的頂點、紋理座標和法線的索引。在頂點、紋理座標和法線的索引之間,使用符號“/”隔開的。一個f行可以以下面幾種格式出現:
f 1 2 3
表示以第1、2、3號頂點組成一個三角形。
f 1/3 2/5 3/4
表示以第1、2、3號頂點組成一個三角形,其中第一個頂點的紋理座標的索引值爲3,第二個頂點的紋理座標的索引值爲5,第三個頂點的紋理座標的索引值爲4。
f 1/3/4 2/5/6 3/4/2
表示以第1、2、3號頂點組成一個三角形,其中第一個頂點的紋理座標的索引值爲3,其法線的索引值是4;第二個頂點的紋理座標的索引值爲5,其法線的索引值是6;第三個頂點的紋理座標的索引值爲6,其法線的索引值是2。
f 1//4 2//6 3//2
表示以第1、2、3號頂點組成一個三角形,且忽略紋理座標。其中第一個頂點的法線的索引值是4;第二個頂點的法線的索引值是6;第三個頂點的法線的索引值是2。
注意:文件中的索引值是以1作爲起點的,在渲染的時候應注意將從文件中讀取的座標值減去1。
OBJ文件的基本結構
點數據(Vertex data):
v 幾何體頂點 (Geometric vertices)
vt 貼圖座標點 (Texture vertices)
vn 頂點法線 (Vertex normals)
vp 參數空格頂點 (Parameter space vertices)
--------------------------------------------------------
自由形態曲線(Free-form curve)/表面屬性(surface attributes):
deg 度 (Degree)
bmat 基礎矩陣 (Basis matrix)
step 步尺寸 (Step size)
cstype 曲線或表面類型 (Curve or surface type)
--------------------------------------------------------
元素(Elements):
p 點 (Point)
l 線 (Line)
f 面 (Face)
curv 曲線 (Curve)
curv2 2D曲線 (2D curve)
surf 表面 (Surface)
--------------------------------------------------------
自由形態曲線(Free-form curve)/表面主體陳述(surface body statements):
parm 參數值 (Parameter values )
trim 外部修剪循環 (Outer trimming loop)
hole 內部整修循環 (Inner trimming loop)
scrv 特殊曲線 (Special curve)
sp 特殊的點 (Special point)
end 結束陳述 (End statement)
--------------------------------------------------------
自由形態表面之間的連接(Connectivity between free-form surfaces):
con 連接 (Connect)
--------------------------------------------------------
成組(Grouping):
g 組名稱 (Group name)
s 光滑組 (Smoothing group)
mg 合併組 (Merging group)
o 對象名稱 (Object name)
--------------------------------------------------------
顯示(Display)/渲染屬性(render attributes):
bevel 導角插值 (Bevel interpolation)
c_interp 顏色插值 (Color interpolation)
d_interp 溶解插值 (Dissolve interpolation)
lod 細節層次 (Level of detail)
usemtl 材質名稱 (Material name)
mtllib 材質庫 (Material library)
shadow_obj 投射陰影 (Shadow casting)
trace_obj 光線跟蹤 (Ray tracing)
ctech 曲線近似技術 (Curve approximation technique)
stech 表面近似技術 (Surface approximation technique)
MTL文件
材質庫中包含材質的漫射(diffuse),環境(ambient),光澤(specular)的RGB(紅綠藍)的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特徵。
newmtl:定義新的材質組。對應數據爲材質組名稱。
Ka,Kd,Ks,Ke:材質的環境(ambient),散射(diffuse),鏡面(specular),放射(emissive)參數。對應數據爲r,g,b,a。
Ns:材質的光亮度(shininess)。對應一個數據。
d,Tr:均可用於定義材質的Alpha透明度。對應一個數據。
sharpness,illum:材質的銳度(sharpness)和照明度(illumination)。對應一個數據。
Ni:材質的光密度(optical density)。對應一個數據。
Tf:材質的透射濾波(transmission filter)。對應數據爲r,g,b,a。(OSG中沒有讀取濾波文件的功能)
map_Ka,map_Kd,map_Ks:材質的環境(ambient),散射(diffuse)和鏡面(specular)貼圖。對應數據爲貼圖文件名稱。
refl:材質的反射屬性。OSG中沒有讀取其參數。