3ds文件介绍
3ds文件以二进制的形式存储,由块(Chuck)数据结构组成,每一个块都包含块头和负载。其中块头包含块id(2byte),以及块的字节长(4byte)。块的长度包含头部长度,所以负载长度即为块长 - 6。
3ds文件以二进制形式存储。与许多文件格式一 样,3ds二进制文件中的数据也是按低位在前、高位在后的方式组织的,例如,两个十六进制字 节4A
5C 组成的整形数,表明5C是高位字节,4A是低位字节;对于长整形数,如:4A 5C 3B 8F表明5C4A是低位字,而8F3B是高位字。
负载根据块的类型包含不同格式的数据,同时可包含下一级的字块,并由此形成树状的层次结构。3ds文件一定从id为0x4D4D的主块开始,作为根节点包含所有的块。关于每种块内详细的格式请参考《3DStudio 文件格式》。
读取3ds文件
由于3ds文件以树状层次结构储存,顺势想到用递归的方式进行读取。首先定义用到的Chunk:
//3ds文件基本块
#define MAIN3DS 0x4D4D
//主块
#define EDIT3DS 0x3D3D
//对象块
#define EDIT_OBJECT 0x4000
//网格块
#define OBJ_TRIMESH 0x4100
//顶点块
#define TRI_VERTEX 0x4110
//面片块
#define TRI_FACE1 0x4120
//材质映射块
#define TRI_TEX_MAPPING 0x4140
//local坐标块
#define TRI_LOCAL 0x4160
以及各类块的基类Chuck,其中包含的属性有:
const unsigned short id;//块号
const unsigned int length;//块长
unordered_map<unsigned short, vector<Chunk*>*> subChunks;//子块表
包含的方法有(构造器和析构省略):
public:
//读取文件,构建结构树
Chunk* build(fstream &fp);
//实际已经读取到的字节长度
virtual unsigned int getRealLength();
//getter
unordered_map<unsigned short, vector<Chunk*>*>& getSubChunks() {
return subChunks;}
vector<Chunk*>* getSubChunk(unsigned short key) {
return subChunks[key];}
protected:
//读取子块
virtual void