Mecanim动画系统(十)IK(反向动力学)动画
发表于2018-04-16
角色动画中的骨骼运动遵循动力学原理,定位和动画骨骼包括两种类型的动力学:正向动力学(FK)和反向动力学(IK)。其中IK可以使人物和场景更加贴合,从而达到更加真实的游戏效果。
在一套FK系统中,一般的规则是:层级里的一个父节点驱动任意子节点的运动。例如,如果你移动前臂(父),手腕(子)就会随之运动。但是,如果你移动腕节点,前臂还将停留在原处。
这是制作动画物体(例如一个行走的角色)的手臂的一种简单、直观的方法,因为动画制作者只需要考虑手臂相对应父节点的运动,而不是相对于整个空间的运动。同时应该注意的是,在使用FK制作动画时要给每一个为特定姿势而旋转的关节设置旋转关键帧。不过,当角色手臂需要抓住场景里的某些物体时,如楼梯的扶手,FK就不是最好的使用方法了。
那么与之相比,IK就是一种子节点驱动父节点运动的动画制作方法。
依然使用手臂做为例子,如果使用IK移动手腕,计算机将计算如何移动和旋转手臂的其他父节点,以使其完成想要的造型。
要为角色设置IK,通常需要拥有与角色互动的场景四周的物体,然后通过脚本设置 IK,特别是通过此类动画器 (Animator) 功能: SetIKPositionWeight、 SetIKRotationWeight、 SetIKPosition、 SetIKRotation、 SetLookAtPosition、 bodyPosition、 bodyRotation。
我们首先要在Layer上勾选上IK Pass,如下图
然后在Animator层级的角色上,添加一个脚本。
using UnityEngine; using System.Collections; public class TestIK : MonoBehaviour { protected Animator animator; public bool ikActive = false; public Transform rightHandObj = null; public float ikWeight = 1.0f; void Start () { animator = GetComponent<Animator>(); } //这是一个回调方法 void OnAnimatorIK () { if(animator) { if(ikActive) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,ikWeight); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,ikWeight); if(rightHandObj != null) { animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); } } else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); } } } }
并给脚本的属性字段附上相应的值(ikActive要勾选)。旋转或者移动rightHandObj就可以看到对应的效果了。
来自:https://blog.csdn.net/u010848412/article/details/79293074