unity之Mecanim动画系统学习(5)
今天来学一学IK。
IK
什么是IK?IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学),而IK则倒过来,由骨骼子节点带动骨骼父节点,就比方说,人物走路是父节点带动子节点,但是在你走路的时候,突然扭了一下,你的身体有点失衡,那么人物就会因此作出相应的动作,此时就是脚部的子节点带动身体中的父节点运动。
Unity3D本身已经带有了IK的功能([http://docs.unity3d.com/Manual/InverseKinematics.html]),我们接下来就对IK进行一下简单的学习和使用。
插件——FinalIK
该插件是对Unity本身的IK的优化和增强,可以模拟出更加真实的效果
添加链接描述
演示一下
注意,在使用IK前,当然要开启IK的功能
当然,开启还是没用的,还需要脚本才能起作用!
using UnityEngine;
using System.Collections;
public class TestIK : MonoBehaviour
{
public Transform lookAtTarget;
public Transform leftHandTarget;
public Transform rightHandTarget;
public Transform leftFootTarget;
public Transform rightFootTarget;
private Animator _animator;
void Start()
{
_animator = this.GetComponent<Animator>();
}
void OnAnimatorIK(int layerIndex)
{
if(_animator != null)
{
//仅仅是头部跟着变动
_animator.SetLookAtWeight(1);
//身体也会跟着转, 弧度变动更大
//_animator.SetLookAtWeight(1, 1, 1, 1);
if(lookAtTarget != null)
{
_animator.SetLookAtPosition(lookAtTarget.position);
}
_animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
_animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
if(leftHandTarget != null)
{
_animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandTarget.position);
_animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandTarget.rotation);
}
_animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
_animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
if(leftHandTarget != null)
{
_animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandTarget.position);
_animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandTarget.rotation);
}
_animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
_animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
if(leftHandTarget != null)
{
_animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootTarget.position);
_animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootTarget.rotation);
}
_animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
_animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
if(leftHandTarget != null)
{
_animator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootTarget.position);
_animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootTarget.rotation);
}
}
}
}
控制IK的脚本必须添加到OnAnimatorIK方法中才会生效
上面的内容原本作者是没有接触过的,因为是个小白,因此参考了大佬的作品,奉上链接
添加链接描述
加油!