http://hi.baidu.com/yiyibeibei/item/928b2660bea9652669105b82
0x4D4D是檔案頭,他的大小就是整個檔案的大小。
另外還有兩個主要塊,他們是3D編輯塊和主要畫面格塊:
0x3D3D:3D編輯塊,描述了3D對象的資料。3D對象就在這個地方。
0xB000:主要畫面格塊,描述了主要畫面格資料。
在某個主要塊之後有一些資料區塊。這些應該是其他一些允許在主要塊之內的資料(請參見圖表)。
0x3D3D的子塊:
ID 描述
0100 配置部分
1100 unknown
1200 背景色
1201 unknown
1300 unknown
1400 unknown
1420 unknown
1450 unknown
1500 unknown
2100 環境色
2200 霧?
2201 霧 ?
2210 霧 ?
2300 unknown
3000 unknown
3D3E 配置編輯塊
4000 對象資料區塊
AFFF 材質列表
3D3E配置編輯塊:
ID 描述
7001 視口指標
7011 視口定義( 類型 2 )
7012 視口定義( 類型 1 )
7020 視口定義( 類型 3 )
3D3E塊中有很多變態的資料,其中只有7020塊比較重要,這個塊定義了4個活動的視口。假設在編輯程式中使用了4個視口,編輯程式配置中包含5個7020塊和 5個7011塊。但是事實上只有開始的4個7020塊對使用者的視口外觀有影響,其他的裡面只包含一些附加資訊。該塊的第6,7位元組表明了視圖的類型,合法的ID以及其對應的視圖如下所示:
ID 描述
0001 頂
0002 底
0003 左
0004 右
0005 前
0006 後
0007 使用者
FFFF 攝象機
0009 光源
0010 無效
AFFF材質塊
定義了材質。其子塊A000定義了材質名稱。材質名稱是ASCLL字元,以0x00為結束符。
通常我們使用的都是Diffuse屬性定義的紋理
MAIN3DS (0x4D4D)
|
+--EDIT3DS (0x3D3D)
| |
| +--EDIT_MATERIAL (0xAFFF)
| +--0xA000 材質的名稱,這是一個以NULL結尾的字串,在該檔案中是唯一
| 的,可以用它標誌材質對象。
+--0xA010 Ambiet塊
+--0xA020 Diffuse塊
+--0xA030 Specular塊
+--0xA040 Shininess塊
+--0xA100 定義了該材質的類型(比如Phong、Flat等等)
+--0xA200 紋理塊1,Diffuse定義的紋理就儲存在這個塊中
+-- 0xA300 (String)又一個Null Terminated String——該紋理的檔案名稱,
| 注意,這裡的檔案名稱不包含路徑。
+-- 0xA351 (WORD)紋理選項塊,按Mli文檔的說法1-9位有意義,分
| 別表示幾個紋理的屬性(比如是否tiling,是否Mirror等等)
| 這部分只要建模的時候稍微注意一下,就可以忽略這個塊。
| 比如Mirror就可以用把兩個Tiling換成負數的方法解決。
+-- 0xA353 (float)不太清楚這個分量的含義。
+-- 0xA354 (float)U方向的Tiling值
+-- 0xA356 (float)V方向的Tiling值
+-- 0xA358 (float)U方向的Offset值
+-- 0xA35A (float)V方向的Offset值,注意,這裡讀到的Voffset的值跟3ds
| 裡面看到的值相差一個符號。
+-- 0xA35C (float 4Bytes)W方向的rotate值,同樣的也相差一個符號。
4000是一個對象描述塊。
該塊的開始是一個由0結尾的字串,描述了該對象的名稱。要記住,對象不僅僅是一個物體,也可能是一個光源或者是一個攝象機:
ID 描述
4010 unknown
4012 陰影?
4100 三角形列表
4600 光源
4700 攝象機
4100三角形列表的子塊:網格模型資訊
MAIN3DS (0x4D4D)
|
+-EDIT3DS (0x3D3D)
| |
| +--EDIT_OBJECT (0x4000)
| | |
| | +--OBJ_TRIMESH (0x4100)
| | | | (位元組數) 2 3 3 3 3 3 3
| | | +--TRI_VERTEXL (0x4110) 頂點列表[num,x,y,z,x,y,z.......]
| | | +--TRI_VERTEXOPTIONS (0x4111) 頂點選項
| | | |
| | | +--TRI_MAPPINGCOORS (0x4140) 紋理座標[num,U,V,U,V...........]
| | | +--TRI_MAPPINGSTANDARD (0x4170) 標準映射
| | | +--TRI_FACEL1 (0x4120) 面列表
| | | +--TRI_SMOOTH (0x4150) 面平滑組
| | | +--TRI_MATERIAL (0x4130) 面材質
| | | +--TRI_TRMATRIX (0x4160) 平移矩陣
| | | +--TRI_VISIBLE (0x4165) 物體可見度
其中4110頂點列表塊的資料:
資料類型 大小 名稱
Ushort 2位元組 頂點數目
float 4位元組 X座標
float 4位元組 Y座標
float 4位元組 Z座標
其中X,Y,Z一直重複頂點數目次,這樣就得到了所有的頂點。
4111頂點選項塊:
該塊由一些整數組成,第一個整數表明了頂點的個數,然後對每個頂點用一個整數表示一些位資訊。其中0~7,11~12位影響物體的可見度,8~10位是隨機資訊,13~15位表明該頂點是否在某個選擇集中被選中。該塊不很重要。即使丟失此塊,3DS仍舊能夠將檔案正確的載入。
4120面列表塊:
資料類型 大小 名稱
Unsigned short 2位元組 面數量
Unsigned short 2位元組 頂點A的索引
Unsigned short 2位元組 頂點B的索引
Unsigned short 2位元組 頂點C的索引
Unsigned short 2位元組 面資訊
其中頂點A,B,C和面資訊重複面數量次就得到了所有的面。面資訊的各位意義如下:
位元 意義
1 AC邊的順序。若是A->C的話為1。
2 BC邊的順序。若是B->C的話為1。
3 AB邊的順序。若是A->B的話為1。
4 映射
5 未使用
6 同上
7 同上
8 同上
9 同上
10 混亂
11 混亂
12 0
13 0
14 是否在選擇集3被選中
15 是否在選擇集2被選中
16 是否在選擇集1被選中
4130面材質塊:
每一個面材質塊均以一個Null Terminated String開始,接著由一個數字表示使用該材質的面的數量(2個位元組)。接下來存放的是這些面的索引,每個索引2個位元組
4140紋理映射塊:
開始的兩個位元組表示了頂點的數量,然後為每個頂點定義2個浮點數的紋理座標。也就是說,如果一個頂點的紋理映射在紋理的中心,那麼其座標就是(0.5,0.5)。
4150面平滑組塊(譯者:至今本人不知道這個塊的用處……):
面的數量乘上4個位元組,即每個資料是一個4位元組的整數,第N個數字表示該面是否屬於第N個平滑組。
4160平移矩陣塊:
開始的3個浮點數定義了物體局部座標在絕對座標中的位置,最後3個浮點數定義了物體的局部中心。
4170標準映射塊(譯者:至今本人不知道這個塊的用處……):
開始的2個位元組表示了映射類型:0表示平面映射或者是指定映射;1:圓柱映射;2:球映射。接著用21個浮點數描述該映射。
4600光源塊:
開始用3個浮點數(共12位元組)描述了該光源的X,Y,Z座標位置,接下來是如下資料區塊:
ID 描述
0010 RGB色
0011 24位色塊
4610 該光源是個聚光燈
4620 布爾值,表示該光源的有效性
其中,4610塊的資料:
開始的3個浮點數表示了聚光燈指向的方向(X,Y,Z)。接下來的一個浮點數表示了熱點。最後一個浮點數表示了發散(譯者:好像就是聚光的角度)。
0010 RGB色塊:
用3個浮點數表示了物體的R,G,B色。
0011 24位色塊:
用3個位元組描述了物體的R,G,B色(譯者:即每分色一位元組)。
4700攝像機塊:
開始的3個浮點數表示了攝像機的位置(X,Y,Z),中間的3個浮點數表示了攝像機指向的位置(X,Y,Z),接下來的一個浮點數表示了攝像機的旋轉角(譯者:不知道什麼用……),最後一個浮點數表示了攝像機的鏡頭角度(譯者:就是視角)。
l 3DS檔案結構
一個3ds檔案包含一系列的資訊用於描述由一個或多個物體組成的3D情境的所有細節。一個3ds檔案包含了一系列的塊,稱之為chunks。那麼在這些塊中又包含了什麼了?是需要描述情境的所有資訊:每個物體的名稱,頂點座標,映射座標,多邊形列表,表面的顏色,動畫主要畫面格等等...
這些chunks沒有一個線性結構。這意味著一些chunks依賴於其他的chunks,並只有在它們的父chunks被讀入後才能讀入。沒有必要讀入所有的chunks,我們在此只考慮最為重要的。我對3ds檔案格式的描述基於包含在3dsinfo.txt中的資訊,此由Jochen Wjlhelmy所寫,詳細地解釋了所有chunks的結構。
一個Chunk包含4個欄位:
-Identifier:一個兩個位元組長的16進位的數字以標識chunk。這個資訊立即地告訴我們對於我們的意圖此chunk是否有用。如果我們需要這個chunk,我們可以提取(extrapolate)包含在這個chunk和可能的子chunk中的資訊。如果我們不需要這個chunk,我們使用一下資訊來跳過它...
-Length of the chunk:一個4位元組數字,表示chunk長度和其所有子chunk長度的總和。
-Chunk data:這個欄位有一個變數長度並包含情境的所有資料。
下表顯示了在一個典型的chunk中各欄位的位移和長度(以位元組為單位)。
我們可以從表的最後一行清楚地看到一些chunks是如何依賴於其他chunks的:每個子chunk實際上是包含在父chunk的”Sub-chunks”欄位。
以下是在一個3ds檔案中最為重要的chunks。請注意不同元素間的層次關係:
MAIN CHUNK 0x4D4D
3D EDITOR CHUNK 0x3D3D
OBJECT BLOCK 0x4000
TRIANGULAR MESH 0x4100
VERTICES LIST 0x4110
FACES DESCRIPTION 0x4120
FACES MATERIAL 0x4130
MAPPING COORDINATES LIST 0x4140
SMOOTHING GROUP LIST 0x4150
LOCAL COORDINATES SYSTEM 0x4160
LIGHT 0x4600
SPOTLIGHT 0x4610
CAMERA 0x4700
MATERIAL BLOCK 0xAFFF
MATERIAL NAME 0xA000
AMBIENT COLOR 0xA010
DIFFUSE COLOR 0xA020
SPECULAR COLOR 0xA030
TEXTURE MAP 1 0xA200
BUMP MAP 0xA230
REFLECTION MAP 0xA220
[SUB CHUNKS FOR EACH MAP]
MAPPING FILENAME 0xA300
MAPPING PARAMETERS 0xA351
KEYFRAMER CHUNK 0xB000
MESH INFORMATION BLOCK 0xB002
SPOT LIGHT INFORMATION BLOCK 0xB007
FRAMES (START AND END) 0xB008
OBJECT NAME 0xB010
OBJECT PIVOT POINT 0xB013
POSITION TRACK 0xB020
ROTATION TRACK 0xB021
SCALE TRACK 0xB022
HIERARCHY POSITION 0xB030
如前所述,如果我們想讀取一個特殊的chunk,我們必須要先讀取它的父chunk。想象一下3ds檔案是一棵樹,我們要讀取的chunk是一片葉子(並且我們是地面上的一個小螞蟻)。為了達到葉子,我們需要從樹榦開始,並穿過通向葉子的所有樹枝。例如,如果我們想到達chunk VERTICES LIST,我們必須先讀取MAIN CHUNK,然後是3D EDITOR CHUNK,OBJECT BLOCK,最後是chunk TRIANGULAR MESH。其他的chunks可以安全地跳過。
現在讓我們剪除樹,只剩下將在本教程中使用的樹枝:”vertices”, “faces”, “mapping coordinates” 和它們的父chunks。
MAIN CHUNK 0x4D4D
3D EDITOR CHUNK 0x3D3D
OBJECT BLOCK 0x4000
TRIANGULAR MESH 0x4100
VERTICES LIST 0x4110
FACES DESCRIPTION 0x4120
MAPPING COORDINATES LIST 0x4140
引自網易流光如夢部落格。