上周UWA介紹了Unreal 4引擎動畫模塊中的基本功能,接下來我們將進一步介紹Unreal 4引擎動畫模塊中提供的進階功能。其中主要包括:動畫融合、動畫重定向、反向運動學、頂點動畫。鑑於篇幅原因,今天我們先來講解動畫融合。
在此,特別感謝Unreal中國團隊對於本篇文章中Unreal引擎相關內容的審核,並在UWA團隊學習其引擎的道路上提供的大力支持。
動畫融合
動畫融合是遊戲引擎動畫模塊中的重要功能。本節將介紹Unreal 4引擎中提供的動畫融合功能,主要包括:Blend節點、Blend Space、Animation Montage、Animation Composite以及Post Process Animation Blueprint。
1、Blend節點
Unreal 4引擎的Anim Graph中提供了一系列的Blend節點可以實現不同的動畫融合功能,其類似於Unity引擎中的Blend Tree功能。Blend節點的輸入是來自多個不同動畫文件的Pose數據以及Alpha權重參數,它會根據權重參數計算出最後融合的Pose,如下圖所示:
其中,A和B為兩個輸入Pose,Alpha為[0,1]的浮點數表示A和B的權重。當Alpha為0時輸出Pose全部來自A,當Alpha為1時輸出Pose全部來自B,當Alpha為0~1之間時輸出Pose為A和B的融合結果。類似功能的節點還有:Apply Additive、Blend Multi等。
Time Based Blend類型節點可用於連接兩個或多個動畫,並在動畫切換時進行融合。Blend
Poses by bool節點是其中一種,該節點根據輸入的Bool值(紅框中的Active Value)來控制True Pose和False Pose的切換,並且可分別設置兩個Pose的融合時間(藍框所示),其分別表示切換到True Pose的融合時間和切換到False Pose的融合時間,如下圖所示:
類似功能的節點還有:Blend Posed by int,支持多個動畫Pose的切換融合。
Layered Blend per bone節點可以將多個動畫的不同骨骼融合在一起,例如:將Locomotion的下半身體和射擊以及近戰的上半部分身體進行融合,可以實現一邊行走一邊射擊等動作。該節點需要配合Animation Montage的Slot使用,本文將在Animation Montage小節中進行介紹。
2、Blend Space
Blend Space是Unreal 4引擎動畫模塊中用於實現複雜動畫融合功能的資源。它最多可提供兩個控制參數,並支持在二維平面上擺放動畫採樣點對多個動畫進行融合。當變量取值在二維平面中的某一坐標位置時,Blend Space會根據採樣點處的動畫和坐標插值計算出當前坐標的動畫。下圖顯示了1D和2D的Blend Space示意圖:
其中,左圖為1D的Blend Space,包含一個參數Speed。右圖為2D的Blend Space,包含兩個參數Speed和Yaw。
Blend Space的創建與其他資源創建過程類似,點擊Add New按鈕或在Content Browser中點擊右鍵,在彈出菜單中選擇Blend Space即可。Blend Space資源分為1D和2D,分別支持一個和兩個控制參數的動畫融合。創建好Blend Space資源後雙擊即可打開編輯界面,如下圖所示:
上圖例子使用了1D的Blend Space,實現了根據Speed參數對Idle、Walk以及Run三個動畫進行採樣融合效果。其中,區域1顯示了資源的參數設置,區域2顯示了控制參數坐標軸以及動畫採樣點,區域3顯示了動畫文件列表。通常在使用Blend Space時首先需要設置坐標軸,如下圖所示:
其中,在Interpolation Type選項中可以設置動畫插值計算方式,默認設置是Averaged Interpolation。
設置好坐標軸即可從區域3動畫列表中選取採樣動畫拖動到區域2中。上述例子中設置了三個動畫採樣點:Idle、Walk和Run。在區域1中可查看其參數設置,如下圖所示:
上圖參數設置表示Idle動畫位於Speed取值為0處,Walk動畫位於Speed取值為93.75處,Run動畫位於Speed取值為375.0處。在區域3中可查看採樣動畫分布,如下圖所示:
其中,三個白色菱形點表示三個採樣動畫在Speed坐標軸上的位置,藍色菱形點表示當前Speed取值。點擊播放動畫,並拖動藍色菱形點在Speed坐標軸上移動,即可看到不同的動畫插值結果。上述例子為1D的Blend Space,2D的Blend Space比1D多了縱坐標,使用方式與1D類似。
Blend Space資源設置完成後,即可拖入Animation Blueprint的Anim Graph中作為節點使用,如下圖紅框所示:
3、Animation Montage
Unreal 4引擎中的Animation Montage是一個多功能的動畫編輯工具。它可以將多個動畫進行連接,並且支持自定義切分動畫段、循環播放、任意跳轉以及配合Layered Animation實現不同骨骼播放不同動畫的功能。它支持如同普通Animation Sequence一樣的Notification和Curve的編輯。同時,Animation Montage還支持重用。本節將對上述功能和使用方法進行介紹。
Animation Montage創建方式與其他資源相同,在Content Browser中雙擊即可打開編輯界面,如下圖所示:
其中,區域1顯示了資源的參數設置,區域2顯示了Animation Montage中Timeline相關的設置,區域3顯示了資源列表和Slot信息。
- 自定義切分動畫
Animation Montage中重要概念是Slot和Section。Slot類似於一個容器,可以存放多個動畫文件,並將它們按時序排列,其順序可通過在Slot的Timeline上拖動進行設置。Slot的管理支持分組,每組可包含多個Slot,如下圖所示:
上圖顯示了Slot的Timeline。其中的Slot名字為Jump,屬於Default Group,並且包含了三個動畫:ThirdPersonJump_Start、ThirdPersonJump_Loop和ThirdPersonJump_End。從區域3中動畫文件列表中可以添加更多的動畫文件到Slot中。
Section則是將整個Slot進行切分後的片段,主要作用是讓開發者可以在每個片段上進行編輯,從而達到不同的效果。默認情況,Slot只有一個Section,通過新建Section可將Slot分成多段,切分位置可通過在Section的Timeline上拖動進行設置,如下圖所示:
上圖顯示了Section的Timeline,其中包含了三個Section:Start、Loop和End,綠色豎線為其起始位置。添加新的Section可通過右鍵菜單創建。
通過在Section Track上添加Section並重新組合排列就可生成新的動畫序列。該新生成的動畫序列就是Animation Montage的輸出結果,如下圖所示:
上圖紅框中顯示了Section Track,其中Start、Loop和End被順序連接成一個動畫序列。
- Branch Notify
同時,Animation Montage也具有普通Animation Sequence一樣的Notification和Curve設置功能。並且,Animation Montage還具有新的Notification—Branch Notify。它支持在動畫播放的任意時刻跳轉到任意Section,如下圖所示:
上圖顯示了Animation Montage中的Notify和Curve的Timeline,其功能和編輯方式與Animation Sequence中相同。其中,Element Timing的Timeline顯示了當前所有Notify以及Section起始位置的可視化信息。比如,上圖中綠框0、1、3分別表示動畫Start、Loop和End動畫的起始位置,而藍框2表示TestNotify事件的起始位置。方框中序號顯示了事件觸發的時序,方便編輯的同時查看。圖中的Animation Montage的Branch Notify事件響應邏輯可以在Animation Blueprint的Event Graph中實現,如下圖所示:
上圖紅框中顯示了在Event Graph中通過添加Montage Set Next Section節點實現Branch Notify的過程。其中,觸發事件為TestNotify,即上圖Animation Montage的Notify Timeline中添加的事件。當該事件被觸發時,Montage Set Next Section節點會從Loop Section跳轉到End Section,從而實現了Section的跳轉功能。利用Section跳轉,可以實現更加豐富的動畫邏輯。
- 循環播放Section
此外,Section支持重複循環播放的功能,如下圖所示:
上圖中Loop Section變成藍灰色(紅框所示),表示其設置為循環播放。該功能可以用於製作有吟唱的技能,吟唱Section循環次數可根據吟唱時間確定,當吟唱結束後可利用Branch Notify跳轉到技能後搖的Section。
Animation Montage的播放可以利用Anim Graph中的Slot節點指定播放的Slot,如下圖所示:
其中,Slot節點的輸入是動畫狀態機的Pose數據,輸出則作為角色最終的Pose。然後在Event Graph中用Montage Play節點播放,如下圖所示:
Montage Play節點中可設置需要播放的Animation Montage資源名字,然後根據遊戲中的邏輯連接到相應的流程中。
- Layered Animation
Animation Montage配合Layered Animation能夠實現不同骨骼播放不同動畫的功能,例如:上半身骨骼播放攻擊動畫,下半身骨骼播放行走或是下蹲等動畫。該功能可以在Anim Graph中利用Layered blend per bone節點配合Animation Montage實現,如下圖所示。
其中,上圖節點圖中紅框表示獲取Pose的Cache信息,主要分別用於藍框和紅框操作來進行使用;藍框為直接將Cache Pose進行索引,而紅框則是將Cache Pose通過UpperBody的Animation Montage操作輸出新的Pose,並將新的Pose索引到混合結點中。最終,通過融合結點,則可以計算出最終的動作融合效果。在Layered blend per bone節點的屬性中可以對bone layer進行設置,如下圖所示:
上圖的設置使得Animation Montage的輸出Pose被融合到spine_01骨骼以及其子節點骨骼中,從而實現了角色上半身骨骼播放Animation Montage的動畫,下半身依舊播放Locomotion狀態機動畫的功能。
從大方向上來看,上述功能類似於Unity引擎Mecanim動畫系統的Layer動畫層融合功能,而從細微處來看, Layered blend per bone功能更像是Unity引擎中Layer動畫層融合功能中又加入了Mask的效果,大家可以體會一下:)
- Animation Montage重用
Unreal 4引擎提供了Animation Montage的重用功能。對於已經配置好的Animation Montage可以通過創建Child Animation Montage繼承其父類的所有設置。在Child Animation Montage除了 Slot中的動畫可以替換之外,其他的設置都無法修改,如下圖所示:
其中,Slot的Timeline中黃色的部分(紅框中)表示被替換掉的動畫,綠色表示繼承自父類的動畫。從上圖可見,其他的設置選項都被置為灰色,並且無法編輯。
4、Animation Composite
Unreal 4引擎中的Animation Composite提供了將多個動畫連接成一個動畫的功能,並且支持與普通動畫相同的Notify和Curve的功能。其創建方式與其他資源相同,在Content Browser中雙擊可打開編輯器,如下圖所示:
Animation Composite編輯界面與Animation Montage類似,上圖紅色區域中顯示了Composite、Notify以及Curve的Timeline。其操作方式只需將右側列表中的動畫拖入Timeline即可。其播放方式是在Anim Graph中當做普通動畫即可,如下圖所示:
Animation Composite的功能與Animation Montage有相似之處,它們都能將多個動畫拼接成一個動畫。但是,Animation Composite只提供了簡單的拼接以及Notify和Curve的功能,而Animation Montage則提供了更加複雜的Section循環以及跳轉功能。Animation Composite比Animation Montage使用更簡單可直接當做一個Animation Sequence使用,而Animation Montage還需指定Slot等信息。
5、Post Process Animation Blueprint
Unreal 4引擎的Skeletal Mesh資源參數中有一項Post Process Animation Blueprint,它為角色提供同時運行兩個Animation Blueprint的功能。通常情況下,角色的Animation Blueprint可以在Character Blueprint中的Skeletal Mesh組件的Anim Class參數中進行設置,如下圖所示:
Post Process Animation Blueprint不僅能替代主Animation Blueprint,更重要的功能是它可以允許開發者訪問和改變相關的骨骼動畫信息。在Unity引擎中,我們可以在LateUpdate中訪問和改變骨骼動畫信息,而在Unreal 4引擎中,則是通過Post Process Animation Blueprint來處理這件事。
同樣,Unreal 4引擎提供了AnimDynamic功能來與之配合使用,從而實現角色基於物理的動畫,其功能類似於Unity Asset Store中的Dynamic Bone,而Dynamic Bone功能更像是AnimDynamic的簡化版。
AnimDynamic節點支持對角色身上物件實現類似Ragdoll的動畫,例如:頭髮、項鍊、衣服等。該效果能夠在角色移動時,更加真實地模擬項鍊等物件的被施加外力從而產生擺動的動畫。AnimDynamic的底層實現並不會計算物理碰撞,而是利用小方盒對物體的形狀進行近似,然後通過限制方盒運動的角度範圍近似模擬物理碰撞產生的自然擺動,如下圖所示:
Unreal官方網站[1]中介紹了利用AnimDynamic和Post Process Animation Blueprint對怪物身上的項鍊施加動畫的教程,有興趣的讀者可進一步閱讀。
參考文獻
[1] https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AnimDynamics/index.html
以上則為Unreal 4引擎動畫模塊關於動畫融合的介紹,希望通過上述內容,可以讓您對Unreal引擎的動畫模塊產生明晰的感性認識。下周,UWA將為您帶來動畫模塊中動畫重定向、反向運動學等進階功能,歡迎關注!
揭秘! | 為什麼他們都用UWA GOT!
延伸閱讀
【虛幻引擎學習之路】渲染模塊之光照系統
【虛幻引擎學習之路】渲染模塊之材質系統
【虛幻引擎學習之路】渲染模塊之全局光照明
【虛幻引擎學習之路】渲染模塊之相機後處理