首先,说明两个文件的格式问题:
mesh文件格式
每个mesh由多个submesh组成,每个submesh由faces部分, geometry 部分,boneassignments部分组成。faces部分用 顶点索引描述了物体的每一个三角形面。geometry部分由两个vertexbuffer组成,第一个描述了每个顶点的坐标和法线,每二个描述了顶点的UV,boneassignments部分描述了每个顶点所附着的骨头组及权重。
skeleton文件格式
整个skeleton文件分成了三部分bones,bonehierarchy,animations。
bones部分描述了每一块骨头的具体情况
bonehierarchy,即骨骼的继承关系,描述了骨骼是怎么样组成骨架的。
animations动画集部分。动画集,由多个动画组成。 每个动画由一系列的track组成,每个track由一系列的Keyframe组成。一个track描述了单块骨头在每个keyframe所描述的时间点的位移和旋转。
你提的问题要注意两点:
骨骼系统是树状结构,根节点就是髋骨。骨头的位置是相对位置,也就是你所谓的从根骨一直叠加变换到子骨。
顶点是由动画变换之后的骨头决定的,也就是顶点所附着的骨头组及权重决定的。
最后,我在ogre中好像没见到过反向动力学,不过也不难,把骨头的继承关系和相对变换数据重新组织一下(3dmax支持反向动力),从下肢(或四肢)反向递推就可以了。顶点的权重可以不变。
求代骨骼动画的顶点的世界坐标 公式是:
顶点世界坐标 = 顶点坐标 * 骨骼1的世界变化矩阵 * 权重1 + ........。
顶点坐标就是mesh里面记录那个,骨骼是树状结构的,所以其世界变换矩阵是从根骨骼一路算下来的。而导出的时候,会记录根骨骼和你模型的局部坐标系原点的位置关系,等一个矩阵m1,当你的模型绑到scenenode的时候,node 的世界变化矩阵m2,m2 * m1 就得到根骨骼的世界变化矩阵。而后就没有然后了