计算机图形学-从零开始的3ds模型文件显示/纯C++标准库实现(一 3ds模型二进制文件读取)

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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值