本文主要總結了槍神紀的動畫融合系統,同時對比介紹了《神秘海域2》的動畫融合系統,接著用一個實際遇到的動畫需求來分析兩個系統的優缺點,最後嘗試著從槍神紀的角度來總結兩者的差異。(本文僅涉及了雙方的動畫融合系統,更多的關於每個動畫模塊(基礎移動,攻擊,技能)的實現,將會在下一篇文章中進行介紹。)
背景第三人稱遊戲往往擁有豐富的動畫表現,一個動畫融合系統是每個動畫模塊完美融合的前提,動畫融合系統不僅決定了各個動畫模塊之間的狀態管理,更決定了他們之間的融合方式,最後直接反映到美術製作流程。
槍神紀的融合系統槍神紀只使用一顆動畫樹(Anim Tree)去同時管理動畫狀態與動畫邏輯,實際上這顆動畫樹更像是一個樹狀流程圖,如下圖所示,每一個方框代表一個動畫模塊。在實際的執行過程中,例如針對我們的雙槍角色,首先是判斷他是否處於勝利鏡頭, 再判斷他是否處於掏槍狀態,接著判斷是否處於勝利展示狀態…… 整個動畫樹就是這樣一個個狀態判斷下去,最後決定了動畫樹中每個葉子節點的權重。
把動畫融合系統定下來之後,最終加入各個動畫子模塊之後,最後的動畫樹成型圖如下:
舉個例子,角色有可能在往前跑步射擊的過程中被敵方玩家打了,此時角色就同時處於受擊狀態,前跑狀態,開火狀態。那麼按照我們的動畫樹邏輯,會去使用前跑狀態的Full Body動畫,疊加上受擊動作的Additive動作,以及Partial Blend他的瞄準方向的Aiming Pose。
反過來看神秘海域2的技術方案。他並不是使用一個動畫樹去Blend所有的動作,而是把動作分為各個層級,每個層級一個動畫樹,然後層級之間再通過Blend, Additive, Partial Blend融合起來,與此同時更關鍵的是每一個子層可以處於自己的狀態。
《Game Engine Architecture》裡動畫那一章詳細地闡述了這個方案:例如下圖就把動畫拆成了4層,每一層管理著自己的狀態,並被統一更新管理著:
某一時刻,每一層動畫可以處於自己的狀態中,例如下圖,他們各自處於了自己的State K, State H, State F, State B狀態中,並按照自己的狀態更新動畫。
當更新完自己的狀態之後,他們再通過預先設計好的融合方式,把各個層的最終Pose融合起來。
下面的視頻來截取自神秘海域2 在GDC 10上的演講,我們看到,左邊的角色在播放Base Layer,這個層負責更新全身的基本運動,右邊的角色在播放Weapon Layer的動畫,這個層負責武器動畫邏輯,而中間的角色正是這兩個層融合在一起的最終的效果。
http://v.youku.com/v_show/id_XNjcyODUxNjky.html
UE3實際上也可以實現Animation Layering的功能, 因為我們很容易就能通過自己定義節點中的融合行為來達到Animation Layerin,例如針對上面的分層和混合方式,只需要寫一個複合節點N,使N的動作輸出定義為:
LERP(Input1, Input4) + Input2 + Input4.
那麼就把這個Layering扁平化成一個樹形結構,如下圖所示:
然而,這只是解決了同一個狀態下,各個節點的融合問題,卻無法模擬出N層獨立的狀態管理,可見Animation Layering的核心是獨立狀態管理。
衣服的動畫的問題一般的射擊遊戲動畫都會將人物的動畫分為上下半身分離去處理,例如跑步中換槍,下半身依然在跑步,而上半身播放一個換槍的動作,這就是一個最簡單的跑步中換槍的動畫融合實現。下圖是一個典型的角色的骨骼:
我們從Hips分為上半身骨骼和下半身骨骼:
然而問題出現了,衣服的飄帶動畫更多的和基礎的行走模塊相關(隨著行走的方向飄動),但是卻分配到上半支的骨骼中,這樣以來就會導致在播放上半身動畫時,飄帶的動畫就忽然切到了上半身的中。例如角色行走過程中開火,開火僅僅是一個很短的動畫,飄帶基本不動,如果生硬的把整個上半身在開火狀態時強制切換到開火狀態,那麼整個飄帶就會一抖一抖,影響了最後動畫的品質。
下圖說明了飄帶骨骼所處的層級關係:
針對這樣的問題,按照神秘海域2裡的Animation Layering的方法,只需把飄帶分到另外一個層級,在那個層級裡按照基本位移的狀態更新自己的動畫,而最後再疊加上去基礎動畫就可以:
但是槍神紀整個動畫樹就只維護了一套狀態,因此,不能使用這一套方案。為了解決這個問題, 我重新寫了分支節點融合邏輯,加入了一個分支後的排除分支列表,去Hack了動畫樹,讓本屬於上半身的骨骼去按照下半身的狀態更新自己。
正常的融合過程如下,藍色的骨骼代表讀取開火序列數據,橙色的表示讀取行走序列數據:
經過修改節點之後,讓他從B_Cloth0開始繼續讀取行走的序列數據:
上面的修改讓槍神紀暫時滿足了需求,但是當我們的動畫邏輯進一步複雜,出現三重融合分支的時候,那麼這樣的融合邏輯就開始變得混亂,到那個時候,就不得不採用Aniamtion Layering的動畫融合設計才能滿足需求。但是,從性能方面來看,採用Animation Layering的設計時,雖然靈活性大大的提高了,但是卻維護了更多的狀態管理,並且增加了一次額外的Additve動畫的計算,動畫系統的消耗也就更多了。因此,即使目前槍神紀有機會再一次重新設計自己的動畫融合方案,從效率的角度來看,我們還是會採用目前的一套動畫樹,一套狀態管理的設計。
參考1. Animation and Player Control in Uncharted: Drake's Fortune and Uncharted II: Among Thieves, http://www.gdcvault.com/play/1012300/Animation-and-Player-Control-in
2. Game Engine Architecture , Chapter 11: Animation System, First Edition, Jason Gregory.
長按二維碼收聽Gad微信平臺
國內業界首家專業獨立遊戲開發者平臺Gad(http://gad.qq.com/)正式上線運營。Gad面向遊戲從業者,打造開放、互聯、回饋、分享的專業遊戲人社區,提供免費組件下載、專業知識學習、組隊遊戲製作、項目孵化渠道等服務。平臺沉澱了騰訊遊戲近十年遊戲策劃、美術、程序、運營經驗,通過組件工具開源、專業技能培訓、經驗案例分享幫助遊戲初學者快速掌握遊戲製作技能,幫助有經驗者提升開發能力和效率,回饋並促進行業發展。同時通過用戶組隊創作遊戲孵化高潛力、高價值項目,打造良好的開發生態圈。