认识3DS文件格式

本文深入探讨了3ds文件的多种格式及其发展历史,重点介绍了3dmax导出的3ds文件对应的是3ds 4.0版本。详细解释了3ds文件的块结构、宏定义和数据结构,以及如何通过代码读取块ID和长度。最后概述了3ds文件的导入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3ds文件本身就有好几种格式,这主要是3ds这个软件发展的过程当中产生,现在3dmax导出的3ds格式应该是3ds   4.0对应的格式(大概在是95年左右时候)  
 关于3ds的格式,虽然没有官方的文档,但是 网络 上流传的关于它的描述文件还是很多的,而且 自从有了3dmax之后,3ds的格式已经没有再发生变化了,3dmax自己的格式就是max格式,opengl本身没有直接导入3ds格式的功能,需要自己写代码来转换这个东西   ,3ds文件当中有一个位置表明它的版本号的
--------------------------------------------------------------------------------------------------------------

介绍

3ds文件由块组成。这些块说明了紧跟其ID的内容和下一个块的地址。假如对某一个块不明白,可跳过。
下一个块的指针与当前块的首地址和长度有关,3ds文件以 二进制形式存储。与许多文件格式一样,3ds二进制文件中的数据也是按低位在前、高位在后的方式组织的,例如,两个十六进制字节4A 5C 组成的整形数,表明5C是高位字节,4A是低位字节;对于长整形数,如:4A 5C 3B 8F表明5C4A是低位字,而8F3B是高位字。
每个块实际上是一个层次结构,不同类型的块,其层次结构也不相同。
每一个3ds文件 首块ID是4D4D。首块就是 主块。包含了整个文件。
-----------------------------------------------------------------------------------------------------------------------------------------------------------

块的宏定义

现在,我将用宏定义定义这些块,这些宏定义取自源程序代码。然而,依然需要小心,因为很多新块未能得到及时的说明。

//------ 基本块Primary chunk
#define MAIN3DS 0x4D4D
//------ 主块Main Chunks
#define EDIT3DS 0x3D3D // this is the start of the editor config
#define KEYF3DS 0xB000 // 关键帧信息的头部this is the start of the keyframer config
//------ sub defines of EDIT3DS次级定义
#define EDIT_MATERIAL 0xAFFF
#define EDIT_CONFIG1 0x0100
#define EDIT_CONFIG2 0x3E3D
#define EDIT_VIEW_P1 0x7012
#define EDIT_VIEW_P2 0x7011
#define EDIT_VIEW_P3 0x7020
#define EDIT_VIEW1 0x7001
#define EDIT_BACKGR 0x1200
#define EDIT_AMBIENT 0x2100
#define EDIT_OBJECT 0x4000
#define EDIT_UNKNW01 0x1100
#define EDIT_UNKNW02 0x1201
#define EDIT_UNKNW03 0x1300
#define EDIT_UNKNW04 0x1400
#define EDIT_UNKNW05 0x1420
#define EDIT_UNKNW06 0x1450
#define EDIT_UNKNW07 0x1500
#define EDIT_UNKNW08 0x2200
#define EDIT_UNKNW09 0x2201
#define EDIT_UNKNW10 0x2210
#define EDIT_UNKNW11 0x2300
#define EDIT_UNKNW12 0x2302
#define EDIT_UNKNW13 0x3000
#define EDIT_UNKNW14 0xAFFF
//------ sub defines of EDIT_OBJECT
#define OBJ_TRIMESH 0x4100
#define OBJ_LIGHT 0x4600
#define OBJ_CAMERA 0x4700
#define OBJ_UNKNWN01 0x4010
#define OBJ_UNKNWN02 0x4012 //---- Could be shadow
//------ sub defines of OBJ_CAMERA
#define CAM_UNKNWN01 0x4710
#define CAM_UNKNWN02 0x4720
//------ sub defines of OBJ_LIGHT
#define LIT_OFF 0x4620
#define LIT_SPOT 0x4610
#define LIT_UNKNWN01 0x465A
//------ sub defines of OBJ_TRIMESH
#define TRI_VERTEXL 0x4110
#define TRI_FACEL2 0x4111
#define TRI_FACEL1 0x4120
#define TRI_SMOOTH 0x4150
#define TRI_LOCAL 0x4160
#define TRI_VISIBLE 0x4165
//------ sub defs of KEYF3DS
#define KEYF_UNKNWN01 0xB009
#define KEYF_UNKNWN02 0xB00A
#define KEYF_FRAMES 0xB008
#define KEYF_OBJDES 0xB002
//------ these define the different color chunk types
#define COL_RGB 0x0010
#define COL_TRU 0x0011
#define COL_UNK 0x0013
//------ defines for viewport chunks
#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

定义数据结构

//保存块信息的结构
struct CLscChunk
{
 unsigned short int ID; //块的ID
 unsigned int length; //块的长度
 unsigned int bytesRead; //需要读的块数据的字节数
};


读取块的ID和长度

// 读入块的ID号和它的字节长度(并没有读取块的内容)
void C3DLoader::ReadChunk(CLscChunk *pChunk)
{

	//读入块的ID号,每次读一个BYTE,占用2个字节
	pChunk->bytesRead=fread(&pChunk->ID,1,2,m_pFile);
	pChunk->bytesRead += fread((&pChunk->length,1,4,m_pFile);
	
}


Import3DS

打开3DS文件,按照块的顺序将其中的内容读取出来,最后释放占用的内存空间。

一个完善的读取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、付费专栏及课程。

余额充值