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 readSubChunks(fstream & fp

本文介绍了3ds文件的二进制结构,包括块数据结构和低位在前、高位在后的存储方式。通过递归读取方式解析3ds文件,定义Chunk类及其子类,实现了针对不同块类型的处理。示例展示了EDIT_OBJECT块的处理,并通过Unknown Chunk处理未关注的块。最终,通过主Chunk实例的build函数完成文件读取,形成树形结构。

最低0.47元/天 解锁文章
334

被折叠的 条评论
为什么被折叠?



