【Unity】10.3 創建類人動畫角色


分類:Unity、C#、VS2015

創建日期:2016-05-02

一、簡介

Mecanim 動畫系統 (Mecanim Animation System) 特別適合使用類人骨架動畫。由於類人骨架非常普遍並在游戲中廣泛應用,因此Unity 針對類人動畫專門提供了專業的工作流程和擴展工具集。

本節主要介紹為模型創建 Avatar 的基本步驟。包括:

(1)創建Avatar。

(2)配置Avatar。

(3)肌肉設定。

(4)動畫重定位。

(5)反向動力學。

1、什么是Avatar

Mecanim 系統簡化了搭骨架和動畫控制的過程。創建動畫的基本步驟就是在 Mecanim 理解的簡化類人骨骼結構和骨架中的實際骨骼之間建立映射。在Mecanim術語中,將該映射稱為 Avatar。

2、動畫重定位和反向動力學

由於類人動畫的骨骼結構大部分都相似(個別情況例外),比如展示身體、頭部和四肢的主要清晰部位等,因此通過實現重定位和反向動力學,還可以將一個類人骨架動畫映射到另一個類人動畫。

二、創建Avatar

導入模型文件(例如FBX文件)之后,首先需要在【Model Importer】選項的【裝置(Rig)】選項卡中指定裝置(Rig)的類型,指定后單擊【Apply】,就為其創建了一個Avatar。

要點:

  • Model:類人網格模型
  • Rig:裝置。
  • 導入動畫模型后,需要先為該模型創建Avatar,然后才能通過腳本控制它。

1、類人動畫

對於類人動畫,導入動畫模型后,創建Avatar的具體步驟如下:在檢視器視圖中,單擊【Model】選項卡“Animation Type”右側的下拉框,選擇【Humanoid】,點擊【Apply】。

此時Mecanim 就會自動嘗試將現有骨骼結構匹配到 Avatar 的骨骼結構。大多數情況下,Unity都會通過分析裝置中骨骼之間的連接來自動完成這一過程。

如果匹配成功,就會在【Configure..】按鈕的前面看到一個“√”標記,如下圖所示。另外,在成功匹配的情況下,Unity還會自動將 Avatar 的子資源添加到模型資源文件中(可以在工程視圖層次視圖中看到該資源)。

image

如果自動 Avatar 創建失敗,此時會看到【Configure…】按鈕旁邊出現一個“Í”標記,如下圖所示:

image

在這種情況下,系統不會自動添加 Avatar 子資源。此時需要手動配置 Avatar。

2、非類人動畫

Unity5.3.4提供了兩種非類人動畫:通用 (Generic) 和舊版 (Legacy)。

通用動畫使用 Mecanim 系統導入,但不能使用類人動畫可用的額外功能。

舊版動畫使用 Unity 在 Mecanim 之前提供的動畫系統。在某些情況下,比如你不希望更新舊Unity工程的版本,在這種情況下,你可以繼續使用舊版動畫。但是要記住:在新版本的工程中很少使用舊版動畫(Legacy)。

三、配置 Avatar

在Mecanim系統中,不論自動創建的Avatar匹配是否成功,都需要進入配置Avatar (Configure Avatar) 模式,這樣做的目的是為了確保 Avatar 有效且正確設置。

“有效且正確設置”的含義是:角色的骨骼結構必須匹配 Mecanim 預定義的骨骼結構且將模型擺成 T 字姿勢 (T-pose),這一點非常重要。

1、匹配

前面我們說過,如果Avatar創建成功,就會在【Configure..】按鈕的前面看到一個“√”標記。但是,此時的“成功”僅僅意味着成功匹配了所有需要的骨骼,為了獲得更好的結果,你可能還想匹配可選的骨骼,並讓模型擺成合適的 T 姿勢 (T-pose)。

當單擊【Configure...】按鈕轉到對應的菜單時,編輯器會先彈出一個窗口詢問是否要保存當前場景,這是因為在配置 (Configure) 模式下,場景視圖 (Scene View) 僅顯示所選模型的骨骼、肌肉和動畫信息,而不會顯示場景的其他部分。

保存當前場景之后,就會在檢視器視圖看到一個帶有骨骼映射的新 Avatar 配置 (Avatar Configuration)。如下圖所示:

image

檢視器還會顯示哪些骨骼必需的,哪些骨骼是可選的(可選骨骼的運動可以自動用插值計算出來)。

為了讓 Mecanim 產生有效的匹配,需要將所需骨骼放在骨架上的恰當位置,否則就可能匹配不成功。另外,為了提高找到匹配 Avatar 的骨骼的成功率,一般都使用反映身體部位的名稱為骨骼命名(比如 "LeftArm"、"RightForeArm" 等)。

如果模型不能自動產生有效的匹配,此時需要遵循 Mecanim 在內部使用的類似流程來手動匹配它,步驟如下:

  • 采樣綁定姿勢 (Sample Bind-pose)(嘗試讓模型更接近其建模時的姿勢,一個合理的初始姿勢)
  • 自動映射 (Automap)(從初始姿勢創建一個骨骼映射)
  • 強制 T 字姿勢 (Enforce T-pose)(強制模型更接近 T 字姿勢,這是 Mecanim 動畫使用的默認姿勢)

image

如果自動映射完全失敗或者部分失敗,則可以通過從場景 (Scene) 或層級視圖 (Hierarchy) 中拖出骨骼來為其賦值。

如果 Mecanim 認為某塊骨骼合適,該骨骼就會在 Avatar 檢視器 (Avatar Inspector) 中顯示為綠色,否則顯示為紅色。

最后,如果骨骼賦值正確,但角色的姿勢有錯誤,此時會看到消息“角色未擺成 T 字姿勢 (Character not in T-Pose)”。這種情況下,可使用強制 T 字姿勢 (Enforce T-Pose) 進行修改,或者將剩余的骨骼旋轉成 T 字姿勢。

image

2、類人模板 (Human Template) 文件

以將骨架中骨骼與 Avatar 的映射在磁盤上保存的擴展名為“.ht”的文件稱為類人模板(Human Template)文件,這些文件可以由使用此映射的任何角色重復使用。

擴展名為“.ht”的模板文件十分有用,例如當動畫對所有骨架使用一致的布局和命名約定,但 Mecanim 不知道如何解釋它時,你就可以對每個模型加載 (Load)擴展名為“.ht”的文件。這樣做的好處是,只需要手動重新映射一次就行了。

四、肌肉設定

Mecanim 可讓你使用肌肉 (Muscles) 來控制不同骨骼的活動范圍。

正確配置 Avatar 后,就意味着Mecanim已經“理解”了骨骼結構,此時就可以在 Avatar 檢視器 (Avatar Inspector) 的肌肉 (Muscles) 選項卡中工作。在這里,可以非常輕松地調整角色的活動范圍,確保角色以逼真的方式扭曲,避免過度造作或自我重疊。如下圖所示:

image

1、肌肉設置(Per-Muscle Setting)

通過Per-Muscle Setting選項卡下的視圖,可以一個一個地調整身體(視圖下部)中的每塊骨骼,或使用一次操作若干塊骨骼的預定義扭曲(視圖上部)來操作角色。

2、肌肉剪輯

在動畫 (Animation) 選項卡中,還可以設置肌肉剪輯 (Muscle Clips) - 它們是針對特定肌肉和肌肉組的動畫。

image

也可以定義這些肌肉剪輯應用於身體的哪個部位:

image

五、Avatar 身體遮蔽 (Body Mask)

在網格導入檢視器的動畫 (Animation) 選項卡和動畫層 (Animation Layer) 中,可以使用身體遮蔽 (Body Mask) 在動畫中有選擇性地啟用或禁用特定身體部位。

使用身體遮蔽可以調整動畫以便更加符合角色的特定要求。例如,你可能具有同時包括手臂和腿運動的標准行走動畫,不過如果角色使用雙手運送大型物體,不希望其手臂在其行走時在兩側擺動,此時可通過在身體遮蔽中關閉手臂移動來仍舊使用標准行走動畫。

使用身體遮蔽的好處是:

(1)有助於減少內存開銷,因為不活動的身體部位無需關聯動畫曲線。

(2)不使用的曲線無需在播放過程中進行計算,這有助於減少動畫的 CPU 開銷。

1、反向運動(IK:Inverse Kinematics)

身體部位包括:頭、左臂、右臂、左手、右手、左腿、右腿和腳(通過腳下的“陰影”表示)。在身體遮蔽中,還可以切換手和腳的反向運動(Inverse Kinematics,簡稱IK) ,這會確定是否在動畫混合中包括 IK 曲線。

(1)單擊 Avatar 部分可切換包括(綠色)或排除(紅色)。

(2)在 Avatar 周圍的空白空間中雙擊可全部切換。

下圖是身體遮蔽檢視器中的身體遮蔽(排除了手臂):

image

在網格導入檢視器動畫(Animation) 選項卡中,會看到標題為片段 (Clips) 的列表,其中包含對象的所有動畫片段。從該列表中選擇一個項目時,會顯示該片段的選項,包括身體遮蔽編輯器。

2、身體遮蔽資源

還可以創建身體遮蔽資源,步驟是:【資源 (Assets)】->【創建 (Create)】->【Avatar身體遮蔽 (Avatar Body Mask)】,這些資源會在磁盤上顯示為 .mask 文件。

BodyMask 資源可以在動畫器控制器 (Animator Controller) 中重復使用,即:在指定 動畫層 (Animation Layer)時可重復使用。

六、動畫重定位

Mecanim 最強大的功能之一是重定位類人動畫。這意味着,你可以相對輕松地將相同動畫集應用到各種角色模型上。

重定位只可用於已經配置了Avatar的類人模型,因為這樣才能在模型的骨骼結構之間建立對應關系。

1、推薦的層級視圖 (Hierarchy) 結構

使用 Mecanim 動畫時,場景中應該包含以下元素:-

l 導入的 (Imported) 角色模型,其中包含 Avatar。

l 動畫器組件 (Animator Component),通過引用動畫控制器 (Animator Controller) 資源得到的。

l 動畫片段集,通過引用動畫控制器 (Animator Controller)得到的。

l 角色的控制腳本。

l 角色相關的組件,例如動畫控制器 (Animator Controller)。

你的工程也應該包含另一個含有有效 Avatar 的角色模型。

2、推薦的設置

在包含角色相關 (Character-related) 組件的層級視圖 (Hierarchy) 中創建一個游戲對象 (GameObject):

image

將模型與動畫器 (Animator) 組件一起作為游戲對象 (GameObject) 的子對象:

image

確保引用動畫器 (Animator) 的腳本正在尋找子對象中的動畫器,而非根。即使用GetComponentInChildren<Animator>() 來代替 GetComponent<Animator>()。

image

為了在另一個模型上再次使用相同的動畫,需要:

  • 禁用原始模型
  • 將所需模型作為游戲對象 (GameObject) 的另一個子對象加入
image

確保新模型的動畫器控制器 (Animator Controller) 屬性引用相同的控制器資源:

image

調整角色控制器、變換和頂層游戲對象 (GameObject) 的其他屬性,以確保動畫能夠順利地使用新模型。

完成設置!最終得到的效果如下:

image

七、反向動力學 (Inverse Kinematics)(僅限專業版 (Pro))

大多數動畫通過旋轉調整骨架中關節的角度為預定值來制作。子關節的位置根據其父關節的旋轉而改變,因此,關節鏈的端點由其所包含的單個關節的角度和相對位置決定。這種構成骨架的方法稱為正向動力學。

因此,從相反的角度查看構成關節的任務通常十分有用 – 在空間中給出一個選擇的位置,然后對其逆向操作,找到一種定向關節的有效方式,這樣端點就落在該位置。這種方式稱為反向動力學 (Inverse Kinematics) (IK),Mecanim中的IK可用於任何含有正確配置 Avatar 的類人角色。

當想要角色在用戶選擇的某一點觸摸一個物體或者將角色雙腳穩穩地固定在不平坦的表面上時,反向動力學這種方式非常有效。

image

要為角色設置IK,通常需要擁有與角色互動的場景四周的物體,然后通過腳本設置 IK,特別是通過此類提供地方法實現動畫器 (Animator) 功能。例如:SetIKPositionWeight、SetIKRotationWeight、 SetIKPosition、 SetIKRotation、 SetLookAtPosition、 bodyPosition、 bodyRotation

上圖展示了一個角色正抓住一個圓柱形物體。如何才能做到這一點?答案是:先從一個擁有有效 Avatar 的角色入手,然后向該角色附加一個處理 IK 的腳本(IKCtrl.cs),該文件的C#代碼如下:

using UnityEngine;
using System;
using System.Collections;

[RequireComponent(typeof(Animator))]  
public class IKCtrl :MonoBehaviour
{
    protected Animator animator;
    public bool ikActive = false;
    public Transform rightHandObj = null;
    void Start () 
    {
        animator = GetComponent<Animator>();
    }

//a callback for calculating IK
    void OnAnimatorIK()
    {
          if(animator) {

            if(ikActive) {
//if the IK is active, set the position and rotation directly to the goal. 

//weight = 1.0 for the right hand means position and rotation will be at the IK goal (the place the character wants to grab)
                animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1.0f);
                animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1.0f);

                if(rightHandObj != null) {
                    //設置右手的位置和旋轉
    animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
    animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
                }
            }
            else {            
               //如果IK未激活,還原原來的右手位置和旋轉
                animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);
                animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);                
            }
        }
    }      
}

由於我們不打算讓角色用手抓住“整個”物體,所以在圓柱體上放置了一個可以用手抓的球體,並相應轉動該球體。

下圖是該球體然后被列為 IKCtrl 腳本的“右手對象 (Right Hand Obj)”的屬性:

image

點擊 IKActive 復選框,觀察角色抓取、松開物體的過程。


免責聲明!

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



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