⚓{0x04} Learned Motion Matching

发布于

2026年10月9日

更新于

2026年10月9日

背景

Motion Matching 的发展

motion matching技术是最近新兴的角色动画系统的技术,主要解决不同动画序列之间的过渡。其核心思想是,建立一个庞大的小序列数据库,当需要进行动作的过渡时,算法计算出未来一小段时间的姿势、速度、轨迹等你所考虑的指标,然后在数据库中搜索相匹配的动画序列,然后将其播放。在实际使用的时候,可以根据需求调整匹配的具体形式,如速度的权重要大,轨迹的权重可以小一点等等。同时,可以所有动作序列进行分类,然后可以根据需求限制搜索空间。

那么显而易见的是,只要数据库的序列足够丰富,对动作之间的过渡进行人工干预的情况就会变少。因此,基于此技术可以非常方便的搭建其一个动画系统。但目前这种也有其局限性,比如对于一些非 locomotion 的动作来说,如何得到丰富的的小序列是比较困难的。以格斗游戏为例子,对于同一个连招,按下按钮的持续时间、按键之间的间隔不同会影响角色的动作快慢、力量感等等。而这些动画越是具有张力、艺术性,在现实世界就越难做出了,也就难以使用动作捕捉。而这部分还是会使用传统的方法来实现,比如动画师通过操纵骨骼、蒙皮来生产关键帧等等。当然,还有一些其它问题,比如当数据库的序列过多时,搜索算法就很容易成为性能瓶颈。

本文主要介绍 Holden 等人利用深度学习技术来去除Motion Matching的运行时数据库 。

总体框架

论文作者根据 Motion Matching 的流程,找到三个地方使用深度学习来优化,分别是搜索、动画数据,动画播放。
以一个最基础的motion matching运作流程为例,当一个特征x^\hat{x}(姿势、速度、轨迹等)被输入后,利用 k-nn 算法找到数据库中临近的一个特征xx,然后再根据xx找到对应的动画yy(即一个键值对),最后不断播放下一帧直到有新的x^\hat{x}输入进来。

motion matching
motion matching

Decompressor

作者首先对数据库这一部分下手,使用自编码的技术来压缩动画序列的数据库(但还保留了特征xx的数据库)。具体做法如下

  1. 将yy编码到隐变量zz,然后将zz和对应的特征xx一起作为Decoder的输入解码,得到y^\hat{y}
  2. 计算L\mathcal{L},计算梯度,优化网络参数

这个算是比较常用的自编码套路。当网络训练好后,我们就可以将yy对应的zz储存起来,也就是yy压缩到了zz。现在我们从存储(x,y)(x,y)变成了存储(x,z)(x,z),这样就达到了压缩动画序列的数据库了。在使用的时候,只需要额外的将(x,z)(x,z)经过Decompressor网络生成对应的yy即可。但现在还是存在两个数据库xx和zz,接下来我们讲如何去掉运行时的这两个数据库,变成无数据库的技术。

Stepper

为了在运行时除去xx和zz两个数据库,同时还有保证可以正常工作,我们需要考虑一个问题:如何知道下一帧的动画?这就是一个典型的预测问题了。

文中介绍了一个名为 Stepper 的方法,用于计算下一帧的(δx,δz)(\delta x,\delta z),然后就能计算出下一帧的(x,z)(x,z)了。具体做法如下

  1. 对于一个窗口为ss的动画(X,Z)(X,Z),我们需要预测(X^0,Z^0)\left(\hat{X}_0,\hat{Z}_0\right),那么
  2. 首先赋值 (X^0,Z^0)=(X0,Z0)\left(\hat{X}_0,\hat{Z}_0\right) = (X_0,Z_0)
  3. 利用网络预测(δx^,δz^)=S(X^0,Z^0,Θ)\left(\delta \hat{x}, \delta \hat{z}\right) = S\left(\hat{X}_0, \hat{Z}_0, \Theta\right)
  4. 然后赋值(X^1,Z^1)=(X^0,Z^0)+(δx^,δz^)\left(\hat{X}_1,\hat{Z}_1\right) = \left(\hat{X}_0,\hat{Z}_0\right) + \left(\delta \hat{x}, \delta \hat{z}\right)
  5. 如此进行完ss窗口,得到(X^,Z^)\left(\hat{X}, \hat{Z}\right)
  6. 计算L((X^0,Z^0),(X,Z))\mathcal{L}\left(\left(\hat{X}_0,\hat{Z}_0\right),(X,Z)\right),梯度,优化网络

这个步骤的思想类似于 motion matching 中的搜索算法,即根据当前的输入,寻找符合预期的一段动画序列。

一旦网络训练好后,我们可以将当前的(xt,zt)(x_t,z_t)喂给网络SS,得出(δx,δz)(\delta x, \delta z),然后加回去后得到下一帧的(xt+1,zt+1)(x_{t+1},z_{t+1}),之后再使用Decompressor就能得到下一帧的动画yt+1y_{t+1}

但现在还有一个问题:由于我们需要通过外部输入的x^\hat{x}来控制动画,那么就不可避免的需要用k-nn搜索算法找到最近的xx,这时候依旧需要运行时的特征数据库xx。我们在接下来的一节介绍,如何除去运行时的特征数据库xx

Projector

到目前位置,因为外部的特征xx的输入,我们无法避免地需要运行时特征xx的数据库。关键点在于我们需要找到和x^\hat{x}最近的xx,因此可以想象,如果我能通过x^\hat{x}计算出xx,那么问题就解决了。

论文介绍了一个名为Projector的方法,在训练中利用k-nn搜索算法来使得Projector的作用和搜索算法类似。具体如下

  1. 对特征数据集XX中的xx加入一定的噪声,得到x^\hat{x},模拟外部的特征输入,但仍在xx的附近,
  2. 利用搜索算法NearSearch(x^,X)\mathrm{NearSearch}(\hat{x},X)找出最近的特征的下标k∗k^*
  3. 使用网络计算出预测值(x~,z~)=Projector(x^,Θ)(\tilde{x},\tilde{z})=\mathrm{Projector}(\hat{x},\Theta)
  4. 计算L(x~,xk∗),L(z~,zk∗)\mathcal{L}(\tilde{x},x_{k^*}), \mathcal{L}(\tilde{z},z_{k^*})以及距离关系L(∥x^xk∗∥,∥x^x~∥)\mathcal{L}(\Vert\hat{x}x_{k^*}\Vert, \Vert\hat{x}\tilde{x}\Vert)
  5. 计算梯度、优化网络

训练过程,使得了Projector拥有直接计算输出邻居的能力。一旦网络训练完成,我们就能直接根据外部输入特征x^\hat{x},算出(x,z)(x,z)来,从而避免了临近算法需要运行时的特征数据库XX。

结果

比较

讨论

参考

参考文献

[1] Holden, D., Kanoun, O., Perepichka, M., and Popa, T. 2020. Learned motion matching. ACM Transactions on Graphics 39, 4, 53:53:1-53:53:12.

[2] https://zhuanlan.zhihu.com/p/50141261