本文主要翻译自育碧的一篇博客(见原文),恰好motion matching 和learned motion matching都是育碧提出的,顺便就借着翻译这篇博客的机会来梳理一下motion matching的发展。
动作匹配(Motion Matching)是一种简单而强大的游戏角色动画合成方法。与其他方法相比,它不需要太多的手工工作,只要有一个基本的设置:不需要在动作图中构造动画片段的结构,不需要仔细地切分或同步它们,也不需要在状态之间显式地创建新的转换。然而,动作匹配最适合与大量的运动捕捉数据结合使用,而当使用所有这些数据时都有一个代价:大量的内存占用,随着系统的增长和应用场景的增加情况会变得更糟。在这里,我们提出了一种称为学习动作匹配的解决方案,它利用机器学习来大幅减少基于动作匹配的动画系统的内存使用。
动作匹配(Motion Matching)
首先,让我们试着理解动作匹配本身是如何工作的。一个好的入手点是先检查检查我们要处理的数据——长的、无结构的动画——通常来自一个运动捕捉数据集。一个典型的来自这样一个数据集的动画如下:
同时考虑这样的一个问题,基于原数据的基础之上,我们如何让这个角色按照以下的路径运动?
当有了一个好的动画数据集之后,动作匹配就能够很好地解决这个问题。它的工作原理是反复搜索数据集重的片段,找到一个片段,如果从当前位置播放,它会比当前的片段更好地让角色保持在路径上。结果会是一个拼凑起来的动画片段,就像这样:
决定何时开始播放一个新的动画,而不是继续播放现在你已经在播放的动画是关键。选择另一个片段,或者是说,跳转到我们数据集中的另一个动画帧,这需要我们能够衡量这种切换对我们的任务来说会有多好或多坏。决定具体如何做这件事很困难,因为一个动画帧包含了很多信息——而且其中一些信息可能对这个决策没有用处。
一个好的解决方案是手动挑选一些我们称之为特征的信息,并用这些特征来决定一个特定的动画帧与任务的匹配程度。在这种情况下,我们需要能够表达两个方面的特征——角色将要遵循的路径,以便我们可以看到它与我们期望的路径有多相似——以及角色当前的姿势,以便如果我们开始播放新的剪辑,角色的姿势不会发生很大变化。通过一些实验,我们可以发现脚部位置、速度、角色髋部速度以及未来轨迹位置和方向的几个采样正是我们实现这个路径跟随任务所需要的特征。它们看起来是这样的:
这些信息不仅从我们直观上来讲,也对那些必须在运行时搜索最佳匹配的算法来说,更精简,更易于管理。如果从每一帧动画中收集所有的特征值到一个数组,得到一个向量,我们称之为特征向量(视频上方的彩色数组)。这是这一帧执行任务能力的精简数值表示。我们为数据集中的所有帧提取这些特征,并将得到的向量堆叠成一个大矩阵,称之为匹配特征数据库。当需要决定是否切换到新片段时,我们结合当前姿势和即将到来的期望路径部分构造成一个查询特征向量,并在匹配特征数据库中搜索与查询最匹配的条目。一旦找到,我们在动画数据集中查找相应的完整姿势,并从那里开始播放。下面是搜索和它找到的最佳匹配的展示:
当我们切换到下一个动作片段那个烦人的突变该怎么处理呢?虽然我们有一些特征可以捕捉角色的当前姿势,我们也有一些表达未来轨迹的特征。包含那些轨迹的特征就接受为了保持沿着路径运动而牺牲动作的一些连贯性,如果姿势的变化不是太大,这种不连续性可以使用常见的技术轻松去除,例如短时间的交叉淡入淡出混合(cross fade),或者衰减过渡的源帧和目标帧之间的差异,也称为惯性化(inertialization)。这是我们应用了这种惯性化混合后的结果:
最后,我们可以应用一些脚步锁定和逆向运动学方法可以得到一个更好的结果
并且这也就意味着,如果选择不同的用来匹配的特征,我们就可以实现一个完成不同任务的动画系统,例如和物件交互,在参差不齐的地面上面导航,或者甚至和其他的角色进行交互,这就是现在许多优秀的动画系统和游戏背后的成功秘诀。