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)