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中沒有讀取其參數。