Unity Animator動畫狀態機 深入理解(二)IK控制


IK還是一個很神奇和實用的東西啊,起碼可以用代碼來控制人物骨骼位置還是很爽的。因為不是動畫師~

這篇可能跟Animator沒啥關系了哈,都是代碼層的。

看了一官方的案例,老的,有些問題,自己修改了一下,達到了效果。

官方建議把所有的IK操作放在OnAnimatorIK中進行。

如果我們要進行IK操作,先要綁定IK位置。IK能控制的官方都給了enum

 

然后我們要設置權重Weight,范圍為0~1,這里都設成1

1             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1.0f);
2             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
3             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
4             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
5             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
6             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
7             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
8             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
9             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);

如果我們把LeftFoot的權重設為0,則會出現以下情況

在官方給的腳本中IK的綁定並沒有在OnAnimatorIK中,而放到了Update中,然后就出現了綁定失敗的問題。

所以我把他們都放到了OnAnimatorIK中。就可以了。

關於IK的操作~,給的少。

1     //設置右手IK位置
2     avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
3     //設置右手IK旋轉
4     avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
5     //獲取右手IK位置
6     rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
7     //獲取右手IK旋轉
8     rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);    

上完整代碼~ (ikActive)沒開啟時球跟隨人,開啟時人跟隨球。

  1 using UnityEngine;
  2 using System.Collections;
  3 
  4 public class MyIK : MonoBehaviour {
  5 
  6     public Transform bodyObj = null;
  7     public Transform leftFootObj = null;            
  8     public Transform rightFootObj = null;
  9     public Transform leftHandObj = null;
 10     public Transform rightHandObj = null;
 11     public Transform lookAtObj = null;
 12     private Animator avatar;
 13     public bool ikActive = false;
 14 
 15     void Start()
 16     {
 17         avatar = GetComponent<Animator>();
 18     }
 19 
 20     void OnAnimatorIK(int layerIndex)
 21     {
 22         if (avatar == null) return;
 23 
 24         if (ikActive)
 25         {
 26             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0.0f);
 27             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
 28             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
 29             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
 30             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
 31             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
 32             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
 33             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
 34             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);
 35 
 36             if (bodyObj != null)
 37             {
 38                 avatar.bodyPosition = bodyObj.position;
 39                 avatar.bodyRotation = bodyObj.rotation;
 40             }
 41 
 42             if (leftHandObj != null)
 43             {
 44                 avatar.SetIKPosition(AvatarIKGoal.LeftHand, leftHandObj.position);
 45                 avatar.SetIKRotation(AvatarIKGoal.LeftHand, leftHandObj.rotation);
 46             }
 47             if (rightFootObj != null)
 48             {
 49                 avatar.SetIKPosition(AvatarIKGoal.RightFoot, rightFootObj.position);
 50                 avatar.SetIKRotation(AvatarIKGoal.RightFoot, rightFootObj.rotation);
 51             }
 52             if (leftFootObj != null)
 53             {
 54                 avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position);
 55                 avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation);
 56             }
 57             if (rightHandObj != null)
 58             {
 59                 avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
 60                 avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
 61             }
 62 
 63             if (lookAtObj != null)
 64                 avatar.SetLookAtPosition(lookAtObj.position);
 65         }
 66         else
 67         {
 68             if (bodyObj != null)
 69             {
 70                 bodyObj.position = avatar.bodyPosition;
 71                 bodyObj.rotation = avatar.bodyRotation;
 72             }
 73 
 74             if (leftFootObj != null)
 75             {
 76                 leftFootObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftFoot);
 77                 leftFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftFoot);
 78             }
 79 
 80             if (rightFootObj != null)
 81             {
 82                 rightFootObj.position = avatar.GetIKPosition(AvatarIKGoal.RightFoot);
 83                 rightFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightFoot);
 84             }
 85 
 86             if (leftHandObj != null)
 87             {
 88                 leftHandObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftHand);
 89                 leftHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftHand);
 90             }
 91 
 92             if (rightHandObj != null)
 93             {
 94                 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
 95                 rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);
 96             }
 97 
 98             if (lookAtObj != null)
 99             {
100                 lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * new Vector3(0, 0.5f, 1);
101             }
102             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0);
103             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 0);
104             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0);
105             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0);
106             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 0);
107             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 0);
108             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
109             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
110             avatar.SetLookAtWeight(0.0f);
111         }
112     }
113 
114 }

附一個彩蛋,IK有意思~~呵呵~ o(* ̄▽ ̄*)ブ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM