Axiom3D:Ogre中Mesh文件格式分析(一)
在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文件格式分析(一)的更多相关文章
- Axiom3D:Ogre中Mesh网格分解成点线面。
这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...
- Ogre中Mesh的加载过程详述
转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...
- Axiom3D:Ogre动画基本流程与骨骼动画
在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...
- Ogre内部渲染流程分析系列
come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...
- Unity中Mesh分解与边缘高亮加上深度检测
一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...
- 实践2.4 ELF文件格式分析
实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...
- wav文件格式分析详解
wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述 WAVE文件作为多媒体中使用的声波文件格式 ...
- AMR音频文件格式分析
AMR音频文件格式分析 1 概要 如今非常多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式.AMR,全称是:Adaptive Multi-Rate, ...
- PE文件格式分析
PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...
随机推荐
- Android面试、开发之高手 编码规范与细节
凝视 [规则1]必须用 javadoc 来为类生成文档.不仅由于它是标准.这也是被各种java 编译器都认可的方法. [规则2]在文件的開始部分应该有文件的说明信息,应包括例如以下信息: (1)版权信 ...
- poj 1868 Antiarithmetic? 推断序列中是否有等差子序列
#include<iostream> using namespace std; const int maxN=10024; int n,vis[maxN],a[maxN]; bool fi ...
- 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理
之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...
- 【Android】json格式详解
JSON有两种结构 1. “名称/值”对的集合(A collection of name/value pairs). 不同的语言中,它被理解为对象(object),记录(record),结构(s ...
- Ant编译android程序
http://blog.csdn.net/xyz_lmn/article/details/7268582 这一篇主要做了创建android项目.update已存在项目.ant编译项目. 一,准备ant ...
- SpringBoot 跨域 Access-Control-Allow-Origin 问题
https://blog.csdn.net/taoism_jerry/article/details/79695336 **************************************** ...
- 【Linux】crontab 每隔1小时 2小时的执行job写法
crontab -l crontab -e 每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每2小时执行 0 */2 * * * 每天执行 0 0 ...
- iOS增加pch预加载文件
1.) 打开你的Xcode工程. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File ...
- Android,我待你入初恋啊,你就别坑我了!
最近做了好多东西,东忙忙,西茫茫,ms最后都空欢喜一场. 1.小黄图,说是小黄图,其实只是网上爬下来的写真阿自拍阿什么的,绝对没有反党反共淫秽内容.后来的后来,admob被google停用了,不开心. ...
- 《5天学会卡西欧fx-5800p之实操视频教程(初级)》目录和我的工作室现场曝光
很多人给我讲,想让我录制一份卡西欧fx-5800p的视频教程,我也一直在准备,准备了半年,录制视频真的不是件容易的事,条件有限,而且工作也很忙,中途还会有想放弃的念头,真的是花费了我很多的心血,但不管 ...