最开始我是忽略了这篇演讲的,因为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

阅读笔记 - Horizon Zero Dawn 广袤世界中的玩家漫游相关推荐

  1. VINS-Mono代码阅读笔记(十):vins_estimator中的非线性优化

    本篇笔记紧接着VINS-Mono代码阅读笔记(九):vins_estimator中的相机-IMU对齐,初始化完成之后就获得了要优化的变量的初始值,后边就是做后端优化处理了.这部分对应论文中第VI部分, ...

  2. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

    1.概述 转载:Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

  3. 【论文阅读笔记】从在线开发者聊天中自动提取基于意见的问答

    论文标题:Automatic Extraction of Opinion-based Q&A from Online Developer Chats 原文链接:https://ieeexplo ...

  4. 《JavaScript高级程序设计》阅读笔记(三):ECMAScript中的引用类型

    2.8 引用类型 1.Object类 ECMAScript中的所有类都是由Object类继承而来. Object类具有下列属性: Constructor:对创建对象的函数的引用(指针),对于Objec ...

  5. 《JavaScript高级程序设计》阅读笔记(七):ECMAScript中的语句

    if语句 语法: 1 if(condition){2 statement1;3 }4 else{5 statement2;6 } 迭代语句 1.do-while语句 语法: 1 do{2 statem ...

  6. 《JavaScript高级程序设计》阅读笔记(五):ECMAScript中的运算符(一)

    2.9 运算符 2.9.1.一元运算符 一元运算符只有一个参数,即要操作的对象或值. 1.delete:删除对以前定义的对象属性或方法的引用,但此运算符不能删除开发者未定义的属性和方法.示例: 1 v ...

  7. Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用

    Q_INVOKABLE宏定义了函数在元对象中可以进行调用,这个宏要写到返回值的前面,也就是函数的开头,如下例子: class Window : public QWidget{Q_OBJECTpubli ...

  8. 《JavaScript高级程序设计》阅读笔记(二):ECMAScript中的原始类型

    2.6 原始类型 ECMAScript有5种原始类型(primitive type),即Undefined.Null.Boolean.Number和String.ECMAScript提供了typeof ...

  9. Web前端文档阅读笔记-vis.js在vue cli中的使用

    程序运行截图如下: 首先要用npm导入的vis包 npm run vis 程序结构如下: 源码如下: HelloWorld.vue <template><div id="n ...

最新文章

  1. docker一:mac入门安装
  2. 复利计算5.0——结对(总结)
  3. 解决远程连接mysql错误1130
  4. 判断textarea是否超过行数限制
  5. 春招你必须掌握的Python经典面试题(附赠简历模版)
  6. android 缓存用什么地方,哔哩哔哩缓存在哪里 哔哩哔哩缓存文件夹位置
  7. 支付宝小程序链接跳转异常处理方法
  8. 2022年NPS基准:NPS分数达到多少算好?
  9. 先天八卦与后天八卦原理及区别
  10. chrome最简单的多开方法
  11. cba篮球暂停次数和时间_CBA在比赛时,为什么有“官方暂停”?
  12. 杀猪盘、仙人跳…手法过于大开眼界!“反欺诈AI大赛来了
  13. Ubuntu卡在登陆界面循环
  14. 2--java面向对象语法学习(部分1-变量,重载,重写)
  15. 网络安全法实施 个人信息保护立法还需做什么?
  16. linux非空(linux设置空密码)
  17. 翻译_第五章:《Explainable Recommendation: A Survey and New Perspectives》可解释推荐系统综述
  18. 原型工具 Axure 都有哪些好用的技巧
  19. 51单片机汇编学习例程(9)——ADC0809篇
  20. Android Studio2.3正式版带SDK安装教程

热门文章

  1. 沪深A股分析数据市场表现信息API接口(JSON标准格式,Get请求方式)
  2. 【语音识别】基于MFCC和MEL倒频系数实现声纹识别附matlab代码
  3. arch linux安装ssh,通过ssh远程安装arch linux
  4. 揭秘2023年高新软件技术
  5. 我的项目经理培训论文
  6. VC++ MFC资源中添加PNG,JPG等图片资源
  7. 【UOS操作系统】dd刻录镜像
  8. Spring Data JPA简单使用
  9. python django 实名认证 调用第三方平台
  10. Qt开发:Qt Widgets模块——简介