FABRIK
在之前的博客角色动画研究 —— IK的三种结算方法和角色动画研究 —— 使用雅可比矩阵(Jacobian)来结算IK中,介绍了在游戏中常用的三角分析、CCD和在控制论中常用的雅可比矩阵的结算IK的方法。在这篇博客中将会介绍另一种IK结算方法,FABRIK。
FABRIK的工作原理
FABRIK的工作原理其实比较简单,相对于以计算效率见长的CCD来说应该还会更快一些,同时,效果也会更好。对于刚体骨骼的IK计算来说,应该是目前游戏开发这一块比较好用的IK结算算法了。
算法如下:
首先,针对一条从首端到尾端的bone chain,以及一个对应的Target point,先计算整条chain的长度,从而判断这个Target point是否可到达。
1.1 如果不可到达,则要求根骨骼进行移动。通常的情境类似于一个人如果伸直了手或者一只长颈鹿伸长了脖子也无法够到目标点时,则此时需要自己本身就向目标点挪(在使用Jacobian矩阵计算的环境下,此时矩阵为irregular,无对应的逆可以算出来)。
1.2 如果可以到达,那么这就意味着可以进行下一步的处理了,这里假设一共有五根骨骼(从根骨骼到末端骨骼分别是$p_0$, $p_1$,$ p_2$, $p_3$,$ p_4$),与目标位置(t)。如果整条骨骼链可以保证够得着的话,那么就可以开始进行FABRIK的处理。整体分为两步,首先,先从末端骨骼开始计算,先将最末端的骨骼$p_4$移到目标位置t处,此时骨骼$p_4$的位置为$p_4^{‘}$。
- 然后,将$p_3$和$p_4^{‘}$连成一条直线,通过原有的$p_3$和$p_4$的距离,将现在的$p_3$拉到与$p_4^{‘}$同样的距离处$p_3^{‘}$。
- 如是者三,一直处理到根骨骼$p_0$
- 再之后,再从根骨骼$p_0^{‘}$开始处理。由于根骨骼再整个迭代过程中是默认为不动的,因此再把根骨骼$p_0^{‘’}$移到原来的位置${p_0}$处,接着使用同样的距离约束,一直处理到尾骨骼$p_4$。
- 重复2~5的迭代过程,直到最终的尾骨骼位置与到达目标位置(或与目标位置距离小于某个预定值)停止。此时整个算法结束。
整体算法图示如下:
多端约束与环形约束
针对于人性骨骼(Humanoid Skeleton)来说,其实一套IK往往并不是一整根bone chain来进行结算,更多的应该是类似于bone tree(例如手掌的指头、双手同时追踪一个target)的架构。如果是使用CCD或者雅可比矩阵,则并不能在多条路径中取得平衡,但是针对FABRIK来说,多端约束是很容易实现的——从某一端开始进行结算,到达分叉口时,针对接下来的几条子路径挨个的处理一边,那么对应的sub-base就可以直接取得其平均值,从而兼顾到多端约束的表现:
类似的道理,FABRIK也可以使用在环形约束上。
与其他IK算法的比较
针对于普通的三角分析比较,FABRIK适用于完全未定的骨骼架构上。
针对于CCD,FABRIK可以有更好的收敛效果,甚至还可以用CGA(Conformal geometric algebra)进行收敛加速。
针对于雅可比矩阵操作,FABRIK最终产生的效果不一定比雅可比矩阵更好,但是计算量大大减少。#
骨骼约束
FABRIK的骨骼约束其实与一般的基于iteration的骨骼约束差不多,并且针对工程来讲,还是统一的骨骼约束方案比较现实,因此这里并不展开讲。如果以后有时间可以另起一篇博客进行讲解。
实际运用
FABRIK已经在UE4中被封装成了节点,可以针对链条骨骼模型、树状骨骼模型等直接进行操作,读者可以直接进行使用。如果感兴趣,可以阅读其源码。
<全文完>