Ogre中的Mesh文件主要包含:共享的顶点信息、subMesh部分、skeleton链接文件、骨骼和顶点索引和权重信息、LOD信息、包围盒信息、subMesh名字列表、边缘信息、Pose动画信息、Extreams信息和Pose动画关键帧信息。
Ogre中的skeleton文件包含:骨骼混合模式、骨骼绑定信息、骨骼层次信息、骨骼动画信息以及骨骼链接信息(可以链接到新skeleton文件)
Ogre中的subMesh信息包含:材质文件、是否是共享文件、顶点索引数、是否是32位的索引、索引数据、读取几何信息(Geometry)、当前subMesh的形状(三角形、四边形等)、当前subMesh的骨骼和顶点权重关系以及纹理过滤信息等。
Ogre中的Geometry信息包含:顶点数、几何顶点信息、几何顶点数据。
以下我会分四小节分别介绍以上这些具体的数据:
2.1 Mesh文件
Mesh的内存结构类似如下:
除了SubMesh和Geometry几何体信息之外,其他我会稍微介绍一下它们的数据结构:
1. 骨骼和顶点权重值的数据结构类似如下:
<vertexIndex, boneIndex, weight>... ....
顶点号,骨骼号,以及当前骨骼对顶点的权重值。
2. LOD信息:
就是每一层的数据,如果LOD层数为1,说明没有LOD信息,它的数据结构类似如下:
<strategyName>
<numLevels>
<isLodManual>
<lod1 read lod detail information>
<lod2 read lod detail information>
... ....
3. 包围盒信息:
就是包围盒和包围球半径:
<minx, miny, minz>
<maxx, maxy, maxz>
<radius>
4. subMesh索引:
就是subMesh索引和名字的对应关系:
<subMeshIndex, subMeshName>... ......
5. 边缘信息:
它的数据结构如下:
<lod index>
<isManual>
<read edge lod infor>
6. Pose偏移值信息:
只要是每个顶点的偏移值,类似的数据结构如下:
<name, target, isIncludesNormal>
<vertexIndex, offset, offsetNormal>... .... ....
7. 顶点动画信息
就是每个动画,每个动画的Track和关键帧信息,类似的数据结构如下:
<animations>
<animation name, length>
<baseAniName baseKeyTime>
<track aniType, target>
<keyFrame1 time, vertexData />
<... ...>
</track>
<.... ....>
</animation>
<... ...>
</animations>
可以包含多个Animation, 每个Animation可以包含多个tracks,每个tracks可以包含多个KeyFrams,逐层读取数据。
8. Extreams信息
表示Mesh数据的极值点,可以用来帮助entity排序的。
数据结构如下:
<subMeshIndex>
<vertex><vertex><.. ...>
2.1.1 SubMesh部分
subMesh包含相对应的材质名称、是否使用共享点、顶点数据、顶点索引数据、当前subMesh的类型(四边形、三角形等)、骨骼权重信息、纹理参数信息等。
大概的数据类似如下:
<subMesh>
<material name=”” />
<useSharedVertices=false />
<indexCount=100 />
<isUse32Bit = false />
<index 0 1 2..../>
<geometry ../>
<operation=”triangle” />
<boneAss vertexIndex=”1” boneIndex=”2” weight=”1.0” />
<... .../>
<aliasName=”” textureName=”” />
</subMesh>
2.1.2 Geometry部分
Geometry部分就是顶点数据部分,包括顶点位置、法向、纹理坐标、切向坐标、颜色、副法向、混合索引、混合权重等等。
Geometry在内存上,主要包含两个数据部分:数据格式定义部分和具体数据部分。
数据格式定义部分主要包含数据的格式、含义、索引号、偏移值等等。
数据定义部分主要包括顶点位置等具体数据部分。
数据格式大概如下:
<vertexElement source=”1” type=”VES_POSITION” semantic=”FLOAT_3” offset=”0” index />
<vertex buffer bind=”1” vertexSize=”20” x=”10” y = “11” z = 12” />
2.2 Skeleton文件
这部分的数据主要包含以下几个部分:
1. 混合模式:平均混合/加权混合
2. 骨骼信息:骨骼信息及绑定姿势信息
3. 骨骼父子关系:骨骼父子关系
4. 骨骼动画信息:具体的动画信息
5. 额外的动画链接文件信息。
这部分的数据是相对独立的,里面的骨骼信息是跟相对应的mesh文件中的骨骼索引相对应的,所以可以这么说,一份mesh对应一份skeleton文件,当然skeleton文件还可以在链接外在的skeleton文件。
这部分的数据格式类似如下:
<skeleton blend=”avage” />
<bone name=”head” handle=”1” positon=”3 5 1” rotate=”3 1 4 6” scale=”1 1 1” />
<... .../>
<childHandle=”1” parentHandle=”2” />
<... .../>
<animation name=”test” length=”10”>
<basekeyFrame Name=”tt” baseKeyTime=”2” />
<track boneHande=”2”>
<keyFrame time=”1.1” position=”2 2 2” rotate=”1 2 3 4” scale=”1 1 1” />
<.... ...>
</track>
<... ...>
</animation>
<... ...>
一般情况下,骨骼动画是不会包含缩放信息的,你想象一下,自己的手可以伸缩,那是多么的可怕。。