最近在做動畫系統的一些重構工作, 順便就看了下成熟的引擎的動畫部分. 之前做過一個動作遊戲的預研, 所以對這部分感觸比較大, 因為相比業界一流的廠商, 動畫技術可以說是國內遊戲開發最落後的的一部分了
在我看來, 動畫系統分成這麼幾個層級吧:
- 可以把DCC中製作的動作匯入播放, 有Play/Stop/Pause之類的介面. 開源或者自研的引擎多停留在這一階段
- 在多個動畫之間可以定義混合轉換方式, 可以很好地處理不動動作之間的銜接過渡. 如GameBryo, Vision等
- 有動畫狀態機器和BlendTree, 可以使用參數控制播放不同的動作, 如Unity, Unreal, Havok, Morpheme等
- 把動畫與物理系統結合, 實現環境互動, IK, 碰撞反應, Ragdoll等. 通常實現了3的也會把4順便做了
- 把動畫與行為系統結合, 做出真實的人物行為表現. 這部分就上升到AI層次了, 這方面NaturalMotion業界領先
苦逼的我們還在2掙紮. 引入動畫中介軟體可以快速上升到4, 5的話目前遊戲應用比較少下面是一些最近閱讀文檔遇到的一些技術名詞, 來源於Unity, Vision, Havok:
- Animation Clip(同Animation Sequence)
-
- 動畫資料單位, 如一個"Idle" Clip, 一個"Run" Clip, 一個"Walk" Clip等
- Body Mask(同Skeleton Partitioning)
-
- Animation Retargeting
-
- 把一個模型的動畫應用到另一個模型上, 動畫師就不用為每個角色重複做類似的動畫了
- T-Pose
-
- 原始骨架在沒有動畫時通常是"T"型的
- 在強動作互動遊戲中使用動畫控制角色位移朝向, 而不是靠程式
- Root Motion(同Motion Extraction)
-
- 角色的"根"的運動, 可能由動畫自己控制或者外部控制
- Animation Layer
-
- 控制模型動畫或者局部動畫的狀態機器. 通過與Body Mask一起用作肢體動畫, 半身動畫等
- Animation State Machine
-
- Animation Blend Tree
-
- 根據浮點數參數在相似的Animation Clip之間進行連續混合, 比如設定一個方向值, 在前後左右4個行走動畫之間進行平滑過渡
- Inverse Kinematics(IK)
-
- 根據世界空間的物體反向控制角色身體部位的變換, 如以應用:
-
- Wrap Mode
-
- 動畫的播放方式: 單次播放, 迴圈播放, 單次播放停在最後
- Transition
-
- 從一個動畫到另一個動畫的轉換方式, 以Vision為例:
-
- Immediate: 在Source和Target之間直接進行插值, 期間不處理動畫資料(不播放)
- CrossFade: 在Source和Target之間進行平滑過渡, 期間處理動畫資料(進行播放)
- Intermediate: 使用一個Animation Sequence在兩個動畫之間進行混合
- Transition Table
-
- 定義每兩個動畫之間Transition方式的二維表(見Gamebryo, Vision)
- Animation Event
-
- 動畫時間軸上的事件定義, 比如左右腳的落地時間點可以用於觸發腳步聲
- Animation Compression
-
- 在動畫資料量比較大的情況下記憶體和磁碟佔用會比較高, 所以需要進行壓縮
- Animation Blending
-
- 把多個動畫的Pose混合到一個Pose上渲染
- Normal Blending
-
- 通常在多個AnimationTrack間根據權重進行平均
- Additive Blending
-
- 一細節動畫可以疊加到已有的Pose上, 通常做法是把動畫的當前Pose減去第一幀的Pose得到相對變換, 再加到目標Pose上
- Animation Job
-
- 一些計算密集的操作會封裝成任務扔進線程池裡去計算, 如採樣, 混合, 解壓縮等
- Skeleton Mapping
-
- 把一個骨架的Pose轉換到另一個, 一般有兩種情況:
-
- 把簡化的骨架映射到正常骨架上, 用於"Ragdoll Mapping"(角色物理中使用)
- 在兩個不同角色骨架之間轉換, 用於"Animation Retargeting"
- Local Hit Reaction
-
- 角色對身體局部的撞擊產生相應的動作. 這是由Ragdoll驅動的, 可以代替受擊動畫之類
- Animation Driven Ragdoll Death
-
- 由Ragdoll驅動類比死亡/擊飛的動作. 由物理即時運算, 不需要動畫師進行資料製作