閱讀筆記 - Horizon Zero Dawn 廣袤世界中的玩家漫遊

最開始我是忽略了這篇演講的,由於Player Traversal是啥並沒看懂- -b
後來看到 @顧露 大神在技術選薦中推薦了它,才拖下來看了看。
沒想到這篇講角色Locomotion的演講中信息量意外的大,並且很細緻,會貼心的把一些比較入門的實現細節也配圖講出來。
以致於我看到最後甚至但願把它的閱讀筆記分享出來。數據庫

——但願此文能夠幫助到那些善用搜索引擎的人。網絡

Horizon Zero Dawn 是由Guerrilla的自研引擎開發的,此引擎同時也是小島秀夫備受關注的新做『Death Stranding』所使用的引擎。動畫系統集成了NaturalMotion的動畫網絡中間件Morpheme。測試

《角色的起步與中止》

根據當前狀態可能先邁左腳或者右腳動畫

結束動畫transition時間過長,會致使沒法響應接下來的移動指令。
解決方法是使用帶有Duration的動畫內Event。當進入Event時間段時容許提早結束transition。
v2-5c9b5bb09198d82d0e5d60e7355c1cc4_r.png
起步機制搜索引擎

根據玩家搖桿方向在三種起步動畫中選一個。每一個方向90度,沒有向後移動,搖桿給後就是轉身。
v2-a300b987b4e2d1a19c1bddfb1ef2b76f_r.pngspa

左右兩方向的起步開始是動畫驅動,一段時間以後才由程序管理。
v2-6a6c6dcb57526e250e6aff37d7e850ff_r.png線程

保留了3幀玩家輸入指令,這部分我不是很懂。
好像是說爲了觸發180度轉身,須要一個180度掉頭的指令,可是玩家手並無那麼快,程序會收到 「向前-減速-中止-向後-徹底向後」 這樣一系列的指令,這個過程會覆蓋若干幀。也許是由於這會致使沒法正確觸發180度轉身,因此連續記錄3幀的指令,綜合判斷玩家的輸入。
v2-3c5a43cfca9324089fe7812680cea8d6_r.png
他們用的Locomotion變量:移動狀態(bool),速度(float),方向(float)
v2-d6424b5b9d392643089a49b7fc475f16_r.png3d

有時候開始動畫還沒完,就鬆開搖桿了,然而開始動畫要走很久。
但願能靈活一些,若是玩家提早鬆開搖桿,就儘快中止。爲此引入了Shuffle和Step兩種中止動畫。
ShuffleExit用於起步動畫前半段,StepExit用於起步動畫兩隻腳發生交叉以後,若是再晚則使用一般的CycleExit。
v2-4d315d33cd80d11168fe2d218a43b7b0_r.png
v2-06f6b552198898b2f2f479bd3b81f29a_r.png中間件

《角色移動與地形系統的互動》

主角移動時會用先後左右4個Probe探測地形,來計算當前移動位置的坡度。還要與前一幀進行插值。
主要目的是過濾掉地形上不要想的高頻變化。blog

把碰撞測試放在線程裏,延遲一幀拿到數據。
腳落位 v2-c6f148a9232303b3ea687144323c9eaf_r.png

從膝蓋開始向下打射線。根據動畫的階段決定哪隻腳是支撐腳,另外一隻腳作落位檢測。
「腳懸空」問題
在懸崖邊上可能出現一隻腳懸空的問題。解決方法是當射線檢測找不到地面時,就作球形射線檢測。

《跨越系統 - Vaulting》

在Aloy面前不遠處從上到下作一次球形射線檢測,這個檢測也是在後臺線程進行的。

若是碰撞點高於地面,準備觸發Step Over/Up,若是碰撞點低於地面而且在水平方向上距離圓心有一些偏移,則準備觸發Step Off
v2-968cb3ce2d95702b5e3eaacdda951144_b.png

若是是第一種狀況,繼續向更前方打射線來肯定高臺的厚度,進而決定是Over仍是Up。
v2-29abafc9377279b62199b17e548a8309_r.png

而後系統要選擇一個過渡動畫來表達這種跨越。
過渡動畫有好多,根據若干個條件來聯合判斷具體選擇哪一個過渡動畫。

處理動畫與場景的對齊時有一些注意點。
首先對動畫進行預處理來統計出來整個動畫中每一幀的位移數據。
v2-afad304422356ae98cca04639221cc6f_r.png

在播放的時候把對齊所須要作出的補償位移按照每幀的位移數據多少來在時間上進行分攤。
v2-551cf7786c34fc7ee18ad1a1676e77a3_r.png

但這種補償並不能在每一幀都進行,好比玩家腳落地的時間段必須排除在外。
另外大部分狀況也並非但願直到最後一幀才完成對齊過程,因此要人爲的在動畫上去標記一個提早完成時間點。
v2-36a70bbff0beff296e0a7c561e53ffb0_r.png

對本來的動畫插入了額外的位移,會致使動畫產生一些預期以外的效果。在進入補償的時間段時,速度會忽然變化,這種速度變化是視覺可見的。
因此最後還須要根據補償的多少來反算一個播放速度,加入了補償之後,依然要保持動畫原來的位移速度,因此用相應的比例對動畫的播放速度進行調整。
v2-ea094077a22c26af0b74dfa24603c481_r.png

《世界與環境》

512mx512m的Tile,每次加載9個Tile,動態Streaming。
每一個Tile包含一系列元數據。

  • 碰撞體:決定哪裏能夠移動。

  • 水體:決定哪裏能夠游泳。

  • 潛行區域

  • 道路

  • 幾何體標記:用於標記這個位置是否支持各類互動行爲。

幾何體標記是一些點或者線,種在世界上各類物體表面。能夠給加一個或多個標籤。
好比下圖:
Climbable 指能夠用兩隻手扒住的攀爬點。
Balanceable 是指能夠用腳站在上面的點。
Unstable 指站在上面時要播放一些站不穩的動畫。
Ziplineable 指該物件是能夠滑下的溜索。
v2-67cf6f81b8247fb7b92a6eea1bd679ae_b.png

《跳躍輔助》

先簡單說一下跳躍,本做中跳躍在空中是能夠控制位移和方向的,目的是提升操做反饋。

環境中的一些梅花樁須要跳躍輔助,不然玩家很難跳上去。
v2-f035d77260331ddcfa17921ac548320f_b.png

預測跳躍軌跡,而後加補償。
他們給各類跳躍動畫以及一些典型的混合比例進行分析,把分析出來的各項參數存下來,存成一個數據庫。
運行時根據須要的狀況去查詢,找出最接近的組合,而後再作一點點修正就能夠用了。
v2-4ab83aaf4ddcd754612526751a722460_b.png

《攀爬》

依據玩家的輸入,選擇輸入方向最接近的annotation點。
而後從過渡動畫庫裏挑選一個合適的動畫,和前面同樣。(他們特地提到他們有100+個這樣的動畫從中選擇)
在爬的過程當中雙手和雙腳分別要檢測環境進行處理。
手:對齊幾何體,當前的或者動做目標
腳:在腰部向前進行射線檢測,若是能找到落腳點就讓腳踩住,否則就讓腳懸空。
v2-eee54c1da55487176cab95e747388fa7_r.png
v2-5b40a7d006ae2467d6c169d4dad80446_r.png

最後,對於動態物體,一樣能夠攀爬。
攀爬的時候把動態物體的世界位移和旋轉也實時施加到主角身上便可。
在Horizon Zero Dawn中,女主角Aloy的更新頻率比其它單位要高。因此位移的更新要按照攀爬物的更新頻率來。

這個遊戲中所出現的Locomotion其實在多年以前就已經在各類遊戲中普遍使用了。 可是往年的演講通常起步點都比較高,主要面向一些硬核問題。
這一篇覆蓋到了不少常見問題,並給出解決方案。我很慶幸本身最終並沒錯過它。

原文連接

若是您對這個領域感興趣,我這裏還有幾個最近幾年的資料能夠推薦給您:
Motion Matching and The Road to Next-Gen Animation
In Your Hands: The Character (of Watch_Dogs)
Reinforcement Learning Based Character Locomotion in Hitman: Absolution

相關文章
相關標籤/搜索