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

发表于2018-04-16
评论0 6k浏览
角色动画中的骨骼运动遵循动力学原理,定位和动画骨骼包括两种类型的动力学:正向动力学(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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引