在本篇教程中,我们将创建一个程序来加载3ds物体,一个

上传人:ldj****22 文档编号:41224874 上传时间:2018-05-28 格式:DOC 页数:4 大小:74KB
返回 下载 相关 举报
在本篇教程中,我们将创建一个程序来加载3ds物体,一个_第1页
第1页 / 共4页
在本篇教程中,我们将创建一个程序来加载3ds物体,一个_第2页
第2页 / 共4页
在本篇教程中,我们将创建一个程序来加载3ds物体,一个_第3页
第3页 / 共4页
在本篇教程中,我们将创建一个程序来加载3ds物体,一个_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《在本篇教程中,我们将创建一个程序来加载3ds物体,一个》由会员分享,可在线阅读,更多相关《在本篇教程中,我们将创建一个程序来加载3ds物体,一个(4页珍藏版)》请在金锄头文库上搜索。

1、现在是时候向我们就亲爱的立方体说再见的时候了!在本篇教程中,我们 将创建一个程序来加载 3ds 物体,一个在 Internet 上非常流行的文件格式,并 被许多不同的 3d 建模器所支持。一个 3D 建模器允许你以一种更加直观和人性 化的方式创建任何类型的物体,而不是手工定义顶点的坐标,即使对于比一个 立方体稍微复杂一点的简单物体,这将是一个不可能完成的任务。实际上,我 不情愿放弃立方体,这样一个简单而又完美的形状。无论如何,除非是被证明 不是,宇宙飞船,行星,导弹和任何与空间模拟器有关的东西看起来和立方体 完全不同。 在写代码之前,有必要分析一下 3ds 文件的结构。 好的,放上你写程序时最

2、喜欢喝的饮料并准备开始吧. l 3DS3DS 文件结构文件结构 一个 3ds 文件包含一系列的信息用于描述由一个或多个物体组成的 3D 场景 的所有细节。一个 3ds 文件包含了一系列的块,称之为 chunks。那么在这些块 中又包含了什么了?是需要描述场景的所有信息:每个物体的名称,顶点坐标 ,映射坐标,多边形列表,表面的颜色,动画关键帧等等. 这些 chunks 没有一个线性的结构。这意味着一些 chunks 依赖于其他的 chunks ,并只有在它们的父 chunks 被读入后才能读入。没有必要读入所有的 chunks ,我们在此只考虑最为重要的。我对 3ds 文件格式的描述基于包含在

3、3dsinfo. txt 中的信息,此由 Jochen Wjlhelmy 所写,详细地解释了所有 chunks 的结构 。 一个 Chunk 包含 4 个字段: IdentifierIdentifier:一个两个字节长的 16 进制的数字以标识 chunk。这个信息立即 地告诉我们对于我们的意图此 chunk 是否有用。如果我们需要这个 chunk,我们可以提取(extrapolate)包含在这个 chunk 和可能的子 chunk 中的信息。如 果我们不需要这个 chunk,我们使用一下信息来跳过它.LengthLength ofof thethe chunkchunk:一个 4 字节数字,

4、表示 chunk 长度和其所有子 chunk 长度的总和。 ChunkChunk datadata:这个字段有一个变量长度并包含场景的所有数据。 下表显示了在一个典型的 chunk 中各字段的偏移和长度(以字节为单位)。 OffsetLength 02Chunk identifier 24Chunk length: chunk data + sub-chunks(6+n+m) 6nData 6+nmSub-chunks 我们可以从表的最后一行清楚地看到一些 chunks 是如何依赖于其他 chunks 的 :每个子 chunk 实际上是包含在父 chunk 的”Sub-chunks”字段。 以

5、下是在一个 3ds 文件中最为重要的 chunks。请注意不同元素间的层次关系: MAIN CHUNK 0x4D4D3D EDITOR CHUNK 0x3D3DOBJECT BLOCK 0x4000TRIANGULAR MESH 0x4100VERTICES LIST 0x4110FACES DESCRIPTION 0x4120FACES MATERIAL 0x4130MAPPING COORDINATES LIST 0x4140SMOOTHING GROUP LIST 0x4150LOCAL COORDINATES SYSTEM 0x4160LIGHT 0x4600SPOTLIGHT 0x4

6、610CAMERA 0x4700MATERIAL BLOCK 0xAFFFMATERIAL NAME 0xA000AMBIENT COLOR 0xA010DIFFUSE COLOR 0xA020SPECULAR COLOR 0xA030TEXTURE MAP 1 0xA200BUMP MAP 0xA230REFLECTION MAP 0xA220SUB CHUNKS FOR EACH MAPMAPPING FILENAME 0xA300MAPPING PARAMETERS 0xA351KEYFRAMER CHUNK 0xB000MESH INFORMATION BLOCK 0xB002SPOT

7、 LIGHT INFORMATION BLOCK 0xB007FRAMES (START AND END) 0xB008OBJECT NAME 0xB010OBJECT PIVOT POINT 0xB013POSITION TRACK 0xB020ROTATION TRACK 0xB021SCALE TRACK 0xB022HIERARCHY POSITION 0xB030 如前所述,如果我们想读取一个特殊的 chunk,我们必须要先读取它的父 chunk 。想象一下 3ds 文件是一棵树,我们要读取的 chunk 是一片叶子(并且我们是 地面上的一个小蚂蚁)。为了达到叶子,我们需要从树干开始

8、,并穿过通向叶子的所有树枝。例如,如果我们想到达 chunk VERTICES LIST,我们必须先读 取 MAIN CHUNK,然后是 3D EDITOR CHUNK,OBJECT BLOCK,最后是 chunk TRIA NGULAR MESH。其他的 chunks 可以安全地跳过。 现在让我们剪除树,只剩下将在本教程中使用的树枝:”vertices”, “faces ”, “mapping coordinates” 和它们的父 chunks。 MAIN CHUNK 0x4D4D3D EDITOR CHUNK 0x3D3DOBJECT BLOCK 0x4000TRIANGULAR MESH

9、 0x4100VERTICES LIST 0x4110FACES DESCRIPTION 0x4120MAPPING COORDINATES LIST 0x4140 下面是 chunks 的详细描述: MAIN CHUNK Identifier0x4d4d Length0 + sub-chunks length Chunk fatherNone Sub chunks3D EDITOR CHUNK DataNone 3D EDITOR CHUNK Identifier0x3D3D Length0 + sub-chunks length Chunk fatherMAIN CHUNK Sub chu

10、nksOBJECT BLOCK, MATERIAL BLOCK, KEYFRAMER CHUNK DataNone OBJECT BLOCK Identifier0x4000 LengthObject name length + sub-chunks length Chunk father3D EDITOR CHUNK Sub chunksTRIANGULAR MESH, LIGHT, CAMERA DataObject name TRIANGULAR MESH Identifier0x4100 Length0 + sub-chunks length Chunk fatherOBJECT BL

11、OCK Sub chunksVERTICES LIST, FACES DESCRIPTION, MAPPING COORDINATES LIST DataNone VERTICES LIST Identifier0x4110 Lengthvarying + sub-chunks lengthChunk fatherTRIANGULAR MESH Sub chunksNone DataVertices number (unsigned short) Vertices list: x1,y1,z1,x2,y2,z2 etc. (for each vertex: 3*float) FACES DES

12、CRIPTION Identifier0x4120 Lengthvarying + sub-chunks length Chunk fatherTRIANGULAR MESH Sub chunksFACES MATERIAL DataPolygons number (unsigned short) Polygons list: a1,b1,c1,a2,b2,c2 etc. (for each point: 3*unsigned short) Face flag: face options, sides visibility etc. (unsigned short) MAPPING COORD

13、INATES LIST Identifier0x4140 Lengthvarying + sub-chunks length Chunk fatherTRIANGULAR MESH Sub chunksSMOOTHING GROUP LIST DataVertices number (unsigned short) Mapping coordinates list: u1,v1,u2,v2 etc. (for each vertex: 2*float)现在 3ds 文件格式相当清楚了,我们现在看看本篇教程的代码。什么?你已经 完全迷惑了?让我们继续吧,随着本篇教程的讲述,对你来说,”chunk

14、”的结 构将会变得越来越清晰。毕竟,我们是程序员,我们能更好地理解 C,而不是喋喋不休的讲述。 l 简短的摘要简短的摘要 我们加载 3ds 物体并保存到我们的引擎所定义的格式需要的步骤是: 实现一个”while”循环(正如我们为纹理加载器所做的),不断地执行直到 到达文件的结束。 每个循环的反复读入 chunk id 和 chunk length。 使用一个 switch 分析 chunk id 的内容。 如果 chunk 是我们不需要读入的树的一部分,我们移动文件指针到一个新的 位置来跳过那个 chunk 长度,即通过将当前位置加上当前 chunk 的长度。这使 得我们可以跳过任何我们不需要读入的 chunk 和子 chunk。换句话说:让我们 跳到另外一个树枝!你是否有自己是猴子的感觉?:)如果 chunk 允许到达我们需要的其他 chunk,或是包含了我们需要的数据, 那么我们就根据需要来读取数据,然后我们移动到下一个 chunk。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号