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