在Axiom3D,或者说是Ogre的mesh的文件格式我们可能通过代码反推出相关格式,相关过程本来我是直接写的,后面发现相关流程写完后,我自己都看晕了,然后我就把一些过程用Execl整理出来,发现过程清晰多了,如下这张图:

这图是导入一个简单的mesh文件(没有包含动画)根据代码反推出的相关结构,这个Mesh文件的版本是1.30,不同的mesh版本格式略有不同,但是不会相差太大.

首先针对上面的图中一些需要注意的地方说下,其中上面的类型为Chunk的表示一个用ushort表示的类型,和这个Chunk块用int表示的长度,这个长度包含他自己,就是上面说的sizeof(ushort)+sizeof(int)=6.其中的Bool类型,就是一个字节,因为在C++里有时会把bool用int表示,这里不一样.就是C#里的一个字节.在标识红色的地方,就是把上面从IndexCount到Vertexbuff在读取一遍.这里关于Axiom中的数据组织可以看Axiom 3D:数据绑定基本流程,里面对于VertexData,IndexData都有介绍,这里的流程就是填充这二个对象.

Axiom3D中的mesh文件是二进制的,直接用文本打开全是乱码,虽然不像XML,文本等格式清晰易读.但是他本身的组织非常有条理,不是有个工具OgreXmlConverter,在看了相关代码后,我个人认为转成XML的难度一点不大,他本身就是用Chunk块组成了如树这种结构,因此在这个里面,最重要是各个Chunk块,如下是各块的一些信息.

  他这个节点的值很有规律,大家发现没,主要的节点,如Mesh,SubMesh,Geometry,MeshSkeletonLink,MeshLOD这些主节点采用如0xX000,而在各个主节点下如SubMesh(0x4000)下的分支SubMeshOperation(0x4010),SubMeshBoneAssignment(0x4100),可以看到每个主Chunk之间可以有0x1000(4096)个分Chunk.主分支的值是0x1000的整数倍.分支Chunk也可以由他的值判断是那个主分支下的节点.

这个节点中很多部分都是和动画有关,在这里,我们先分析简单的Mesh,也就是不包含动画里的,第一张是一个典型意义上的无动画的Mesh结构.让我们根据第一张图来分析下.

Mesh文件首先是他的头文件,分别是short类型,用于检查是否是Mesh的节点0x1000,如果不是,说明此文件有误,然后是Mesh的版本信息.

然后就是Mesh块本身的信息,前面说过块包含了类型Mesh(0x3000),长度二个信息.然后是否是动画,在这里,是false.

如果Mesh和本身的SubMesh共享数据,先看一个不共享数据的模型,在OpenGL OBJ模型的加载,在OBJ模型中,每一部分对应各自己的顶点,有各自的顶点索引.对应OBJ模型,我们可以想到Mesh的共享数据就是只有Mesh数据有顶点信息,而所有的SubMesh只持有对应Mesh数据的顶点索引信息.不共享数据就比较简单了,和OBJ模型一样,Mesh本身没有(不知有没本身有,但是子类不用的情况),而各个SubMesh保存自己的顶点信息与对应的顶点索引信息.一般来说共享数据时,Mesh本身才有Geometry(保存顶点信息)节点信息的.

接着上面,那么下一Chunk块应该是SubMesh,这块里首先读取对应的材质文件,然后加载材质到对应的Submesh中,然后读取是否和Mesh共享数据,如果是False的话,接着读取顶点索引信息和顶点信息,就是上图中第一个标颜色框的部分.如果是True的话,就只读取顶点索引信息.而相应顶点数据在Mesh中的Geometry节点中,这个节点读取数据就是上图中第一个标颜色框去掉前三行的部分.

针对前面标颜色框的那一部分,简单讲解下,对比Axiom 3D:数据绑定基本流程,前三行就是反序列化IndexData(顶点索引信息),另外的部分就是顶点信息VertexData,在这里面又分成VertexDeclaration的反序列化,里面包含VertexDeclaration中的VertexElement的各个属性的反序列化,五个short类型,可以看到VertexElement Chunk长度是16,也就是5*2+(2+4)的长度,2+4就是前面提到的这个Chunk块用int表示的长度,这个长度包含他自己,就是上面说的sizeof(ushort)+sizeof(int)=6.VertexDeclaration Chunk块的长度就等于VertexElement的个数3*16+6=54.接着VertexDeclaration的序列化后就是VertexData本身的数据反序列化,对应的是vertexbuffer chunk,这块里首先是绑定索引,然后是每个顶点包含数据总字节长度,对比上图这里是32位(在顶点信息里存的都是单精度浮点数据),意思有八个浮点数据(其实就是V3N3T2),.反序列化数据总长就是58*32=1856.然后就是VertexBufferData chunk块,在此块里存储着所有顶点让我们来检查一下.得到VertexBufferData chunk块总长度为1862.然后验证1862=6+1856,正确.在此块后面还有二个块,一个指定数据的组织形式,如是三角形还是四边形或是一点等,后面一块指定这个Mesh的包围盒和半径.

接着我们看MeshLOD Chunk,这个Chunk里,首先读取什么方式启用Lod,然后是Lod级别,然后指出是否手动生成Lod.如果是manual Lod,如果是那么就每lodlevel加载对应的manmal name,如果不是,就需要在每个lodlevel里就每个SubMesh读取MeshLODGenerated Chunk块,然后在此块读取第一个颜色块里的对应的IndexData,VertexData的数据.

针对Mesh的反序列化,有助于我们理解Mesh的结构,或者以后我们要自定义一些Mesh与别的格式文件的互转,熟悉Mesh文件结构还是有必要的.

PS:每次看到别人的开源代码,里面都是非常清晰,没啥冗余代码.不知到这种水平需要多久.

Axiom3D:Ogre中Mesh文件格式分析(一)的更多相关文章

  1. Axiom3D:Ogre中Mesh网格分解成点线面。

    这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...

  2. Ogre中Mesh的加载过程详述

    转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...

  3. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  4. Ogre内部渲染流程分析系列

    come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...

  5. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  6. 实践2.4 ELF文件格式分析

    实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...

  7. wav文件格式分析详解

    wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式 ...

  8. AMR音频文件格式分析

    AMR音频文件格式分析 1 概要 如今非常多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式.AMR,全称是:Adaptive Multi-Rate, ...

  9. PE文件格式分析

    PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...

随机推荐

  1. 【Unity】11.4 车轮碰撞体(Wheel Collider)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 车轮碰撞体 (Wheel Collider)专门用于创建汽车或其他移动交通工具. 车轮碰撞体是一种针对地面车辆的特殊碰撞 ...

  2. TCPConnectionTermination

    http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for- ...

  3. 每日英语:Foreign Tourists Skip Beijing

    Overseas tourists continued to shun Beijing through 2013. shun:避开,避免,回避 Amid rising pollution and a ...

  4. python(58):python下划线

    详解Python中的下划线 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情 ...

  5. 网摘Android调用WebService

    这边特别注意调用的.net WCF 接口的绑定方式.以前一直用的wxHttpbinding,一直连不上.改成BasicHTTPbinding就能连上了 上篇文章已经对Web Service及其相关知识 ...

  6. 【嵌入式】FS2410移植U-Boot-1.1.6

    移植环境 硬件平台:FS2410 U-Boot版本:u-boot-1.1.6 编译器:arm-linux-gcc version 3.4.1 U-Boot主要目录结构    U-Boot的 stage ...

  7. std::bind()图解

    参考:http://blog.think-async.com/2010/04/bind-illustrated.html 避免链接失效,就把文中图转过来了,这几张就清楚的说明了bind的用法和原理.

  8. pthread之线程堆栈

    转:http://blog.csdn.net/horstlinux/article/details/7666032 //先来讲说线程内存相关的东西,主要有下面几条: //进程中的所有的线程共享相同的地 ...

  9. Oracle中TO_DATE TO_CHAR格式

    TO_CHAR 是把日期或数字转换为字符串 TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_NUMBER 将字符转化为数字 TO_CHAR 使用TO_CHAR函数处理数字 TO_CH ...

  10. JIRA python篇之统计产品尚未解决的bugs

    [本文出自天外归云的博客园] 通过python中的jira类我们可以方便的操作jira,获取一些我们想要再加工的信息. 一些通过JIRA的JTL查询语句不方便直接搜索的过滤条件可以通过JIRA的pyt ...