《遊戲引擎架構》 筆記(二) 動畫系統

博客搬家自http://zhouyuanchao.com/wordpress/archives/44


每頂點動畫技術:存儲隨時間改變的頂點位置和法線

變形目標動畫: 移動網格頂點,僅製作相對少量的固定極端姿勢,然後運行時混合姿勢,線性差值(LERP),常用於面部動畫。
蒙皮動畫


遊戲引擎會限制每個頂點能綁定的關節數目,典型的限制爲每頂點4個關節。
原因如下:首先,4個8位關節索引能方便地包裹爲一個32位字,此外,每頂點使用2個、3個及4個關節所產生的質量很容易區分,但大多數人並不能分辨出每個頂點4個關節以上的質量差別。


典型的蒙皮頂點數據結構


struct SkinnedVertex
{
    float m_position[3];
    float m_normal[3];
    float m_u, m_v;         // 紋理座標
    U8    m_jointIndex[4];  // 關節索引
    float m_jointWeight[3]; // 關節權重
};


蒙皮網格的頂點會追隨其綁定的關節而移動。
我們需要求一個矩陣,該矩陣把網格頂點從原來的位置(綁定姿勢)變換至骨骼的當前姿勢,我們稱此矩陣爲蒙皮矩陣。
該矩陣把綁定姿勢的模型空間變換至當前姿勢的模型空間。


蒙皮矩陣
K = 綁定姿勢矩陣的逆矩陣 * 當前姿勢矩陣


矩陣調色板(Matrix palette)
我們須計算一組蒙皮矩陣Kj,當中每個矩陣對應第j個關節。此數組稱爲矩陣調色板。
當要渲染一個蒙皮網格時,矩陣調色板便要傳送至渲染引擎。渲染器會爲每個頂點查找調色板中合適的關節蒙皮矩陣,並用該矩陣把頂點從綁定姿勢變換至當前姿勢。


假設角色的姿勢隨時間改變,其當前姿勢矩陣便需要每幀更新。然而,綁定姿勢逆矩陣在整個遊戲中都是常量,因爲骨骼的綁定姿勢是模型創建時確定下來的。因此綁定姿勢逆矩陣通常會緩存於骨骼,並不需要在運行時計算。


每個頂點最終會由模型空間變換至世界空間。因此有些引擎會把蒙皮矩陣調色板預先乘以物體的模型-世界變換。這是個很有用的優化。


動畫混合(animation blending)
指能令一個以上的動畫片段對角色最終姿勢起作用的技術。
混合是把兩個或更多的輸入姿勢結合,產生骨骼的輸出姿勢。


比如,通過混合負傷及無負傷的步行動畫,我們可以生成二者之間不同負傷程度的步行動畫。


動畫混合可用於對面部表情、身體站姿、運動模式等的極端姿勢之間插值。


動畫混合也可以用於求出不同時間點的兩個已知姿勢之間的姿勢。
通過在短時間段內把來源動畫逐漸混合至目標動畫,就能把某動畫圓滑地過渡至另一動畫。


四元數
線性插值 LERP
球面線性插值 SLERP
詳見相關數學知識


爲了在不同的動畫片段之間平滑過渡:
1.位置連續 C0連續(continuity)
2.速度連續(位置的導數) C1連續,速度及動量的連續性
3.加速度連續(速度的導數)C2連續
若使用更高階的連續性,角色的動作會顯得更佳及更真實。
通常難以達到嚴格數學上的C1或以上的連續性。
通常使用線性插值(LERP)達到C0動作連續性就可以了。


兩種常見的淡入淡出過渡方法
圓滑過渡(smooth transition)
凍結過渡(frozen transition)


β 線性差值中的混合因子
爲達到圓滑的過渡,我們可以令β按時間的三次函數變化,例如用一維貝塞爾曲線。
當把這些曲線應用正在淡出的當前片段時,該曲線就稱爲緩出曲線(ease-out curve);當應用到正在淡入的新片段時,稱爲緩入曲線(ease-in curve)


無需混合就能產生連續動作的方法:
動畫師確保其片段的最後姿勢能匹配後續片段的首個姿勢。
創作一段圓滑的動畫,然後把它切爲兩個或兩個以上的動畫片段。


方向性運動
靶向移動 詳見書482頁,有助於理解unity中的混合樹(Blend Tree)
軸轉移動


技術清單:
Delaunay三角剖分(Delaunay triangulation)


骨骼分部混合
人可獨立控制身體不同部位。例如,可以在步行時揮動右臂,並同時令左臂指着某物。在遊戲中實現這種動作的方法之一是,使用名爲骨骼分部混合(partial-skeleton blending)的技術。


混合遮罩(blend mask)
unity中也有相關概念,可結合理解。
可以把某些關節的混合百分比設爲0,來掩蓋那些關節。


現實中,在跑步中揮手時,揮手動作比站立時更“晃動”及不受控制,骨骼分部混合無法實現這樣的真實性。另一種更自然的技術:加法混合。


加法混合(additive blending)
區別片段(difference clip)- 代表兩段正常動畫的區別。
考慮兩個輸入片段 來源片段(source clip S)、參考片段(reference clip R)
區別片段 D = S - R
若區別片段D加進原來的參考片段,我們就會得到來源片段。
只需要把某百分比的D加進R,我們也可以產生介於R和S之間的動畫。就像線性插值。
加法混合技術之美在於:製作一個區別片段之後,可以把該片段加進其他不相關的片段,而不僅限於原來的參考片段。


加法混合相關的數學公式見書489頁


動畫後期處理(animation post-processing)


OGRE
Ogre::Entity
Ogre::AnimationStateSet
Ogre::AnimationState 對應一個動畫片段


約束
注視(look-at):角色能注視環境中的興趣點。角色可以僅用眼睛注視,又或者同時用眼和頭,又或加入上半身的扭動。注視約束有時候是以IK或程序式關節偏移實現的,但更自然的觀感可用加法混合實現。
掩護對準(cover registration):角色在掩護時要和掩護物完美對齊,這通常是用參考定位器技術來實現。


動畫系統架構
動畫管道 animation pipeline
動作狀態機 action state machine, ASM
動畫控制器 animation controller
發佈了34 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章