在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. 查看Android内存的8中方法

    方法一: 通过手机上Running services的Activity查看,可以通过Setting->Applications->Running services进. 关于Running ...

  2. 机器学习算法实现解析——word2vec源代码解析

    在阅读本文之前,建议首先阅读"简单易学的机器学习算法--word2vec的算法原理"(眼下还没公布).掌握例如以下的几个概念: 什么是统计语言模型 神经概率语言模型的网络结构 CB ...

  3. 微信小程序启动过程分析

    1.微信客户端在打开小程序之前,会把整个小程序的代码包下载到本地. 2.紧接着通过 app.json 的 pages 字段就可以知道你当前小程序的所有页面路径: { "pages" ...

  4. FTP主动模式和被动模式的区别【转】

    转自:http://www.cnblogs.com/xiaohh/p/4789813.html 基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口 ...

  5. 网络广告CPS/CPC/CPV/CPM/CPA分别是什么意思

    CPA:注册广告(一般按用户来计算)CPC:点击广告(一般按一千个ip计算)CPS:消费广告(用户通过你的网站中投放的广告,达成消费,有提成)CPM:展示广告(展示广告,一般的视频比较多)CPV:按照 ...

  6. 【转】Android的root原理

    转自知乎:https://www.zhihu.com/question/21074979 @Kevin @张炬 作者:Kevin链接:https://www.zhihu.com/question/21 ...

  7. poj1988(判断一个结点下面有多少个结点,推荐)

    题意:有n个元素,开始每个元素自己一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈.第二种操作是询问含有x元素下面有多少个元素. 6 M 1 6 C 1 M 2 4 M 2 6 C ...

  8. windows下html2jade批量转换

    将项目中的代码转换为jade,使用html2jade批量转换 @echo off SETLOCAL ENABLEDELAYEDEXPANSION for %%i in (*.html) do ( ht ...

  9. 【转】eclipse运行 Ant报错Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner. Program

    原文地址:http://blog.csdn.net/jiangtaoking/article/details/49151763 Could not find the main class: org.e ...

  10. /.well-known/apple-app-site-association

    Technical Q&A QA1919 Incoming requests for /.well-known/apple-app-site-association file Q:  Why ...