最开始我是忽略了这篇演讲的,因为Player Traversal是啥并没看懂- -b
后来看到 @顾露 大神在技术选荐中推荐了它,才拖下来看了看。
没想到这篇讲角色Locomotion的演讲中信息量意外的大,而且很细致,会贴心的把一些比较入门的实现细节也配图讲出来。
以至于我看到最后甚至希望把它的阅读笔记分享出来。——希望此文可以帮助到那些善用搜索引擎的人。
Horizon Zero Dawn 是由Guerrilla的自研引擎开发的,此引擎同时也是小岛秀夫备受关注的新作『Death Stranding』所使用的引擎。动画系统集成了NaturalMotion的动画网络中间件Morpheme。
《角色的起步与停止》
根据当前状态可能先迈左脚或者右脚
结束动画transition时间过长,会导致无法响应接下来的移动指令。
解决方法是使用带有Duration的动画内Event。当进入Event时间段时允许提前结束transition。
起步机制
根据玩家摇杆方向在三种起步动画中选一个。每个方向90度,没有向后移动,摇杆给后就是转身。
左右两方向的起步开始是动画驱动,一段时间之后才由程序管理。
保留了3帧玩家输入指令,这部分我不是很懂。
好像是说为了触发180度转身,需要一个180度掉头的指令,但是玩家手并没有那么快,程序会收到 “向前-减速-停止-向后-完全向后” 这样一系列的指令,这个过程会覆盖若干帧。也许是因为这会导致无法正确触发180度转身,所以连续记录3帧的指令,综合判断玩家的输入。
他们用的Locomotion变量:移动状态(bool),速度(float),方向(float)
有时候开始动画还没完,就松开摇杆了,然而开始动画要走好久。
希望能灵活一些,如果玩家提前松开摇杆,就尽快停止。为此引入了Shuffle和Step两种停止动画。
ShuffleExit用于起步动画前半段,StepExit用于起步动画两只脚发生交叉之后,如果再晚则使用通常的CycleExit。
《角色移动与地形系统的互动》
主角移动时会用前后左右4个Probe探测地形,来计算当前移动位置的坡度。还要与前一帧进行插值。
主要目的是过滤掉地形上不要想的高频变化。
把碰撞测试放在线程里,延迟一帧拿到数据。
脚落位
从膝盖开始向下打射线。根据动画的阶段决定哪只脚是支撑脚,另一只脚做落位检测。
“脚悬空”问题
在悬崖边上可能出现一只脚悬空的问题。解决方法是当射线检测找不到地面时,就做球形射线检测。
《跨越系统 - Vaulting》
在Aloy面前不远处从上到下做一次球形射线检测,这个检测也是在后台线程进行的。
如果碰撞点高于地面,准备触发Step Over/Up,如果碰撞点低于地面并且在水平方向上距离圆心有一些偏移,则准备触发Step Off
如果是第一种情况,继续向更前方打射线来确定高台的厚度,进而决定是Over还是Up。
然后系统要选择一个过渡动画来表达这种跨越。
过渡动画有好多,根据若干个条件来联合判断具体选择哪个过渡动画。
处理动画与场景的对齐时有一些注意点。
首先对动画进行预处理来统计出来整个动画中每一帧的位移数据。
在播放的时候把对齐所需要做出的补偿位移按照每帧的位移数据多少来在时间上进行分摊。
但这种补偿并不能在每一帧都进行,比如玩家脚落地的时间段必须排除在外。
另外大部分情况也并不是希望直到最后一帧才完成对齐过程,所以要人为的在动画上去标记一个提前完成时间点。
对原本的动画插入了额外的位移,会导致动画产生一些预期之外的效果。在进入补偿的时间段时,速度会突然变化,这种速度变化是视觉可见的。
所以最后还需要根据补偿的多少来反算一个播放速度,加入了补偿以后,依然要保持动画原来的位移速度,所以用相应的比例对动画的播放速度进行调整。
《世界与环境》
512mx512m的Tile,每次加载9个Tile,动态Streaming。
每个Tile包含一系列元数据。
碰撞体:决定哪里可以移动。
水体:决定哪里可以游泳。
潜行区域
道路
几何体标记:用于标记这个位置是否支持各种互动行为。
几何体标记是一些点或者线,种在世界上各种物体表面。可以给加一个或多个标签。
比如下图:
Climbable 指可以用两只手扒住的攀爬点。
Balanceable 是指可以用脚站在上面的点。
Unstable 指站在上面时要播放一些站不稳的动画。
Ziplineable 指该物件是可以滑下的溜索。
《跳跃辅助》
先简单说一下跳跃,本作中跳跃在空中是可以控制位移和方向的,目的是提高操作反馈。
环境中的一些梅花桩需要跳跃辅助,否则玩家很难跳上去。
预测跳跃轨迹,然后加补偿。
他们给各种跳跃动画以及一些典型的混合比例进行分析,把分析出来的各项参数存下来,存成一个数据库。
运行时根据需要的情况去查询,找出最接近的组合,然后再做一点点修正就可以用了。
《攀爬》
依据玩家的输入,选择输入方向最接近的annotation点。
然后从过渡动画库里挑选一个合适的动画,和前面一样。(他们特意提到他们有100+个这样的动画从中选择)
在爬的过程中双手和双脚分别要检测环境进行处理。
手:对齐几何体,当前的或者动作目标
脚:在腰部向前进行射线检测,如果能找到落脚点就让脚踩住,不然就让脚悬空。
最后,对于动态物体,同样可以攀爬。
攀爬的时候把动态物体的世界位移和旋转也实时施加到主角身上即可。
在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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。