Unity3D研究之代码使用IK动画片

Unity3D研究之代码使用IK动画

IK动画全名是Inverse Kinematics 意思是反向动力学,就是子骨骼节点带动父骨骼节点运动。比如跳街舞的少年用手撑着身体在地上转圈,手就是子骨骼,胳膊身体就是它的父骨骼,这时运动手就需要带动胳膊身体来移动。

 IK动画可以在3DMAX 或者Maya中制作(不在本篇的讨论范围内),本篇我么说说在程序中如何动态调用IK动画。IK动画需要使用Unity4新版的动画系统,如果对新版的动画系统不是很了解的朋友建议看看。Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)          如下图所示,设置模型的骨骼并且给模型添加AnimatorController控制器。如果不会添加详细请看上一篇文章。

Unity3D研究之代码使用IK动画片

 

在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里勾选IK Pass。

Unity3D研究之代码使用IK动画片

 

 

代码方面直接使用API中的,我懒得写了,我给大家详细的解释一下。

usingUnityEngine;
usingSystem;
usingSystem.Collections;

[RequireComponent(typeof(Animator))] 

publicclassIKCtrl:MonoBehaviour{

 //动画控制
 protectedAnimator animator;
 //是否开始IK动画
 publicbool ikActive =false;
 //右手子节点参考的目标
 publicTransform rightHandObj =null;

 voidStart()
 {
  //得到动画控制对象
  animator =GetComponent<Animator>();
 }

    //a callback for calculating IK
    //它是回调访法。
    //前提是在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里必须勾选IK Pass!!!
 voidOnAnimatorIK()
 {
       if(animator)
       {

           //if the IK is active, set the position and rotation directly to the goal.
            //即或IK动画后开始让右手节点寻找参考目标。
   if(ikActive)
   {

               //weight = 1.0 for the right hand means position and rotation will be at the IK goal (the place the character wants to grab)
               //设置骨骼的权重,1表示完整的骨骼,如果是0.5哪么骨骼权重就是一半呢,可移动或旋转的就是一半,大家可以修改一下参数试试。
      animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1f);
      animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1f);

      //set the position and the rotation of the right hand where the external object is
    if(rightHandObj !=null)
    {
     //设置右手根据目标点而旋转移动父骨骼节点
     animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
     animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
    }     

   }

            //if the IK is not active, set the position and rotation of the hand back to the original position
   //如果取消IK动画,哪么重置骨骼的坐标。
   else
   {   
    animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);
    animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);    
   }
  }
 }  
}

  如下图所示,图中哪个小球就是子节点参考的目标。,在Scene视图中移动哪个小球,你会发现主角的右手开始IK动画。

Unity3D研究之代码使用IK动画片

 

 

上面代码中我们IK的是主角的右手,实际上IK动画支持两个手和两个脚。

// AvatarIKGoal.RightHand 右手
// AvatarIKGoal.LeftHand  左手
// AvatarIKGoal.LeftFoot  左脚
// AvatarIKGoal.RightFoot 右脚
animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);

OK!快快用代码来动态的制作你的IK动画吧,欢迎一起讨论技术,如有疑问请留言给我哇咔咔~