核心思想
因名可知(Forward And Backward Reaching Inverse Kinematics),FABRIK算法的本质就是向前迭代一次,再向后迭代一次;
不同于CCD需要把骨骼掰来掰去,FABRIK只做骨骼的位移,从端点开始把第一个Joint强行拉到目标点位置,然后根据上一根Joint(还没动的那根)和目标点之间连一条线,然后把骨骼旋转到那根线上去;
由于骨骼长度固定,旋转后骨骼会溢出去,则下一根骨骼将这根溢出去的骨骼的反向端点作为目标点再做同样的事情,以此类推;
一直到根节点的骨骼,此时根节点会偏移原本的位置,此时就到了Backward的部分,从根节点开始,先把根节点拉回原本的位置,此时就和Forward步骤一样了,经过多次迭代就能越来越接近目标点;
FABRIK添加约束
根据约束求一个垂直平面,然后在上面投影,将投影点作为目标点;
FABRIK与CCD比较
- CCD运算效率比FABRIK高;
- CCD可能不收敛到最优解:由于它的贪婪性质,CCD 有时可能无法找到最佳解,尤其是在目标位置很难到达的情况下;FABRIK利用了全局性的考虑,避免了CCD的局部最优问题;
- CCD易受初始姿态影响,最终的解可能依赖于链条的初始姿态,有时可能出现关节过度扭曲的情况;FABRIK 考虑到整体结构,通常可以得到更自然的姿态;