3DS文件在OpenGL的读入和显示

本文介绍如何在OpenGL中读取和显示3DS文件。通过理解3DS文件的块结构和树状组织,使用深度优先搜索算法进行解析。在解析过程中注意3DS坐标系与OpenGL坐标的差异,避免模型错位。虽然Blender导出的3DS文件不含灯光和摄像机,但可以直接用GL_TRIANGLES绘制三角形。文章附带了演示程序和源代码链接。

3DS文件在OpenGL的读入和显示

学习了Blender之后,很想将自己设计的模型载入自己编写的程序中,因此考虑了比较常见的3DS文件格式。这回尝试着将3DS文件载入自己写的OpenGL程序并且显示出来。


演示程序下载地址:这里

源代码下载地址:这里

首先查找了许多现成载入3DS格式的例子,发现只有一个程序是可以运行的,于是就拿这个程序的源代码进行研究。同时查看了一些国外的格式说明文档,结合BlenderOutliner中数据的组织,我开始了解3DS格式的组织方式。

3DS文件是二进制的,并且是Autodesk私有格式,很多兼容软件都是根据已知破解的内容来进行读取的,因此不同软件对于它读取的效果会不同,高手们建议只将网格模型导出至3DS,因为光源和摄像机无法保存。

3DS文件的内部有种被称作“块(chunk)”的结构,用来阐述三维场景中各种各样的对象。其实这里所说的“块”和wav文件里面的块差不多,都包含了头(header)和内容(content)。3DS中的块的头包含了ID(占两字节)和长度(占四字节),其中长度则是块的整个长度。而块的内容长度为块的整个长度减去6字节。

举一个例子,主块的ID0x4D4D,我们可以这样做:读取块ID两个字节,随后读取四字节块的长度(设为length),这样我们知道之后最多还需要读取(length- 6)个字节。

3DS中数据组织结构是树状的,而树中每一个节点也就是块结构,由于树中各个层次有着相似性,根据数据结构中遍历树的知识,我们可以编写深度优先搜索算法,并且使用递归的思想来完成。

3DS树中的叶子节点通常有着特定的解析方法。比如说读到了顶点(ID0x4110),要求我们先读取两个字节的顶点个数n,再循环n遍读取各个顶点的xyz坐标。

3DS文件内的坐标系与OpenGLDirect3D的都不同,XY轴确定了水平面,Z轴则是垂直的。在解析的初期我也曾经将它的所有顶点的XYZ值通过交换和去反来对坐标轴进行替换,但是后面需要解析一个模型矩阵,如果仅仅对坐标轴替换而不对模型矩阵进行替换的话,那么解析后形成的模型会出现错位的现象。这会变得非常麻烦。即使可以通过修改模型矩阵的前3×3部分而达到目的,我还是觉得建模的时候通过将模型的坐标系转换成Direct3D的左手坐标系或者OpenGL的右手坐标系会更好一些,同时也会免去一些不必要的转换工作。

解析完3DS文件之后就需要显示它了,很遗憾,目前我使用的Blender导出的3DS不含灯光和摄像机,因此效果没有Blender软件中编辑得那么好。此外,3DS中默认的图元是三角形,也就是说多边形图元在导出的时候会被细分成一个个三角形来保存。因此在OpenGL中直接指定glBegin(GL_TRIANGLES );就好了。

以下是我在Blender中编辑的图像:


下图是程序的运行结果。


一个完善的读取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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值