Mecanim之IK動畫
阿新 • • 發佈:2017-12-17
prot post type 控制 sin req .cn can height
序言:IK動畫全名是Inverse Kinematics 意思是逆向動力學,就是子骨骼節點帶動父骨骼節點運動。
比如體操運動員,只靠手來帶動身體各個部位的移動。手就是子骨骼,身體就是它的父骨骼,這時運動手就需要帶動身體來移動。
一、適用範圍:
在Mecanim系統中,任何正確設置了Avatar的人形動畫都支持IK功能。
二、常用函數:
1、SetIKPositionWeight
2、SetIKRotationWeight
3、SetIKPosition
4、SetIkRotation
5、SetLookAtPosition
6、bodyPosition
7、bodyRotation
例如以下就用了Ik功能,可以根據移動方塊來控制手臂的移動:
三、IK功能的打開:
如何實現上面的表現嘞?別急,首先我們選中一個動畫模型,其必須完成了正確的骨骼映射,具體的骨骼映射步驟可以參考上一篇,
為其創建動畫狀態機,這裏需要註意,在動畫層窗口中選中IK Pass選項,一定要選擇,否則無法正確使用IK功能。
四、代碼的控制:
這裏我們就可以通過以下代碼進行控制角色的右手臂被方塊控制移動了。
1 using UnityEngine; 2 using System; 3 using System.Collections; 4 5 [RequireComponent(typeof(Animator))] 6 7 publicclass IK : MonoBehaviour 8 { 9 10 protected Animator animator; //動畫控制 11 public bool ikActive = false; //是否開始IK動畫 12 public Transform rightHand = null; //右手子節點參考的目標 13 14 void Start() 15 { 16 17 animator = GetComponent<Animator>(); //得到動畫控制對象 18 } 19 //它是回調訪法,必須勾選IK Pass!!! 20 void OnAnimatorIK() 21 { 22 if (animator) 23 { 24 25 //即或IK動畫後開始讓右手節點尋找參考目標。 26 if (ikActive) 27 { 28 29 //設置骨骼的權重,1表示完整的骨骼,如果是0.5,哪麽骨骼權重就是一半,可移動或旋轉的就是一半 30 animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f); 31 animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f); 32 33 //set the position and the rotation of the right hand where the external object is 34 if (rightHandObj != null) 35 { 36 //設置右手根據目標點而旋轉移動父骨骼節點 37 animator.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position); 38 animator.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation); 39 } 40 41 } 42 43 44 //如果取消IK動畫,哪麽重置骨骼的坐標。 45 else 46 { 47 animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0); 48 animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0); 49 } 50 } 51 } 52 }
五、總結:
我這裏只練習了右手臂的,IK定義可以控制兩只手和兩只腳的移動,所以大家可以去嘗試嘗試。
2017-12-17、11:31:43
Mecanim之IK動畫