#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
3.3D编辑块
到现在为止已经大概都介绍完了,现在开始研究细节信息。
0x4D4D是文件头,他的大小就是整个文件的大小。
另外还有两个主要块,他们是3D编辑块和关键帧块:
0x3D3D:3D编辑块,描述了3D对象的数据。3D对象就在这个地方。 0xB000:关键帧块,描述了关键帧数据。
在某个主要块之后有一些数据块。这些应该是其他一些允许在主要块之内的数据(请参见图表)。
0x3D3D的子块:
ID 描述
0100 配置部分
1100 unknown 1200 背景色
1201 unknown
1300 unknown 1400 unknown 1420 unknown 1450 unknown 1500 unknown 2100 环境色 2200 雾? 2201 雾 ? 2210 雾 ?
2300 unknown 3000 unknown 3D3E 配置编辑块 4000 对象数据块 AFFF 材质列表
子块AFFF,定义了材质。其子块A000定义了材质名称。材质名称是ASCLL字符,以0x00为结束符。
子块3D3E,配置编辑块:
ID 描述 7001 视口指示器
7011 视口定义 ( 类型 2 ) 7012 视口定义( 类型 1 )
7020 视口定义( 类型 3 )
3D3E块中有很多变态的数据,其中只有7020块比较重要,这个块定义了4个活动的视口。假设在编辑程序中使用了4个视口,编辑程序配置中包含5个7020块和5个7011块。但是事实上只有开始的4个7020块对用户的视口外观有影响,其他的里面只包含一些附加信息。该块的第6,7字节表明了视图的类型,合法的ID以及其对应的视图如下所示:
ID 描述 0001 顶 0002 底 0003 左 0004 右 0005 前 0006 后 0007 用户 FFFF 摄象机 0009 光源 0010 无效
子块4000是一个对象描述块。该块的开始是一个由0结尾的字符串,描述了该对象的名称。要记住,对象不仅仅是一个物体,也可能是一个光源或者是一个摄象机:
ID 描述 4010 unknown 4012 阴影? 4100 三角形列表 4600 光源 4700 摄象机
子块4100三角形列表的子块:
ID 描述 4110 顶点列表 4111 顶点选项 4120 面列表
4130 面材质 4140 纹理映射 4150 面平滑组 4160 平移矩阵 4165 物体可见性 4170 标准映射
其中4110顶点列表块的数据: 数据类型 Unsigned short Float Float float 大小 2字节 4字节 4字节 4字节 名称 顶点数目 X坐标 Y坐标 Z坐标 其中X,Y,Z一直重复顶点数目次,这样就得到了所有的顶点。
4111顶点选项块: 该块由一些整数组成,第一个整数表明了顶点的个数,然后对每个顶点用一个整数表示一些位信息。其中0~7,11~12位影响物体的可见性,8~10位是随机信息,13~15位表明该顶点是否在某个选择集中被选中。该块不很重要。即使丢失此块,3DS仍旧能够将文件正确的载入。
4120面列表块: 数据类型 Unsigned short Unsigned short Unsigned short Unsigned short Unsigned short 位数 意义 大小 2字节 2字节 2字节 2字节 2字节 名称 面数量 顶点A的索引 顶点B的索引 顶点C的索引 面信息 其中顶点A,B,C和面信息重复面数量次就得到了所有的面。面信息的各位意义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 AC边的可见性。若是可见的话为1。 BC边的可见性。若是可见的话为1。 AB边的可见性。若是可见的话为1。 映射 未使用 同上 同上 同上 同上 混乱 混乱 0 0 是否在选择集3被选中 是否在选择集2被选中 是否在选择集1被选中 4130面材质块:
如果一个对象只使用默认材质的话便没有面材质块。事实上,每一个对象使用的材质都有一个面材质块。每一个面材质块都以一个以0结尾的字符串开始,接着由一个数字表示使用该材质的面的数量(2个字节),接着就是面描述。0000表示面列表中的第一个面。
4140纹理映射块:
开始的两个字节表示了顶点的数量,然后为每个顶点定义2个浮点数的纹理坐标。也就是说,如果一个顶点的纹理映射在纹理的中心,那么其坐标就是(0.5,0.5)。
4150面平滑组块(译者:至今本人不知道这个块的用处??):
面的数量乘上4个字节,即每个数据是一个4字节的整数,第N个数字表示该面是否属于第N个平滑组。
4160平移矩阵块:
开始的3个浮点数定义了物体局部坐标在绝对坐标中的位置,最后3个浮点数定义了物体的局部中心。
4170标准映射块(译者:至今本人不知道这个块的用处??):
开始的2个字节表示了映射类型:0表示平面映射或者是指定映射;1:圆柱映射;2:球映射。接着用21个浮点数描述该映射。
4600光源块:
开始用3个浮点数(共12字节)描述了该光源的X,Y,Z坐标位置,接下来是如下数据块:
ID 描述
0010 RGB色 0011 24位色块 4610 该光源是个聚光灯
4620 布尔值,表示该光源的有效性
其中,4610块的数据:
开始的3个浮点数表示了聚光灯指向的方向(X,Y,Z)。接下来的一个浮点数表示了热点。最后一个浮点数表示了发散(译者:好像就是聚光的角度)。
0010 RGB色块:
用3个浮点数表示了物体的R,G,B色。
0011 24位色块:
用3个字节描述了物体的R,G,B色(译者:即每分色一字节)。
4700摄像机块:
开始的3个浮点数表示了摄像机的位置(X,Y,Z),中间的3个浮点数表示了摄像机指向的位置(X,Y,Z),接下来的一个浮点数表示了摄像机的旋转角(译者:不知道什么用??),最后一个浮点数表示了摄像机的镜头角度(译者:就是视角)。
4.关键帧块 关键帧块:
ID 描述 B00A unknown
7001 看该块的第一个描述而定(译者:完全不知道什么用,从来没在.3ds文件中见过这个块)
B008 帧数量 B009 unknown
B002 开始对象描述
其中,B008帧数量块:由8字节组成(unsigned long X 2),开始4个字节描述了开始帧,最后4个字节描述了结束帧。
B002物体信息块:
ID 描述
B010 名称与层次结构
B011* 哑元物体命名(译者:也就是不在场景中显示的对象,一般用来对对象分组) B013 unknown B014* unknown
B015 unknown
B020 物体转轴(中心点)
B021 unknown B022 unknown
B010名称与层次结构块:
该块由一个以0结尾的字符串开始,中间4个字节(unsigned short X 2)未知,最后2