3ds文件結構(二)

2.所有的塊

 

現在你會看到我將使用define來定義這些數字。然而因爲這裏有一些新的塊,這些塊並沒有記錄到最初的文檔中,因此各位要留心。

//------ 初始塊

 #define MAIN3DS       0x4D4D

  //------ 主塊

  #define EDIT3DS       0x3D3D  // this is the start of the editor config

 #define KEYF3DS       0xB000  // this is the start of the keyframer config

 //------ 3DS編輯塊的子塊

 #define EDIT_MATERIAL 0xAFFF

 #define EDIT_CONFIG1  0x0100

 #define EDIT_CONFIG2  0x3E3D

 #define EDIT_VIEW_P1  0x7012

 #define EDIT_VIEW_P2  0x7011

 #define EDIT_VIEW_P3  0x7020

 #define EDIT_VIEW1    0x7001

 #define EDIT_BACKGR   0x1200

 #define EDIT_AMBIENT  0x2100

 #define EDIT_OBJECT   0x4000

 

 #define EDIT_UNKNW01  0x1100

 #define EDIT_UNKNW02  0x1201

 #define EDIT_UNKNW03  0x1300

 #define EDIT_UNKNW04  0x1400

 #define EDIT_UNKNW05  0x1420

 #define EDIT_UNKNW06  0x1450

 #define EDIT_UNKNW07  0x1500

 #define EDIT_UNKNW08  0x2200

 #define EDIT_UNKNW09  0x2201

 #define EDIT_UNKNW10  0x2210

 #define EDIT_UNKNW11  0x2300

 #define EDIT_UNKNW12  0x2302

 #define EDIT_UNKNW13  0x3000

 #define EDIT_UNKNW14  0xAFFF

 //------ 對象塊的子塊

 #define OBJ_TRIMESH   0x4100

 #define OBJ_LIGHT     0x4600

 #define OBJ_CAMERA    0x4700

 

 #define OBJ_UNKNWN01  0x4010

 #define OBJ_UNKNWN02  0x4012 //---- 陰影塊

 //------ 攝象機塊的子塊

 #define CAM_UNKNWN01  0x4710

 #define CAM_UNKNWN02  0x4720

  //------ 光源塊的子塊

 #define LIT_OFF       0x4620

 #define LIT_SPOT      0x4610

 #define LIT_UNKNWN01  0x465A

  //------ 三角形列表塊的子塊

 #define TRI_VERTEXL   0x4110

 #define TRI_FACEL2    0x4111

 #define TRI_FACEL1    0x4120

 #define TRI_SMOOTH    0x4150

 #define TRI_LOCAL     0x4160

 #define TRI_VISIBLE   0x4165

  //------ 關鍵幀快的子塊

  #define KEYF_UNKNWN01 0xB009

 #define KEYF_UNKNWN02 0xB00A

 #define KEYF_FRAMES   0xB008

 #define KEYF_OBJDES   0xB002

 

 //------  下面定義了顏色塊

 #define COL_RGB  0x0010

 #define COL_TRU  0x0011

 #define COL_UNK  0x0013

 

 //------ 定義視口塊

  #define TOP           0x0001

 #define BOTTOM        0x0002

 #define LEFT          0x0003

 #define RIGHT         0x0004

 #define FRONT         0x0005

 #define BACK          0x0006

 #define USER          0x0007

 #define CAMERA        0x0008 // 0xFFFF is the actual code read from file

 #define LIGHT         0x0009

 #define DISABLED      0x0010

 #define BOGUS         0x0011


我自己在後面補充幾個塊的詳細介紹吧。

首先我說一下文件的讀取規則,3ds文件的讀取規則如下: 
字節:直接讀取; 
字:先讀低位字節,後讀高位字節,如ed 3c讀出後的字爲3c ed; 
雙字:先讀低位字,後讀高位字,如ed 3c 25 43讀出後的雙字爲43 25 3c ed; 
浮點數:直接讀取四個字節。 

3ds文件由chunk構成,每一個chunk包括一個頭和一個主體。chunk是相互嵌套的,這就決定了你必須以遞歸的方式讀取它們。chunk的頭又由兩部分組成:ID和chunk的長度,其中ID佔一個字,chunk長度佔(以字節爲單位,包括頭)一個雙字。ID表示chunk的含義。事實上有上千個chunk,它們構成了一個複雜但靈活的文件系統,你不需要知道所有的就可以順利的讀完整個文件。

下面是其中某些主要chunk的介紹:

0x4D4D:根chunk,每一個3ds文件都起自它,它的長度也就是文件的長度。它包含了兩個chunk:編輯器,和關鍵幀。 
父chunk:無 
子chunk:0x3D3D、0xB000 
長度:頭長度+子chunk長度 
內容:無 

0x3D3D:編輯器主chunk,它包含有:網格信息、燈光信息、攝象機信息和材質信息。 
父chunk:0x4D4D 
子chunk:0x4000、0xafff 
長度:頭長度+子chunk長度 
內容:無 

0x4000:網格主chunk,它包含了所有的網格。 
父chunk:0x3D3D 
子chunk:0x4100 
長度:頭長度+子chunk長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 

0x4100:網格信息,包含網格名稱、頂點、面、紋理座標等。 
父chunk:0x4000 
子chunk:0x4110、0x4120、0x4140、0x4160 
長度:頭長度+子chunk長度 
內容:無 

0x4110:頂點信息。 
父chunk:0x4100 
子chunk:無 
長度:頭長度+內容長度 
內容: 
頂點個數(一個字) 
頂點座標(三個浮點數一個座標x、y、z,個數*3*浮點數) 

0x4120:面信息。 
父chunk:0x4100 
子chunk:0x4130 
長度:頭長度+子chunk長度+內容長度 
內容: 
面個數(一個字) 
頂點索引(三個字一個索引1、2、3,個數*3*字) 

0x4130:與網格相關的材質信息。 
父chunk:0x4120 
子chunk:無 
長度:頭長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 
與材質相連的面的個數(一個字) 
與材質相連的面的索引(個數*字) 

0x4140:紋理座標。 
父chunk:0x4100 
子chunk:無 
長度:頭長度+內容長度 
內容: 
座標個數(一個字) 
座標(兩個浮點數一個座標u、v,個數*2*浮點數) 

0x4160:轉換矩陣。 
父chunk:0x4100 
子chunk:無 
長度:頭長度+內容長度 
內容: 
x軸的向量(三個浮點數u、v、n) 
y軸的向量(三個浮點數u、v、n) 
z軸的向量(三個浮點數u、v、n) 
源點座標(三個浮點數x、y、z) 

0xafff:材質信息。 
父chunk:0x4D4D 
子chunk:0xa000、0xa020、0xa200 
長度:頭長度+子chunk長度 
內容:無 

0xa000:材質名稱。 
父chunk:0xafff 
子chunk:無 
長度:頭長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 


0xa020:滿射色。 
父chunk:0xafff 
子chunk:0x0011、0x0012 
長度:頭長度+子chunk長度 
內容:無 


0xa200:紋理帖圖。 
父chunk:0xafff 
子chunk:0xa300 
長度:頭長度+子chunk長度 
內容:無 

0xa300:帖圖名稱。 
父chunk:0xa200 
子chunk:無 
長度:頭長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 

0xB000:關鍵幀主chunk,包含所有的關鍵幀信息。 
父chunk:0x4D4D 
子chunk:0xB008、0xB002 
長度:頭長度+子chunk長度 
內容:無 

0xB008:關鍵幀的起點和終點。 
父chunk:0xB000 
子chunk:無 
長度:頭長度+內容長度 
內容: 
起始幀(一個雙字) 
結尾幀(一個雙字) 

0xB002:網格的關鍵幀信息。 
父chunk:0xB000 
子chunk:0xB010、0xB011、0xB013、0xB020、0xB021、0xB022、0xB030 
長度:頭長度+子chunk長度 
內容:無 

0xB010:關鍵幀的層次信息,包括名稱和上一級關鍵幀的索引,名稱與它指向的網格名稱一致。 

父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 
兩個未知的字 
上一級關鍵幀的索引(一個字) 

0xB011:關鍵幀的dummy名稱,我不知道dummy在這裏的具體含義,但只要你在上一個chunk中讀到的名稱是“$$$DUMMY”那麼你就要到這裏來讀它真正的名稱。因爲這說明它指向的不是網格而是虛擬的組。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
名稱(以空字節結尾的字符串) 

0xB013:支點座標。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
三個浮點數x,y,z 

0xB020:移動的關鍵幀信息。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
五個未知的字 
幀個數(一個字) 
一個個數那麼多的循環結構{ 
幀索引(一個字) 
一個未知的雙字 
移動的向量(三個浮點數x,y,z) 


0xB021:轉動的關鍵幀信息。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
五個未知的字 
幀個數(一個字) 
一個個數那麼多的循環結構{ 
幀索引(一個字) 
一個未知的雙字 
轉動角度(一個浮點數) 
繞之轉動的向量(三個浮點數x,y,z) 


0xB022:縮放的關鍵幀信息。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
五個未知的字 
幀個數(一個字) 
一個個數那麼多的循環結構{ 
幀索引(一個字) 
一個未知的雙字 
伸縮的向量(三個浮點數x,y,z) 


0xB030:關鍵幀的索引。 
父chunk:0xB002 
子chunk:無 
長度:頭長度+內容長度 
內容: 
關鍵幀的索引(一個字) 

以下的chunk可能出現在任何chunk中: 
0x0010:浮點數格式的顏色。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
顏色(三個浮點數red,green,blue) 


0x0011:字節格式的顏色。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
顏色(三個字節red,green,blue) 

0x0012:字節格式的gamma矯正。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
顏色(三個字節red,green,blue) 

0x0013:浮點數格式的gamma矯正。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
顏色(三個浮點數red,green,blue) 

0x0030:字格式的百分比。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
百分比(一個字0~100) 

0x0031:浮點數格式的百分比。 
父chunk:任何可能的chunk 
子chunk:無 
長度:頭長度+內容長度 
內容: 
百分比(一個浮點數0~100)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章