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

分類:Unity、C#、VS2015 編輯器

建立日期:2016-05-02 工具

1、簡介

Mecanim 動畫系統 (Mecanim Animation System) 特別適合使用類人骨架動畫。因爲類人骨架很是廣泛並在遊戲中普遍應用,所以Unity 針對類人動畫專門提供了專業的工做流程和擴展工具集。 佈局

本節主要介紹爲模型建立 Avatar 的基本步驟。包括: 動畫

(1)建立Avatar。 ui

(2)配置Avatar。 spa

(3)肌肉設定。 3d

(4)動畫重定位。 code

(5)反向動力學。 orm

一、什麼是Avatar 對象

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

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

因爲類人動畫的骨骼結構大部分都類似(個別狀況例外),好比展現身體、頭部和四肢的主要清晰部位等,所以經過實現重定位和反向動力學,還能夠將一個類人骨架動畫映射到另外一個類人動畫。

2、建立Avatar

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

要點:

  • Model:類人網格模型
  • Rig:裝置。
  • 導入動畫模型後,須要先爲該模型建立Avatar,而後才能經過腳本控制它。

一、類人動畫

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

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

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

image

若是自動 Avatar 建立失敗,此時會看到【Configure…】按鈕旁邊出現一個「Í」標記,以下圖所示:

image

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

二、非類人動畫

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

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

舊版動畫使用 Unity 在 Mecanim 以前提供的動畫系統。在某些狀況下,好比你不但願更新舊Unity工程的版本,在這種狀況下,你能夠繼續使用舊版動畫。可是要記住:在新版本的工程中不多使用舊版動畫(Legacy)。

3、配置 Avatar

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

「有效且正確設置」的含義是:角色的骨骼結構必須匹配 Mecanim 預約義的骨骼結構且將模型擺成 T 字姿式 (T-pose),這一點很是重要。

一、匹配

前面咱們說過,若是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

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

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

擴展名爲「.ht」的模板文件十分有用,例如當動畫對全部骨架使用一致的佈局和命名約定,但 Mecanim 不知道如何解釋它時,你就能夠對每一個模型加載 (Load)擴展名爲「.ht」的文件。這樣作的好處是,只須要手動從新映射一次就好了。

4、肌肉設定

Mecanim 可以讓你使用肌肉 (Muscles) 來控制不一樣骨骼的活動範圍。

正確配置 Avatar 後,就意味着Mecanim已經「理解」了骨骼結構,此時就能夠在 Avatar 檢視器 (Avatar Inspector) 的肌肉 (Muscles) 選項卡中工做。在這裏,能夠很是輕鬆地調整角色的活動範圍,確保角色以逼真的方式扭曲,避免過分造做或自我重疊。以下圖所示:

image

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

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

二、肌肉剪輯

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

image

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

image

5、Avatar 身體遮蔽 (Body Mask)

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

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

使用身體遮蔽的好處是:

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

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

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

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

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

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

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

image

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

二、身體遮蔽資源

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

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

6、動畫重定位

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

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

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

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

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

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

l 動畫片斷集,經過引用動畫控制器 (Animator Controller)獲得的。

l 角色的控制腳本。

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

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

二、推薦的設置

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

image

將模型與動畫器 (Animator) 組件一塊兒做爲遊戲對象 (GameObject) 的子對象:

image

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

image

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

  • 禁用原始模型
  • 將所需模型做爲遊戲對象 (GameObject) 的另外一個子對象加入
image

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

image

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

完成設置!最終獲得的效果以下:

image

7、反向動力學 (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 複選框,觀察角色抓取、鬆開物體的過程。

相關文章
相關標籤/搜索