Motion Matching 的介绍

最近老是有朋友问过我关于Motion Matching 的问题,在育碧的时候没有直接参与过Motion Matching 的项目,但因为一直比较关注,看了很多文章,也与大神有些交流,所以多少也有所了解. 在目前的公司也有类似的技术,核心差不多,用了一段时间后也有了更多的了解, 干脆写篇文章, 从动画师/技术动画 的角度, 从历史, 原理以及利弊分析, 来聊聊我对Motion Matching所了解的一些内容. 至于具体的程序的实现方式不是我所关注的.

做游戏动画的都知道,传统的动画系统是通过State Machines 将所有的动画片段连接起来,通过设置条件,来选择播放什么动画。在AAA游戏中,因为操作的多样性以及为了动画混合的流畅程度,往往需要海量的动画片段以及各种琐碎的过度动画,于是乎State Machines里往往是这样(这是一个简单的例子..):

由于系统过于复杂, 常常想增加动画或者修改链接却无从下手, 需要花大量的时间理清现有的动画系统. 且每一条动画都需要动画师切割, 制作循环等, 从0到建立一个完整的动画系统常常需要数个月的时间.

于是就有了后来的Motion Matching(动作匹配)技术, 让计算机根据玩家的输入,自动的从数据库中选择动画数据来合成新的动画播放, 在不需要动画师的情况下, 如果动画数据库数据量充足, 从0到建立一个完整的动画系统只需要半天的时间. 而动画师的精力可以更多的放在Polish动画数据的质量上, 而不是琐碎的切割动画,做循环的无脑工作.

Motion Matching 技术发展的几个里程碑

2002 Motion Graphs

2002 年由University of Wisconsin 的一群人为学术研究开发出的一套实时的动画系统, 因为太老了,只找到了网上的PPT: slideplayer.com/slide/4

用程序检测所有动画片段中每帧动作的相似性(比对 速度,加速度,pose等),预先定义 可以过度的动画点并动生成过度动画.

当接收到玩家输入后, 动画会播放到预先定义的过度动画点,再过度到下一个动画片段. 因为预先定义过度点保证了动画过渡时两段动画的相似性,从而达到了流畅的过度,但因为玩家输入和过度点的时间差,而造成了操作反馈的延迟.


作为学术研究,因为无法满足游戏操控需求的“反馈及时性”(responsive), 所以并没有得到到游戏业界太多关注,但其 “对比大量的动画数据,找到动作的相似性” 的思路为后来的 Motion Fields 以及Motion matching 奠定了基础.


2010 Motion Fields (Motion Matching 的基础)

https://www.zhihu.com/video/1047106193566277632

2010年由University of Washington的一群人为学术研究开发出来的系统.

原paper: grail.cs.washington.edu

原文

“We propose a structure called a motion field that finds and uses motion capture data similar to the character‘s current motion at any point. By consulting similar motions to determine which future behaviors are plausible, we ensure that our synthesized animation remains natural: similar, but rarely identical to the motion capture data. This frees the character from simply replaying the motion data, allowing it to move freely through the general vicinity of the data. Furthermore, because there are always multiple motion data to consult, the character constantly has a variety of ways to make quick changes in motion.”

归纳的意思就是,根据玩家输入,通过 实时 的比对当前动画和数据库中的动画片段,寻找动画数据库中于当前动画最匹配的祯或片段来 合成 新的动画,从而实现操作反馈及时性的同时保证动作的流畅性. 合成后的动画会与原动画数据有一定的相似性,但因为是由来自于不同片段动画数据的拼接,且由每次玩家输入的细微差别作为变量(比如说移动遥感的速度变化),导致搜索结果的细微差异,从而达到所展现出来的合成动画的不重复性.

相对于Motion Graphs 的预先定义过度动画点, Motion Fields 在保证了动作流畅性的同时,保证了超控反馈及时性,动画的不重复性也让动作更加自然, 也因此受到了游戏业界的关注.

但Motion Fields 的算法太过于沉重复杂,并且其多庞大的数据量及内存需求当时的主流主机XBOX360 以及PS3 的机能并不能满足,因此在当时的条件下Motion Fields 并不适用. 但其流畅以及反应及时的混合效果让游戏业界看到了未来游戏动画的希望.


2016 Motion Matching (GDC 2016)

在次世代PS4 和XBOX ONE 普及后, 2016 年的GDC 上, 育碧第一次向外界展示用于游戏 荣耀战魂 的动画系统 Motion Matching.

Motion Matching 继承了Motion Fields 的“实时搜索动画数据库找到最合适的祯或片段来实时合成新的动画”的思路, 将 Motion Fields 的算法简化并实用化并且成功的用于游戏的角色操作系统中, 此系统大多用于寻路(走,跑,跳 等), 且已经达到了在及时反馈的前提下,不牺牲动画质量的最好的过度混合效果.

完整的GDC演讲的视频, 太长了我就放链接

https://www.youtube.com/watch?v=KSTn3ePDt50&t=330swww.youtube.com

育碧起了头并分享了技术(育碧赛高),然后各个大厂也陆陆续续研发出了自己的Motion Matching 的动画技术,取了各种名字(比如 EA 叫 Pose Trajectory Matching, 目前广泛用于运动类游戏),但其背后的原理都是大同小异.


具体的实现

我们知道了Motion Matching 继承了Motion Fields 的 实时搜索动画数据库找到最合适的祯或片段来实时合成新的动画 的思路,那具体是怎么实现的呢?

其最关键的部分就是如何找到与当前动画最匹配的动画数据.

那就是,通过对比当前动画与动画数据库中的动画数据的 轨迹Pose, 速度.

以每秒30帧为例,假定有由 A,B,C,D,E 个动画片段组成的动画库,以下的所有步骤都是在 1/30 秒内实现的.

轨迹

首先根据玩家当前的操作输入,结合当前角色运动的 速度,加速度,可以预判出一定时间后的角色的位置,以2秒为例。

然后分别找出 A, B, C, D, E 片段从第0帧开始, 2秒后的角色位置, 与预判的角色位置做比较,并记录位置间的距离.

这里以其中一个片段为例,记录2秒后角色距数值 20 和面向角度数值差 110



Pose

接下来对比当前角色骨骼和片段A的第0帧的角色骨骼,臀部, 左脚骨骼点,右脚骨骼点的位置,并记录距离的数值 0.02, 0.05, 0.07

速度

接下来对比这三个骨骼点的速度,并记录速度的差值 8-4=4, 5-3=2,7-8=1

由此我们得到一组数据,即当前的角色动画与动画片段A的第0帧相比较:

2秒后角色的的位置举例差: 20

2秒有角色的面向角度差:110

当前角色Pose 与片段A第0帧的臀部距离: 0.02

当前角色Pose 与片段A第0帧的左脚距离: 0.05

当前角色Pose 与片段A第0帧的左脚距离: 0.07

当前角色Pose 与片段A第0帧的臀部速度差: 4

当前角色Pose 与片段A第0帧的左脚速度差: 2

当前角色Pose 与片段A第0帧的右脚速度差: 1

这些数值的和越小,则当前角色动画与动画片段A的第0帧越接近。

但是在实际的情况是并不是每一个因素都是同等重要, 比如在某些情况下角色的轨迹重要程度大于pose, 或者臀部的速度比臀部的pose更重要,于是根据重要程度,让这几个数据乘以百分比。这个百分比是一个开放的数值可以根据需要调整。

于是就有了:

2秒后角色的的位置举例差: 20 *1 = 20

2秒有角色的面向角度差:110*1.5 = 165

当前角色Pose 与片段A第0帧的臀部距离: 0.02*0.5 = 0.01

当前角色Pose 与片段A第0帧的左脚距离: 0.05*0.8 = 0.04

当前角色Pose 与片段A第0帧的左脚距离: 0.07*0.3 = 0.021

当前角色Pose 与片段A第0帧的臀部速度差: 4*1= 4

当前角色Pose 与片段A第0帧的左脚速度差: 2*0.6 =1.2

当前角色Pose 与片段A第0帧的右脚速度差: 1*0.4 = 0.4


求和得到一个数值:190.671, 这个数值称为一个cost.

以上是将当前动画与动画片段A的第0帧比较,得到的一个cost. 重复以上的步骤,将当前动画与 A,B, C, D, E 的所有帧做比较,得出的cost最底的那一帧, 就是下一帧会播放的动画.

以上的所有步骤都是在1/30 秒内完成,根据玩家的输入,实时的进行以上步骤,从而实现及时反馈以及最流畅的动画合成. 在玩家不停的改变操作的极端情况下,游戏里的看似流畅的动画的每一帧,都有可能来自于不同的动画片段。


动画数据库 以及 Dance-Card

因为Motion Matching 选择数据不已人的意志,而以数据得出的cost来决定,因此为了得到最佳的效果,保证动画数据的多样性和对所有动作全面的coverage 就特别重要.

育碧多伦多工作室分享了他们用于动态捕捉模板的Dance-Card, 以此为模板来做动补,能满足Motion Matching需要的最大限度的coverage. 每一个Dance-Card 捕捉出的动画既是数据库中的一个片段.

1. Walks and Runs.

2. Small repositions.

3. Starts and Stops.

4. Circles (Turns).

5. Plant and turn (foot down to change direction) 45, 90, 135 and 180 degrees.

6. Strafe in a square (forward, left, back right – contains 90 degree plants).

7. Strafe plants (foot down though not turning) for 180 direction shifts.

视频:

利弊分析

在效率上, Motion Matching 只需要将动态捕捉的数据作为动画数据库, 在不需要动画师的前提下, 程序员或者游戏设计师就可以在短时间内建立一套可以操作动画系统, 在此过程中排除掉数据库中肯定不会用的动画, 或者根据需要增加动态捕捉数据. 而动画师则可以把精力集中在提高肯定会用到的动画的质量上, 且不需要花时间在切割动画, 做循环等传统的无脑工作上.

在效果上, 操控反馈的及时性得到保证, 动画的衔接也更加流畅, 且由每次玩家输入的细微差别作为变量(比如说移动遥感的速度变化), 导致搜索结果的细微差异,从而达到所展现出来的合成动画的不重复性, 动作也就更加自然.

其弊端则是需要庞大的动画数据量的支持, 对硬件的内存要求很大.

编辑于 2018-11-28

文章被以下专栏收录