跳转至

人物动画中的坐标转换

设想一个场景,你是一个动画小人,你在世界坐标系中有一个坐标\(p_w=(x_w,y_w,z_w)\),且旋转是\(q_w\),并且这时候你所做执行的动作是动画A中的帧t,下一时刻执行的动作是动画A中的t+1。那么该如何把动画中下一时刻的动作,映射到你的世界坐标系当中呢?

首先,你需要知道动画A中t+1相对于t的位置偏移\(p_{t+1->t}\),然后乘以一个t时刻旋转的逆\(q_t^{-1}\),是为了将偏移对齐到标准坐标系中,然后再左乘一个你当前世界坐标系中的旋转\(q_w\)(将偏移对齐到你自己的坐标系中),最后加上你本身的坐标\(p_w\),就得到了下一时刻的你的世界系坐标。

情况再发生变化,如果你这一时刻是执行动画A中的t,而下一时刻确需要执行动画B中的t+1,这该如何搞?

其实没啥区别,本质上可以抛弃动画A,获取动画B的t+1相对于t的偏移量,然后参照上述方法转换即可。

情况再再变化,如果你当前已执行完A动画,准备开始执行B动画,这时你知道你将会完整执行B动画,因此希望将B动画中的坐标批量对齐到自身坐标系中,从而不需要每个t都计算一次,这时该咋搞?

其实不难,首先求出首帧的位置\(p_b\)和旋转\(q_b\),然后\(q_r=q_w*q_b^{-1}\),这个\(q_r\)就代表将B动画旋转对齐到你自己当前朝向中,动画B中的每个时间步的motion都乘这个\(q_r\),就可以将旋转对齐。除此之外,还要将位移对齐,如果动画B的初始帧默认位置是0,则可以将动画B直接加上\(p_w\)进行对齐,如果初始不是0,则需要加上\(p_w-q_r*p_b\),实际上就是加上\(p_w\)之后,再减去动画B的初始位置偏移,消去其带来的影响。

总结,坐标转换的核心是理解旋转q,人物在任意时刻的旋转q,有两种理解方式,第一种是固定世界坐标系,q代表人物在时刻t时相对于世界坐标系的选择。第二种,假设人物当前方向向量的世界坐标系表示为\(v_w\),那么\(q^{-1}\)代表将向量v对齐到世界坐标系中标准方向所需的旋转。