在魔兽世界中,在人物奔跑的同时,使用挥手等表情命令,人物会在奔跑的同时作出其他动作,这是骨骼动作混合.
猎人中奔跑时开始拉弓时,身体会过渡到拉弓的动作,而不是瞬间变换为拉弓姿势,这是骨骼动作transitioning.
骨骼动作混合是作动作过渡的技术基础,目前看到有两种方案,一种简单,一种复杂.
简单的方案应该是起源于Quake,魔兽世界亦采用该方案,即,在骨架数据中预先标识某ID骨骼为上半身的根骨骼,依此标识下半身的根骨骼,手臂的根骨骼,腿的根骨骼.
使用骨骼动画架构可以很容易地,让奔跑的动作帧数据只作用于下本身的骨骼层次,即只作用于整个骨骼层次的子骨骼体系.让挥手或开枪的动作只作用上本身骨骼,最终的结果形成了动作混合.
复杂的方案是Weighted animation blending,为每个动作的每根骨骼标识它的权重,即标识每根骨骼在每个动作中的重要性,可以用1.0标识腿部骨骼在奔跑动作中的权重,用0.0标识上半身在奔跑动作中的权重.
与另一动作混合时,两个动作骨骼分别计算自身当前的骨骼帧运动数据,然后依据动作权重进行插值混合两者的运动数据,Jupiter,Nebula使用了该方案.其复杂不在程序上,而在美工制作上,程序代码上更优雅简单.
奔跑时拉弓就要让下半身保持奔跑动作,上本身从奔跑时的姿势过渡到拉弓姿势.Animation transitioning是要解决两个骨架姿势之间的过渡问题,从一个姿势过渡到另一个姿势,即从一个骨架数据渐转到另一个骨架数据,即在过渡间的人物骨架姿势由两个动作的骨架数据混合而成,一个数据渐增0->1,一个数据渐减1->0,这里的权重作用于整个骨架,称Weighted animation blending.这样的过渡是数据计算出来的,而不是美工设计出来的,有时会有变形出现.
这些方案都基于骨架层次体系,适合组合任意个骨骼动作.帧数据插值混合时,若姿势间相差过大,旋转超过180度,slerp计算会出现混乱.
References:
Quake3 source code
WowModelViewer's animation blending source code
http://www.circlesoft.org/DirectMesh2/DM2Spec/pages/Features.htm
Realtime Character Animation Blending Using Weighted Skeleton Hierarchies (该问题最好的论文)