Motion Matching初實踐


3樓貓 發佈時間:2024-10-21 03:32:33 作者:提子味芬達 Language

在體驗官方的Motion Matching(運動匹配,簡稱MM)的實例後,感覺這有可能成為未來遊戲對Locomotion動畫系統的新選擇(什麼屁話,育碧早就開始用了)。心癢癢的就想著看看能不能用手頭的動畫素材來複現一下,一是想要從零開始搭建,摸清MM需要怎樣的資產進行運作;二是想跟著官方案例走,對MM系統的運作原理做一次摸底。然後就有了這萬餘字的筆記了。
MM系統引入了很多新內容(至少對我來說確實如此),因此在對MM系統進行復現的同時,還要對新內容進行學習區分,一邊瞭解新內容的工作流程,一邊重複測試其對MM系統的作用及必要性。因此想要做短時間內從初識MM到熟練使用MM,需要本身就對動畫系統、運動組件、以及動畫姿勢特徵有一定的知識積累;此外,要是有對動畫扭曲Animation Warping相關使用經驗,就更好了。當然這個只是對操作者的要求,MM系統對動畫資產的要求同樣不低,而最不可缺少的就是,動畫資產需要包含根骨骼運動數據。
當然啦,剛開始學習的我哪知道這個,下了虛幻自帶的角色資產之後就開始上手搞了嘛!而結果是還真就搞出來了。從最簡單開始,先製作角色的待機與行走狀態。MM系統對動畫進行混合的流程與傳統狀態機的類似,只不過是將狀態機更換為Pose Search Database(簡稱PSD,用於存儲狀態類似的動畫資產),將轉換條件更換為使用Chooser(選擇器表)的 條件Column。我將待機動畫歸至Idle狀態,行走動畫歸至Jog狀態,檢測 運動組件Character Movement的速度是否為0來做條件切換該兩個狀態,成功實現兩個動畫資產的單獨播放。那接下來就是加入起步以及行走結束的動畫以實現待機到行走的平滑過渡。
對於傳統狀態機,兩個動作進行混合,可以直接使用機器做插值計算混合,也可以製作混合空間Blend Space,通過調節暴露的參數分配權重來混合,也可以插入對應的過渡動畫資產來實現動動畫切換。若需要使用第三種方案,就需要添加動畫資產並設置過渡條件。MM系統也是如此,但對於以上的第二、第三種方案,在MM系統中可以直接將相應的混合空間或動畫資產添加到PSD中,在執行動畫更新時經過Chooser的篩選進行播放。由於在判斷當前角色處於待機或是行走狀態是用速度是否為零來做條件,那按照正常邏輯,當角色處於起步與結束狀態時,其速度小於行走速度但不為0,因此應該把起步、行走循環、行走結束的動畫放置在同一個PSD中進行檢測,然後使用當前速度值對其進行區分。此乃第一個坑。
由於在Chooser進行篩選時,若有多個資產的條件相同,優先選擇上層的資產輸出,因此在上面的案例中,由於角色起步與結束時速度值範圍都處於0到行走速度之間,就會出現在起步時播放結束的動畫,或者在結束時播放起步的動畫。至此,不難分析得知,對於起步與結束的狀態,需要設置更嚴謹的轉換條件。使用速度方向做區分?不行,因為起步與結束時有可能都朝向同一個方向移動。使用當前加速度大小做區分?似乎也不行,跟速度值一樣,在某個階段會處於加速度大小相同的狀態?再進一層思考,在起步時,角色將繼續加速,在未來某個階段會達到行走時的速度;而在結束行走時,角色將持續減速直至停止在原地。那有沒有一種可能,可以使用未來的速度做區分?
當角色接受輸入時,其運動組件會按照設置的方向驅使角色移動,而在得知角色運動的最大速度、加速度,以及地面的摩擦因素等數值前提下,是否能計算出角色在未來某個時間點的位置或速度?簡單物理題嘛,肯定是能的。同樣的計算,當角色斷開輸入的瞬間,角色將要停止,同樣也可以計算某個時間點角色的位置或時間。那通過預測角色未來某個時間點的速度,對比當前時刻的速度,我們可以判斷角色是處於何種階段:
  • 持續為0,角色處於閒置靜止狀態
  • 持續不為0,角色處於連續運動狀態
  • 當前可能為0,未來不為0,角色處於起步狀態
  • 當前不為0,未來可能為0,角色處於停止狀態
要對角色運動進行預測,則需要添加Pose History節點。該節點能生成預測的軌跡點並存儲歷史軌跡點。在動畫藍圖中添加如此函數,並連接到Event Update Blueprint Animation每幀觸發,即可獲取基於當前時刻的軌跡Trajectory引用。(*Speed 2D是當前速度在XOY平面上的矢量長度值)
從當前軌跡Trajectory獲取未來0.4秒及0.5秒的位置,求取其差值,併除以時間差0.1秒從而粗略計算出未來速度Future Velocity,通過判斷當前速度Veloctiy與未來速度Future Velocity,可以判斷角色當前的運動階段。
但官方案例中並不對當前速度Veloctiy與未來速度Future Velocity進行對比,而是計算該兩速度在一定範圍內是否都不等於0,若是,設置角色狀態為Move,否則設置為Idle。當角色處於Move狀態,使用Veloctiy與Future Veloctity進行對比,當Future Veloctity與Velocity的差值大於等於100時,說明Velocity還未能接近Future Velocity,設置角色狀態為起步(官方案例中是設置Is Starting函數返回值為真,此處為了講解目的便如此書寫罷);當該兩個速度差值小於100 時,說明角色將很快達到最大移動速度,即將與行走循環動畫做混合。當角色處於Idle狀態時,當前角色的平面速度值,若大於20,說明角色將停不停,讓角色播放行走停止動畫;若小於20,則播放閒置動畫。
如上修改後確實能正常播放各個階段的動畫。以下為結果展示


© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com