*.3ds的文件格式

3DS文件格式简介:

       3DS文件有许多相同类型得数据块组成。每个块信息包括:块的类别(ID),下一块相对于该块的偏移字节数。其中下面的chunk(就是块的意思)

     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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个完善的读取3DS文件例子 作者:野草我想做个室内渲染程序,要加载3ds室内模型,我本来不想深入研究3ds文件格式的,但是我在网上找了好几个读取3ds文件的例子,不是只能显示网格,就是只能帖一张图,要么只能读版本低的文件. 反正是找不着一个比较完善的类.比如 www.gametutorials.com 上的读取3ds文件的例子就有问题,一读我用3ds max5.0 生成的3ds文件就会非法操作,而且一个物体只能帖一张图; http://www.tsrevolution.com 上的C3DS类的例子只能显示网格; http://www.spacesimulator.net上能读取3ds max 5.0的文件,但也只能帖一张图.看来不研究3ds文件格式是不行的了.上面提到的程序多多少少都有3ds文件格式的说明,但都是E文的了.我在这里也不想详细说3ds文件格式,我只是想,用这个类的人不用知道它的格式就可以很好的用它.如果你真要研究,上面的网站你可以参考一下.首先说明,这个类只是把上面提到的几个例子融合在一起,并作了些改进而已.不要说我抄袭别人的代码. J 只是为了方便大家.我想最好的说教莫过于例子了,于是我就在这里提供一下例子,你可以根据你的需要修改这个例子.在我的应用里模型全都有帖图.在这个例子里我假设你的模型用的都是帖图而没使用颜色,如果你的模型没有用帖图,那模型的颜色应该不是你想要的.如果你想要加载颜色又不想研究3ds文件格式,来信告诉我,我再完善它.加载3ds模型只是游戏开发的一小步,还有很多事情要做.如果你只是就像我例子里那样加载一个比较大的模型并且也像我的例子里那样显示的话,你会发现速度奇慢无比 L 加快显示速度就是你要做的第二件事.比如用Portal技术,我的另一个程序里已经实现了.如果你想要看一下效果,可以到我的网站下载Demo : http://3dbrothers.kom.cn 本地下载:Load3DSDemo.rar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值