【three.js :3D】obj+mtl中大部分引數的含義解析(轉載)+自己補充的。
另一個參考:convert_obj_three.py指令碼中,作者對一些引數的解析。【其實這篇轉載的內容後半部分和.py指令碼內容相對應】
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
我的補充:
=============================================
mtl中的Ke 0.1453 0.1453 0.1453 :
含義:可以理解為材質的發射出的光線強度?顏色?。與ka ,kd ,ks之間由一定的聯絡。
mtl中的Tf : Tf 0.4286 0.4286 0.4286 Tr : 0.5714
與Tr + Tf = 1.00 ,表示的是材質的透明程度,Tf :1.0000表示完全不透明。
=============================================
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'標籤
另一篇文章:
材質庫檔案的基本結構:
newmtl mymtl_1
紋理貼圖定義
反射貼圖定義
newmtl Material__2233374
Ns 10.000000
//反射指數 Ns exponent 指定材質的反射指數,定義了反射高光度。 exponent是反射指數值,該值越高則高光越密集,一般取值範圍在0~1000
Ni 1.500000
//Ni ptical density 指定材質表面的光密度,即折射值。 ptical density是光密度值,可在0.001到10之間進行取值。若取值為1.0,光在通過物體的時候不發生彎曲。玻璃的折射率為1.5。取值小於1.0的時候可能會產生奇怪的結果,不推薦。
d 1.000000
//d factor表示物體融入背景的數量,取值範圍為0.0~1.0,取值為1.0表示完全不透明,取值為0.0時表示完全透明
Tr 0.000000
Tf 1.000000 1.000000 1.000000
// Tf r g b 濾光透射率
illum 2
//illum illum_# 指定材質的光照模型
Ka 0.588000 0.588000 0.588000
//ka 環境反射:Ka r g b ——用RGB顏色值來表示,g和b兩引數是可選的,如果只指定了r的值,則g和b的值都等於r的值。三個引數一般取值範圍為0.0~1.0,在此範圍外的值則相應的增加或減少反射率;
Kd 0.588000 0.588000 0.588000
//漫反射 Kd r g b
Ks 0.000000 0.000000 0.000000
//鏡面反射:Ks r g b
Ke 0.000000 0.000000 0.000000
map_Ka map\F1.jpg
//map_Ka -options args filename 為環境反射指定顏色紋理檔案(.mpc)或程式紋理檔案(.cxc),或是一個位圖檔案。在渲染的時候,Ka的值將再乘上map_Ka的值。
map_Kd map\F1.jpg
//map_Kd -options args filename 為漫反射指定顏色紋理檔案(.mpc)或程式紋理檔案(.cxc),或是一個位圖檔案。作用原理與可選引數與map_Ka同