2014年7月1日 星期二

Mecanim人形動畫淺談


【技術分享】Mecanim人形動畫淺談
原文來自於Unity - robertl




我們今天來紹Mecanim針對人形動畫的一些技術,包括運作方式、優勢和局限性,來探討如何在最佳化必須做的一些決策以及一些使用經驗。

人形骨架(Humanoid Rig)和肌肉空間(Muscle Space)
Mecanim所採用的人形骨架和肌肉空間是一種用來模擬人體骨骼的層次和變形,用來表示人體動畫的一種解決方案。




人形骨架用來描述人體的骨架節點,它可辨識一組人形骨骼並為每個骨骼創建肌肉數據參考。’讓肌肉在旋轉時具有範圍局限和坐標軸標記。




肌肉值[-1,1]用來規範骨頭的移動範圍 [min,max] 。請注意:肌肉值可能超出範圍低於或高於 [-1,1],此範圍非硬性規定,只是一個正常的移動範圍。在特別需求下可以增大或縮小移動範圍。

肌肉空間是人形骨架上所有肌肉值的集合。這是一個標準的人形姿勢。如果骨骼座標為0(min=max),代表骨骼上沒有肌肉。
例如,肘部的 Y 軸沒有肌肉,因為它僅能拉伸(Z軸)和轉動(X軸)。肌肉空間由最多47個肌肉值組成,這已經完全可以描述人形身體姿勢了。


肌肉空間的優點是它可直接應用於任何人形骨架,並始終建立合理的姿勢。另一個優點是肌肉空間很好做動畫補間。與標準骨骼姿勢相比,肌肉空間可以在State Machines或在Blend Tree混合的過程中,在動畫之間自然地進行補間動畫。

運算方面優勢是,因為肌肉空間可視為向量,因此可進行線性的動畫補間,這與四元數(Quaternions)或歐拉角(Euler angles)不同。


人類身體和人類運動的相似

為人形特徵或任何MoCap的動作構建的每個新的人形骨架都是模擬人類身體和行為。無論用多少骨骼或多好的 MoCap 硬體,結果都只能近似真實的人體運動。所以不同的產業(遊戲公司、學校或電影工業)各自會有自己最能代表自己產品的的人形結構需求。

Mecanim人形骨架和肌肉空間的設計遇到了一些艱難的選擇。我們必須在效能和動畫品質或開放性和標準化之間作出權衡。

2塊脊椎骨
這是一個難題。為什麼是 2 塊而不是 3 塊?或者任意數量的脊椎骨?在這裡就先不解釋因為今天不是生物醫學研究。(注意:如果您一定需要這種水準的精確度,那麼您可使用 Generic Rig)。



一塊脊骨明顯無法精確定義,加入第二塊有很多好處,但再多對最後的結果意義就不大了。觀察人體脊椎如何彎曲時,您會發現胸腔上的脊柱部分幾乎是僵硬的,位於脊柱底部和胸腔底部是兩個主要的彎曲點。瑜珈演員的極限姿勢清楚的說明了這一點。基於這些考量,我們決定讓人形骨架具有 2 塊脊骨。

1塊頸椎骨
這比脊柱要簡單一些。要知道許多遊戲人形骨架甚至沒有頸骨,僅依靠頭骨來製作人物。

旋轉DoF(自由度)
與大多數人形骨架一樣(遊戲亦同),Mecanim人形骨架僅支援旋轉動畫。不允許骨頭改變相對其父骨的局部平移。一些3D軟體往往支援一定數量的骨頭平移,以類比關節彈性或擠壓和伸展動畫。我們正在考慮是否要增加平移DoF,因為這是一種計算性能較不負擔的方式,可用細節較少的人形骨架補償動畫品質。它還允開發者建立可重定位的擠壓和伸展動畫。


沒有扭骨
通常將扭骨加到人形骨架是為了防止手臂和腿部的皮膚在極限扭曲中發生表皮變形問題。


扭骨有助於降低四肢所可能發生的變形。
在肌肉空間中,扭曲的量由肌肉表示,並始終與四肢的父骨關聯。例如:前臂的扭曲發生在肘部,而非腕部。
人形骨架不支援扭骨,但透過Mecanim你可以從父骨上取出扭骨比例,並指定在四肢的子骨上。預設值是 50%,它對於防止皮膚變形很有幫助。

人形根節點和重心(質量中心)

自然空間中可表示人體位置和方向的最佳方法是什麼?
骨骼結構中最上層(通常是臀部,或稱為骨盤)是標準人形骨架中在空間位置和方向曲線的位置。在特定的情況下可能運作沒問題,但如果要指定到不是骨盤為最上層或不同選轉軸的人形結構重定位時就會有問題。



肌肉空間使用人形重心用來表示它在自然空間中的位置。重心是模擬人體平均身體部位的質量分布。我們假設模型的比例調整過後,任何人物動作的重心都應該一樣。這是一個大概的假設,但目前為止運作的都很好。

的確,對於站立或行走動畫,重心位於臀部周圍,但對於後空翻等更動態的運動,您會發現身體是如何偏離重心,以及感覺重心是整個動畫中最穩定的點。

身體方向
類似於重心對肌肉空間的自然空間位置的作用,我們用身體的平均朝向來作為人物在空間的方向(身體平均朝向的Up和臀部和肩部的中點計算而來)。身體面對方向是由Up和Left/Right, hips/shoulders的平均值所算出來。同樣預設人形姿勢的身體平均朝向對於所有人形骨架是相同的。在行走或跑步時,也會計算上下身體的重心補償。

根節點運動(Root Motion)
之後會有根節點運動更深入的文章,這裡簡單介紹,重心和身體平均朝向用來自動產生根節點運動。重心和身體平均朝向是人形動畫的穩定屬性,因此會產生可用於巡徑導航或動作預測的穩定根節點運動。

縮放
要建立完整的人形姿勢,肌肉空間還缺少一個東西,就是整體尺寸。我們正在尋找一種可描述人形尺寸的方法,這種方法不依靠頭骨位置等特定的點,因為不同的骨架會有不同的點。 一個好品質的T-Pose角色不管怎麼縮放都可以直接使用。肌肉空間的重心位置按該比例劃分,來產生一個標準化人形姿勢。也就是說,肌肉空間對於T-Pose且高度為1 的角色重心進行標準化。肌肉空間中的所有位置均是以標準化的米為單位。

手和腳的初始位置
將肌肉空間指定到人形骨架時,由於骨架比例不同,手和腳最後可能偏離初始動畫的位置和方向。這可能導致腳滑動或手不能恰當伸展。因此,肌肉空間會視情況選擇手和腳的初始位置和方向。在肌肉空間中,手腳的位置和方向會對人形根節點(重心、身體平均朝向和人形縮放)進行標準化。那些原來的位置和方向可用於修復和重定位骨骼位置,以使用 IK 匹配初始自然空間位置。


IK運算器
IK 運算器主要是讓手臂和腿在肌肉空間裡可以順暢的銜接手和腳的位置和方向。在Mecanim 控制器狀態中啟用“Foot IK”時,可以看到圖片的執行狀況。


在這些情況下,重定位的骨骼位置絕不會偏離初始 IK 目標太遠。IK要修復的錯誤較少,因為錯誤僅僅是由人形骨架的縮放導致的。 IK運算器僅對重定位的骨骼位置稍作修改,產生與初始位置和方向匹配的最終姿勢。

由於IK 僅對重定位的骨骼姿勢修改,因此不太會產生膝蓋或肘部突出等動畫瑕疵。即便出現這種情況,IK運算器的Squash and Stretch計算器也會發揮作用,防止手臂或腿接近最大伸展長度時突出。在預設情況下,允許的擠壓和伸展量限制為低於等於手臂或腿總長度的 5%。肘部或膝蓋突起比起拉伸5%的腿更加明顯難看。要注意的是可將 Squash and Stretch 設為0% 來將其關閉。

後面還會有更深入的 IK文章。該文章將闡述如何處理物件節點、使用多個 IK 通道、與環境或人形角色之間進行互動等。


可選骨頭
人形骨架有一些可選的骨頭。像是胸、頸、左肩、右肩、左腳趾和右腳趾。即使如此。許多現有的人形骨架沒有其中一些可選骨頭,但我們仍然希望使用這些可選的骨頭來創建有效的人形。
人形骨架還支持左眼和右眼。眼骨各有兩塊肌肉,一塊上下移動,另一塊內外移動。還可利用類人操縱LookAt運算處理眼骨,從而將權重分散到脊柱、胸、頸、頭和眼睛的位置調整上。之後的人形 IK 文章將更詳細介紹LookAt計算器。

手指(Fingers)
最後,人形骨架支援手指。每根手指可能有 0 - 3 的值。0 代表未定義手指。1會有兩塊肌肉(拉伸和擴展),2和3只會有一塊肌肉(拉伸)。請注意,未定義手指不會被當成手。

人形骨架要求
中間骨骼(In-between bones)
在許多情況下人類骨骼中的骨骼會比人形骨架定義的多。中間骨骼是指在人形骨架定義的骨骼之間的骨骼。例如在3DSMAX 中創建的Biped模型中的第三塊脊椎骨會被視為中間骨骼。人形骨架是支援這些骨骼的,但Mecanim不會對中間骨骼進行動畫處理。相對於人形骨架中定義的父骨骼,這些骨頭將始終待在其預設的位置和固定方向。

標準層次結構(Standard Hierarchy)
人形骨架必須符合標準層次結構才能與我們的人形骨架相容。骨骼可具有位於人形骨骼之間的任意數量的中間骨骼,但必須符合以下模式:
臀部– 大腿– 小腿– 腳– 腳趾
臀部– 脊柱– 胸– 頸– 頭
胸– 肩– 手臂– 前臂– 手
手– 近端– 中段– 末梢

T-Pose

T-Pose是人形骨架建立最重要的步驟,因為肌肉創建基於此。 T-Pose被定義為標準姿勢是因為容易進行概念化,只要符合下列幾點:

- 面向z 軸站立
- 頭和眼睛面向 z 軸
- 腳著地,與 z 軸平行
- 手臂打開,沿x 軸與地面平行
- 兩手平舉,手掌向下,沿 x 軸與地面平行
- 手指伸直,沿 x 軸與地面平行
- 拇指伸直,與地面平行,位於 x 和 z 軸的中間(45度)
所謂“伸直”,並不是說骨頭一定要完全對齊。取決於皮膚如何依附在骨骼上。一些骨架的皮膚可能看起來是伸直的,但下面的骨骼並非如此。因此,為最終蒙皮(Skinned)完成後的角色設置T-Pose是非常重要的。如果您要創建人形骨架用來重定位MoCap 資料,最好透過 MoCap 套件捕捉到角色處於 T-pose姿勢的動作。

肌肉範圍調整
預設情況下,肌肉範圍設置為最能代表人類肌肉範圍的值。一般來說不應該修改它。對於一些較為卡通的角色,可以縮小範圍,防止手臂與身體難以分辨,或擴大範圍以使腿部運動更為誇張。如果您要創建人形骨架來重定位 MoCap 資料,則不要修改範圍,因為產生的動畫將不符合預設設定。

重定位和動畫片段
Mecanim重定位分為兩個階段。第一階段會轉換一個骨骼結構成為一個標準化人形動畫片段(或肌肉片段)。這一階段發生在編輯器中導入動畫檔時。我們稱為“RetargetFrom”。


第二階段發生在播放模式下,此時肌肉片段被應用到人形骨架的骨骼中時。我們稱為“RetargetTo”。將重定位分為兩個階段有兩大好處。第一個好處是處理速度。一半的重定位過程在離線狀態下完成,只有另一半在運行時完成。另一個好處是場景複雜性和記憶體使用。由於肌肉片段完全為初始骨骼抽象化,要執行重定位,並不需要在運行時包括源骨骼。

第二個階段是很好理解的。一旦您擁有優質的人形骨架,即可通過RetargetTo將肌肉片段應用上,這會自動完成。

第一階段是將骨骼動畫轉換為肌肉片段,這可能有點難理解。骨骼動畫片段以固定率取樣。對於每一個樣本,骨骼姿勢均轉換為肌肉空間姿勢,且在肌肉片段中添加一個keyframe關鍵幀。並不是所有骨骼都合適,有許多不同方式可創建人形骨支架並對其進行動畫製作。一些人形骨架會產生有效輸出,但也可能丟失資訊。我們現在來瞭解如何創建無損的標準化類人動畫注意事項。

請注意: “無損”指的是從人形骨架重定位到肌肉片段,再重定位回到同一個人形骨架,仍保持動畫完整性。事實上這幾乎很難完整。手臂和腿的原始扭曲將丟失,而由 Twist的計算結果替代。正如本文檔先前描述的,肌肉空間中沒有扭曲的表示。

• 人形骨架中的骨骼位置和動畫檔的中骨骼位置必須一致。有時會發生用於創建人形骨架的骨骼與動畫檔的骨骼不一致的情況。請確保使用完全一致的骨骼。如果沒有使用完全一致的骨骼,則在導入時控制台將發送警告。

• 中間骨骼必須沒有動畫。有時 3DSMAX 匯出的骨骼動畫會出現這樣的情況:第三塊脊骨同時有移位和旋轉動畫。 Bip001 用作臀部時和骨盤都具有一些動畫時也會發生這種情況。如果中間骨骼有動畫,則在導入時控制台將發送警告。

• 人形骨架和動畫檔中的中間骨骼的局部朝向必須一致。使用 Skin Bind Pose 來自動配置和創建T-Pose的人形骨架時可能發生這種情況。請確保中間骨骼的“蒙皮綁定姿勢”旋轉與動畫檔中的一致。如果中間骨骼有動畫,則在導入時控制台將發送警告。

• 骨骼不支持移位動畫,臀部除外。 3DSMAX 匯出的Biped 模型有時會對脊骨採用移位動畫。如果不是臀部骨骼,則在導入時控制台將發送警告。

在這裡,我們認為3DSMAX Biped人形骨架使用在Mecanim是有問題的。因為它非常普及因此我們絕對會遇到必須搭配與Mecanim使用的可能性。所以請務必注意如果您要用Mecanim人形動畫創建動畫,請記得遵守上述規則。當然違反上述一些規則的現有動畫,仍然是可行的,Mecanim retarget 功能強大,可產生有效輸出,但不保證生成無損轉換。



沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊