1. 程式人生 > >Unity---動畫系統學習(6)---Avatar Mask動畫融合、Layers動畫分層、IK反向動力學

Unity---動畫系統學習(6)---Avatar Mask動畫融合、Layers動畫分層、IK反向動力學

ont 技術 分層 當前 pri layers mage 父節點 改變

1. 介紹

Avatar Mask(動畫融合)

前面我們一直介紹的都是動畫混合,一般用於解決邊跑邊轉彎的問題。而動畫融合一般用於解決例如邊跑邊揮手的問題。
簡單說就是讓跑步去控制腿的骨骼,揮手控制手的骨骼,兩個動畫融合在一起來播放。

右鍵新建一個Avatar Mask,Inspector只設置兩只手臂的IK。
技術分享圖片

Layer(動畫分層)

在狀態機的左側新建一個Layer層用於控制搬木頭
技術分享圖片
Weight:權重
Mask:骨骼遮罩
Blending:有重寫和添加,如果上一層也對手臂有操作操作的話,下一層的添加就無效了
IK Pass:是否使用IK

IK(反向動力學)

IK可以設置5個部位:頭、左右手、左右腳

是一種根據骨骼的終節點來推算其他父節點的位置的一種方法。
比如搬木頭,就不能讓手的位置一直放在一個地方,因為Idle動畫時,手也會亂動。這時我們就需要把手一直放在木頭上來控制握持位置。

2. 實現

當未用Ik動畫,而是只用分層來融合兩個動畫時,效果是這樣的,如果人物不動效果也看不出來什麽區別。
但一旦人物運動,就穿模了,可見這樣是不行的
技術分享圖片

使用IK

  1. 設置好如上圖一樣
  2. 把木頭放在大概頭的位置
  3. 在人物的子物體手臂位置新建兩個空物體命名左右手,並在場景中,先放在大概要搬木頭的頭的位置

3. 代碼

OnAnimatorIK方法是Unity自動調用的,每一層Layer每一幀都會調用,方法名不能改變。

anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position):此方法挺好理解的,就是把手的位置放在某個地方

    //unity調用的,哪一層勾選了哪一層每幀都會去調用,layerIndex是哪一層勾選了0-1-2-3
    private void OnAnimatorIK(int layerIndex)
    {
        if(layerIndex == 1)
        {
            int weight = anim.GetBool(isHoldWood) ? 1 : 0;
            //說明當前是被Hold Wood這一層調用的
            //把某個骨骼設置在某個位置上,左手,右手
            anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position);   //設置手的位置
            anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation);   //設置手旋轉一樣
            anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight); //設置位置權重
            anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight); //設置旋轉權重

            anim.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position);
            anim.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation);  
            anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
            anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight); 
        }
    }
    //最後在運行遊戲的時候微調左右物體的位置和方向,來讓手的位置效果最好

使用IK後的效果,可以看到手和木頭很好的融合在了一起
技術分享圖片

Unity---動畫系統學習(6)---Avatar Mask動畫融合、Layers動畫分層、IK反向動力學