Mecanim 动画系统(十)反向动力学(Inverse Kinematics)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010848412/article/details/79293074

角色动画中的骨骼运动遵循动力学原理,定位和动画骨骼包括两种类型的动力学:正向动力学(FK)和反向动力学(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就可以看到对应的效果了。

参考:

http://docs.manew.com/Manual/InverseKinematics.html

http://blog.csdn.net/huang9012/article/details/18183437

猜你喜欢

转载自blog.csdn.net/u010848412/article/details/79293074