3DS 文件格式

来源:互联网 发布:微商城网站源码 编辑:程序博客网 时间:2024/04/28 04:22

3DS 文件格式  

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,个数*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)

0 0
原创粉丝点击