这篇博客介绍了逆向运动学(Inverse Kinematics, IK)的三种结算方法。
背景
IK在角色动画的表现中有着很重要的地位。通常的角色动画都是使用FK(Forward kinematics)来进行计算,这种计算方法中父骨骼的变换与子骨骼的变换决定了子骨骼最终的位置。而IK则相反,IK是先决定子骨骼的变换,然后再推导父骨骼需要由此而产生的变换。
就如同人平时的行为一样——往往是手掌的位置和旋转需要先确定(拍到墙壁上的某个点,抓住某个东西等……)后,再进行手肘变换的计算。这也就意味着IK的结算可能产生未知个数的解(0个或多个……),有可能手掌根本抓不到一个地方,或者手掌到了一个地方手肘可以有多个形态和变换。
和机器人控制论很像……不是吗?其实IK结算在机器人的研究中也有很大的作用。
几何分析
如果说骨骼架构比较简单(例如肩->肘->腕,髋->膝->踝等),那么完全可以通过几何分析来进行IK的结算。
例如手臂上臂长度为 l1 ,下臂长度为 l2 ,再假设每个关节都只有两个旋转自由度,如下图。
那么最末端的关节便有了一个活动范围(reachable workspace),当结算IK开始的时候,就需要先确保末端关节在这个活动范围内:
当末端关节的位置确定之后,骨骼架构中对应的两个关节偏转角度 θ1 和 θ2 就可以通过几何方法确定了。
令尾关节最终位置为 (X,Y) ,连接首关节和尾关节后,可以分析出最终解应该有两个,这两个解关于直线 (0,0),(X,Y) 对称。
最终可以使用余弦定理来计算出最终的 θ1 和 θ2 ,推导过程如下:
因此有:
根据余弦定理:
得:
又根据余弦定理:
有:
这样一来也就获得了 θ1 和 θ2 的值,需要注意的是 cos 函数是偶函数,因此需要考虑到 ±θ 的情况。实际上,在大多数的游戏中的人形骨骼的IK都是通过这种方式实现的。
在计算出这两个角度之后,就可以直接影响对应的关节位置了。例如机械臂可以进行角度的插值而进行平滑的IK表现,而游戏中则可以直接进行设置。
CCD(循环坐标下降)
我第一次接触这种结算方法是在阅读Game Programming Gems Ⅲ的时候。这种方法的好处是计算简单而且速度快,并且能够很好的适配骨骼的原本约束,缺点则是最终效果可能并非完全尽如人意,有可能会产生扭曲的关节。游戏《孢子》中的骨骼IK结果就是使用CCD来进行计算的。
CCD的具体实现已经在对应的论文中有很清晰的描述了,传送门。
具体实现的方法如下:
- 从骨骼链上最深的子骨节开始进行处理,将这段骨节相对于原点进行旋转从而使它指向效应点。
- 将这个骨节的父节点针对于原点进行旋转,以使得此父骨节的原点到新旋转的子骨节端点的连线指向效应点即可。
- 对每个骨节进行1~2步骤的处理。
- 上述步骤进行多次循环从而得到更加稳定的值。
效应图如下:
一般来说骨骼的运动是有约束的(例如肘部的可旋转角度一般不会超过180°,如果你可以,我们不妨做个朋友……),因此可以在进行上述步骤1时进行约束。
当然,越严格的约束就意味着需要更多次的迭代处理才能获得一个比较稳定的值。
使用雅可比矩阵(Jacobian)来进行IK结算
因为涉及到很多线性代数的点,比较复杂,所以决定另起一篇。
参见 角色动画研究 —— 使用雅可比矩阵(Jacobian)来结算IK
<全文完>