骨骼动画动画重定向的过程主要是针对骨骼信息,对于蒙皮过程没有任何影响。而动画信息,可以理解为每一帧中所有骨骼数据信息的集合。我们可以这样更加形象地理解:动画就是每一帧为模型制作一个Pose(姿势),在每帧之间的姿势可以通过差值获得。
为了更加清楚地描述动画重定向地原理,我们截取某一帧的姿势来进行分析——在解决了每一帧的姿势重定向之后,整个动画的重定向,也就是在每一帧都进行姿势的重定向即可。
假设有两个模型,它们的骨架分别是A和B,我们拥有A骨架对应的动画数据,想把这个动画数据应用在B骨架上。直接应用是否可以?当A骨架和B骨架完全一样的时候,直接应用是可以的,但通常动画重定向要处理的是骨架不太一样的情况。这些不一样的情况有很多种,比如:
a) 骨骼数量不一致;
b) 骨骼父子关系不一致;
c) 骨骼名称不一致;
d) 骨骼本身的长度等数据不一致。
对于前几种不一致情况的处理,我们在基本原理的部分先不进行分析,对于骨骼数量一致、骨骼父子关系也相同这样最为简单的情况,我们来看一下动画重定向的基本方式。
先明确在这种情况下,直接应用A的动画数据到B上会存在的问题。想象一下,A是一个身高为1.8m左右的大人骨架,而B是一个身高为1.5m左右小孩骨架,A的动画信息记录的骨骼位置(Position)、旋转(Rotation)和缩放(Scale)信息都是针对于大人的,比如经过最终的计算,在Idle动画中的某一帧姿势中,模型空间下A的Head这根骨骼可能在距离地面1.7m这样的位置,而同样的动作让一个小孩B来做,也把Head骨骼放置在1.7m的位置,蒙皮之后的结果会非常奇怪,出现拉伸等问题,因为B的身高整个才是1.5m。
为了解决这个问题,或者说一个正确的动画重定向过程,是基于所谓的参考姿势(Reference Pose)的。通常情况下,会把T-Pose作为参考姿势。引入参考姿势之后,动画数据不再直接应用到目标骨架上,而是把动画姿势与参考姿势的差异应用到目标骨架上。a1是A骨架的参考姿势,b1是B骨架的参考姿势,动画中某一帧的姿势是a2,我们想得到的结果是b2,我们认为,a2与参考姿势a1的差异应当和b2与其对应的参考姿势b1的差异相同,即: