阅读笔记 - 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

相关文章
相关标签/搜索