我认为滑步产生的主要原因一个是动画表现速度(包括移动和方向)和角色Capsule速度不一致。尤其动画速度不线性不规则,这往往通过Distance Matching或者RootMotion来解决;二是动画混合产生的中间姿态不能匹配角色速度,比如跑-停,包括旋转到停等,这些通常减少混合时间不易察觉,但混合时间久了问题明显。增加中间姿态(动画)可以减少混合时间,但随着动画姿态的增加,状态机逻辑越来越复杂不好维护。Motion Matching我认为可以理解为使用更多动画姿态下更加高级的一种自动状态机。因此天然的可以减小以上两种情况下产生的滑步。
关于Motion Matching动画资源多,比较重的担忧,其实Fortnite目前全平台(包括手机)都使用了Motion Matching,项目对动画内存预算也很紧,而且动作也快。因此使用了不少方法来实现使用比较少的动画产生流畅动画效果,包括减少滑步。
- 没有长动画,使用短动画,并且易于互相连接混合的动画,来减少整体内存开销。易于混合连接表现在比如各个动画脚底位置,速度会有一个一致性
- 创建多个Databases,使用游戏逻辑驱动切换调用;这些Database可以有不同的复杂度,以及连贯性。比如用来区分“转向”动作与“启动-停止”、“待机”、“跑步循环”等动作;区分高端和低端平台的设置
- Motion Matching本身对有限动画资源能产生比较好的结果做了改进。比如动画混合使用了blendstack 节点,而不是惯性混合,避免快速切换动画的情况下产生高频率动画碎片化,导致惯性混合阶段的抖动等瑕疵
- 之后再使用程序动画做进一步的修正。用于弥补动画数据不足和提升角色动作的真实性和流畅性。比如capsule和选定动画速度有差别,使用Stride Warping和Play Rate Scaling结合方式;还定义了一些Blend Profiles用来更细腻的控制两个选择动画混合的速度,同时减小下半身动画混合过渡期来减少滑步。此外,通过方向扭曲(orientation warping) ,将所选动画的姿态向用户输入轨迹的方向进行微调,从而提高运动路径的准确性与响应性。这个行为是在blendstack里对各个动画序列预先做掉了
- 最后还有些参数微调来优化表现。比如 Continuing Pose Bias增加当前姿态权重等等
这个视频其中一部分提到了以上的一些做法
另外之前其他开发者也有一些各自经验分享仅供参考