Skeleton.xml文件中记录了三种信息bones,bonehierarchy,animations。
<bones>
<bone id="0" name="Hips">
<position x="0" y="89" z="-4.03075"/>
<rotation angle="0">
<axis x="0" y="0" z="1"/>
</rotation>
<scale x="1" y="1" z="1"/>
</bone>
<bone id="1" name="Spine">
<position x="0" y="24" z="4.03075"/>
<rotation angle="0">
<axis x="0" y="0" z="1"/>
</rotation>
<scale x="1" y="1" z="1"/>
</bone>
第一部分bones记录骨架信息,骨骼数目,ID,名称。每个bone中信息,postion表示在它的父亲节点空间中,相对于父亲骨骼的位置,如果一个节点没有父亲,则这个位置是在物体空间中的位置。Rotation也一样。
这里给出了两个bone的信息,一个id号为0,名称叫”Hips”,这个节点是整个骨骼的根节点,它的position是在世界坐标系中的位置,也就是在世界坐标系中x="0" y="89" z="-4.03075",以x="0" y="0" z="1"这个矢量逆时针旋转angle="0"这个角度。第二个bone是”Spine”,其position是指相对于父结点”Hips”,也就是在父结点坐标系中位置为x="0" y="24" z="4.03075",在原始的资势中,所有节点的初始局部坐标系与世界坐标系方向相同。
<bonehierarchy>
<boneparent bone="Spine" parent="Hips"/>
第二部分bonehierarchy记录的是父子关系,在分析bone的形态和第三部分计算每个骨骼的位置都会用到。
<animations>
<animation name="BingBu" length="4.16667">
<tracks>
<track bone="Hips">
<keyframes>
<keyframe time="0">
<translate x="3.21886" y="-3.96461" z="-97.1298"/>
<rotate angle="0.230747">
<axis x="-0.543421" y="-0.82415" z="-0.159595"/>
</rotate>
<scale x="1" y="1" z="1"/>
</keyframe>
。。。。。。。。。。。。。
<track bone="Spine1">
<keyframes>
<keyframe time="0">
<translate x="0" y="0" z="0"/>
<rotate angle="0">
<axis x="0" y="0" z="1"/>
</rotate>
<scale x="1" y="1" z="1"/>
</keyframe>
<keyframe time="0.0416667">
<translate x="0" y="0" z="0"/>
<rotate angle="0">
<axis x="0" y="0" z="1"/>
</rotate>
<scale x="1" y="1" z="1"/>
</keyframe>
第三部分记录的骨骼的运动animations虽可能会有多个animation,每一个animation中,骨骼的每个点会产生一个track,意思也好理解,在一段运动中,一个结点位置连线不就是一个轨迹么。那么在这个轨迹track中,又以采样时间间隔,记录了每帧的信息。帧信息包括time,此帧的时间;translate,相对于父结点的位移,因为两骨骼结点的长度,就象人的前臂与肘结点,相对位置是不变的,一般都是0,对于根节点,就象例子给定的”Hips”,它的translate x="3.21886" y="-3.96461" z="-97.1298" 是相对于bone中定义的最初binding位置(binding position是在物体空间)的位移,rotate是相对于axis定义的方向矢量,绕这个矢量旋转angle这样一个角度的。这也就是为什么在animation中,一般root的keyframe中,translate量是非0的,表示在物体坐标中的位置,而非root的骨骼点的translate都是0的原因了。