3DS檔案格式

2021-06-23 08:29:51 字數 4341 閱讀 6401

1、讀取規則

3ds檔案的讀取規則如下:

位元組:直接讀取;

字:先讀低位位元組,後讀高位位元組,如ed 3c讀出後的字為3c ed;

雙字:先讀低位字,後讀高位字,如ed 3c 25 43讀出後的雙字為43 25 3c ed;

浮點數:直接讀取四個位元組。

2、chunk

chunk是3ds檔案的基本構成單位。每乙個chunk包括乙個頭和乙個主體。chunk是相互巢狀的,這就決定了你必須以遞迴的方式讀取它們。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,加乙個面資訊(決定面的順逆方向),個數*4*字)(注:本文中唯一乙個既有子chunk又有內容的chunk,該chunk的長度已知)

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:無

長度:頭長度+內容長度

內容:五個未知的字

幀個數(乙個字)

乙個個數那麼多的迴圈結構

0xb021:轉動的關鍵幀資訊。

父chunk:0xb002

子chunk:無

長度:頭長度+內容長度

內容:五個未知的字

幀個數(乙個字)

乙個個數那麼多的迴圈結構

0xb022:縮放的關鍵幀資訊。

父chunk:0xb002

子chunk:無

長度:頭長度+內容長度

內容:五個未知的字

幀個數(乙個字)

乙個個數那麼多的迴圈結構

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)

3DS 檔案格式

3ds 檔案格式 1 讀取規則 3ds檔案的讀取規則如下 位元組 直接讀取 字 先讀低位位元組,後讀高位位元組,如ed 3c讀出後的字為3c ed 雙字 先讀低位字,後讀高位字,如ed 3c 25 43讀出後的雙字為43 25 3c ed 浮點數 直接讀取四個位元組。2 chunk chunk是3d...

3ds的檔案格式

3ds檔案格式簡介 1 讀取規則 3ds檔案的讀取規則如下 位元組 直接讀取 字 先讀低位位元組,後讀高位位元組,如ed 3c讀出後的字為3c ed 雙字 先讀低位字,後讀高位字,如ed 3c 25 43讀出後的雙字為43 25 3c ed 浮點數 直接讀取四個位元組。2 chunk chunk是3...

3DS檔案的結構

本文 於 zwqxin 其實按我最近的理解,3ds檔案格式,對資料的組織跟記憶體很相像。它分成很多的 chunk 塊 按順序排列。每個chunk都包含著一些資訊,比如頂點啊材質啊燈光啊等等,相應地,就被稱為頂點chunk材質chunk燈光chunk等等,每個chunk都有其功用。每個chunk有其i...