IK FK无缝切完美解决方案

IK和FK是绑定基本概念之一,动画师在面对各种情况所使用到的动力学方式是不一样的,有时需要在IK和FK之间进行转换(尤其是手脚),例如在走路时你可能用FK的手臂,做俯卧撑时就要用到IK了。如果仅凭肉眼来进行对位的话效率非常低下而且不够准确。作为一个出身动画师的动画TD,深知IKFK无缝切换在动画制作过程中的必要性。其实这个功能并不复杂,只要在绑定的时候做一些小小的配合,无缝切工具可以很快就完成开发。不管你是一个绑定师还是一个动画师,掌握此技能都将使自己或整个团队受益。下面介绍一下使用脚本来进行切换的思路(只针对手和脚的IK和FK,不考虑拉伸),并附上自己开发的工具DH_IKFKSW_Generator供有需要的小伙伴学习和使用。

 

单骨骼状态下的IKFK绑定方式

这种状态下的IK和FK之间进行无缝切是最简单的,你只需要进行简单的数值传递就可以了。以手为例,假设你的极向量默认放在elbow_jnt的位置,思路为:

IK==>FK:

  1. 获取shoulder、elbow及wrist三个部位的骨骼的世界rotate坐标信息;
  2. 粘贴到FK的shoulder、elbow及wrist三个部位的控制器上,完成。

FK==>IK:

  1. 获取elbow骨骼的世界translate坐标信息、wrist骨骼的世界translate和rotate坐标信息;
  2. 将第一个信息粘贴给elbow的极向量,第二个信息粘贴给IK的wrist控制器,完成。

当然了,完成上述数值传递之后别忘了把IKFKBlend的属性打成相应的IK或者FK状态对应的数值。

这里面最关键的一点其实是如何获取及传递数值。需要注意的是,你传递的是世界坐标值,而不是Channel Box中的数值,因此你需要借助xform这个函数来获取及传递世界坐标数值。以shoulder_jnt为例,使用mel来进行获取世界rotate坐标信息的语句为:

$shoulder_rotateValue = `xform -q -ws -ro shoulder_jnt`;

现在我就将shoulder_jnt这根骨头的世界rotate坐标信息放到$shoulder_rotateValue这个变量里面了,这个变量里面有三个数值,对应着xyz三个轴向。粘贴到shoulder_ctrl的语句为:

xform -ws -ro  $shoulder_rotateValue[0]  $shoulder_rotateValue[1]  $shoulder_rotateValue[2]  shoulder_ctrl;

按照此思路,很短时间内便可以实现该单骨骼角色的IKFK无缝切换。

多骨骼状态下的IKFK绑定方式

当然现在比较主流的做法是用三套骨骼,一个蒙皮,IK一套FK一套,然后使用约束来进行IK和FK之间的切换(例如国内特别受欢迎的advanced skeleton也是用多套骨骼来实现切换的)。这时候你仍然可以使用上面那个方法来实现无缝切换,只是由于很多绑定师不会做得很严格统一和精细,你可能会碰到一些麻烦(例如肘部对不上、手腕旋转方向对不上等等)。网上很多的教程是采用创建临时locator的方式,这种方式只是在某些时候管用,问题太多我就不赘述了。

 

                                                                                Advanced skeleton的三套骨骼

问题都出在FK转IK的时候,需要一个更好的方法来记录一下肘和手的位置。这里是我推荐的方法,只需要给绑定增加两个节点即可:

  1. 将角色打成T pose(一定要做);
  2. 复制一下极向量控制器和IK手腕控制器的变换节点(选中这两个,ctrl+D,然后删除所有子层级,将outliner左上角display—shapes打开后删除这两个的shape节点);
  3. 将复制出来的极向量控制器的变换节点p给FK的shoulder控制器,将复制出来的IK手腕控制器变换节点p给FK的wrist控制器。

完成以上三步就能够在调整FK的时候完美记录肘部和手腕的位置了。复制出来的两个节点会实时跟踪肘部和手腕的位置,需要切换成IK的时候只需要查询一下这两个节点的位置,然后赋给IK的两个控制器就可以了。

有的小伙伴可能就有疑问了:为什么还要复制IK手腕控制器的变换节点呢?直接将FK手腕控制器的位置信息传递给IK手腕控制器不就好了吗?我最初也是这么想的,很多人开发脚本也是这么教这么做的。然而事实上由于绑定不规范等诸多原因,有时候就算IK和FK控制器世界坐标相同,手腕的位置仍然会有变化。因此我索性将IK的变换节点也提取出来,用它自己的变换节点来追踪,这样总不会出错了。

各位绑定师们可以基于以上思路尝试一下。实际上不管是单骨骼还是多骨骼,都可以采用新增两个节点的方式来记录极向量和IK控制器的位置。

 

 

猜你喜欢

转载自blog.csdn.net/u012945135/article/details/82987508
ik