前几天在实现编辑器特效跳过时间的时候,发现循环调用update的方法对骨骼动画没有效果。没办法那就看看骨骼动画的原理吧。
一、mesh文件和skeletion文件中的内容
1、mesh文件
中的主要信息
(1)vertexbuffer(顶点缓冲区)
像第一个vertex标签中
<vertex>
<position x="-58.356" y="152.38" z="1.094436"> //顶点位置
<texcoord u="1.0831" v="-0.9544"> //纹理坐标
<colour_diffuse value="1 1 1 1"> //顶点颜色
</vertex>
(2)faces(面)
这部分保存的是由前面说的顶点构成的面,每个面有三个顶点。骨骼动画中的渲染就是以这些面为单位的。比如第一个face标签中<face v1="2" v2="35" v3="0">表示这个面由第2、35、0个顶点构成。
(3)boneassignments(顶点和骨骼的关联)
这部分记录每个顶点受那根骨骼影响,也可以说是记录每个顶点附着在哪根骨头上,具体情况像下面这样子。
比如第一个vertexboneassignment标签
中
<vertexboneassignment vertexindex="0" boneindex="53" weight="1">,下标是0的顶点附着在下标是53的骨骼上,(weight)权重是1,关于weight这个参数,表示的是骨骼对顶点影响的权重,因为一个顶点可能受多个骨骼影响,那么影响的程度就由weight来决定。但是这个权重的和必须是1.
2、skeleton文件中的主要信息
(1)bones部分主要保存模型的骨骼信息,每根骨骼有一个起始的位置,和一个指向 。
像第一个bone标签中
<bone id="0" name="Joint1"> // 这根骨骼的id等于0,名称是Joint1
<position x="0.185046" y="0.51196" z="0"> //骨骼的起始位置是
<ratation angle="0">
<axis x="1" y="0" z="0"/> //骨骼的指向
</rotation>
<bone>
(2)bonehierarchy(骨骼之间的继承关系)
这部分记录骨骼之间的关系,记录每根骨骼的父骨骼,这样就能组成一幅骨架了。
像第一个bonepatent标签中<boneparent bone="Joint2" parent="Joint1">,Joint2的父骨骼是Joint1,表示他连接在Joint1上,记录骨骼关系的目的是在他的父骨骼位置发生变化或者旋转的时候,也要用父骨骼的变换矩阵乘以子骨骼的变换矩阵。就是让子骨骼受父骨骼的影响。
(3)animations (动画集部分)
所谓骨骼动画,那就得有动作才行,animations部分保存的就是骨骼动作的信息。大概的形式是这样的