Environment-aware Motion Matching
Universitat Politècnica de Catalunya
一句话总结
把简单的碰撞代理(2D 椭圆足迹)直接塞进 Motion Matching 的搜索循环里,让角色仅凭单人动捕库就能在拥挤、狭窄、含动态障碍的场景中,实时地同时调整全身姿态与根运动来自然避障,弥合了人群仿真里「轨迹规划」与「身体动画」长期割裂的问题。
研究背景
Motion Matching 是游戏工业中广泛使用的运动合成技术:它在一个庞大、无结构的动捕数据库中,实时搜索既贴合目标轨迹、又能与当前姿态平滑衔接的姿势序列。它的优势在于简单、迭代快、能保留动捕的高质量细节,因此在 AAA 游戏中长期沿用。
但一旦需要建模「与环境、与其他角色的交互」,标准 Motion Matching 就力不从心:要匹配的特征数量迅速膨胀,除了目标轨迹和当前姿态,还得考虑周围环境元素。常见做法要么是在场景中手工预设触发标记来播放特定动画片段(需要角色预对齐、灵活性差、人工成本高),要么用基于逆运动学的程序化动画(缺乏动捕的自然感)。
在人群仿真领域问题更明显:大量研究把身体动画当作独立于轨迹规划与避障的后处理层,导致身体运动与角色根运动不一致,产生脚滑等瑕疵。而真实的人类交互本质是双向的——身体姿态会影响轨迹选择,环境与潜在轨迹的约束反过来也会决定身体姿态(比如在狭窄走廊里选择侧身通过)。本文正是要在 Motion Matching 框架内恢复这种姿态与轨迹的双向耦合。
方法
整体框架
系统分两个阶段:预处理阶段从动捕库中为每个姿势抽取特征;实时阶段用一个环境感知控制器,结合用户输入、当前姿态、周围障碍进行搜索并播放动画。
flowchart TD
A[动画数据库 y_i] --> B[预处理: 特征抽取]
B --> C[姿态特征 z_v z_f]
B --> D[轨迹特征 z_p z_d]
B --> E[环境特征 z_e: 未来椭圆足迹]
C --> F[特征库 z_i]
D --> F
E --> F
G[用户输入 -> 目标轨迹 x] --> H[构造查询向量 z_q]
I[当前姿态 y] --> H
H --> J[两步搜索]
F --> J
K[障碍列表 o_j] --> L[障碍惩罚 log-barrier]
E --> L
L --> J
J --> M[最优索引 i*: 距离+惩罚最小]
M --> N[播放 y_i* 及后续姿势, 惯性化混合]
关键设计
-
查询特征与环境特征的分离:这是全文的核心抽象。查询特征 \(\boldsymbol{z_q}=(\boldsymbol{z_v}\,\boldsymbol{z_f}\,\boldsymbol{z_p}\,\boldsymbol{z_d})\in\mathbb{R}^{27}\) 会被拿去和一个目标查询向量做欧氏距离匹配,其中姿态特征是脚与髋关节的 3D 线速度 \(\boldsymbol{z_v}\in\mathbb{R}^9\) 和脚关节 3D 位置 \(\boldsymbol{z_f}\in\mathbb{R}^6\)(保证非顺序转移时姿态连续),轨迹特征是未来 20/40/60 帧的 2D 位置 \(\boldsymbol{z_p}\in\mathbb{R}^6\) 与朝向 \(\boldsymbol{z_d}\in\mathbb{R}^6\)(驱动角色跟随用户意图)。环境特征 \(\boldsymbol{z_e}\in\mathbb{R}^9\) 则不与任何目标向量直接比较,而是用来对场景做动态分析、计算惩罚因子。完整特征向量 \(\boldsymbol{z}=(\boldsymbol{z_q}\,\boldsymbol{z_e})\in\mathbb{R}^{36}\)。这种「匹配 vs 惩罚」的划分让新增/删除特征都很容易。
-
椭圆足迹作为碰撞代理:环境特征用 2D 椭圆近似身体在地面的投影足迹。相比圆盘(只需半径一个数、但无法区分侧身与正走),椭圆只多两个数(半长轴向量 + 半短轴长度)就能编码不同身体朝向与形状,从而区分侧身、转身等动作;相比凸包或完整 3D 表示又省内存省算力。椭圆的半长轴由相邻角色位置的位移方向确定,半短轴取垂直方向,轴长由所有关节在两轴上的最大投影距离决定,并对未来 20/40/60 帧各建一个椭圆。
-
对数障碍(log-barrier)惩罚:对每个未来椭圆与附近障碍算最小距离 \(d\),再用受 Incremental Potential Contact 启发的障碍函数施加惩罚:\(f(d)=-(t-d)^p\log\!\left(\frac{d}{t}\right)\)(当 \(d
-
双频率实时控制器:每 \(n=10\) 帧(60 Hz 应用)做一次搜索,收集附近障碍、构造查询向量、找到最优姿势,并计算从动画空间到当前角色空间的变换,搜索后用惯性化(inertialization)平滑混合;每帧则在动画库中前进一帧播放 \(\boldsymbol{y}^{(i^*+c+1)}\)。由于碰撞规避会让最终轨迹偏离输入轨迹,角色运动完全由动画库内嵌的根运动驱动,新目标轨迹总是从角色当前位置起算。
-
四个高层控制参数:在底层特征权重之上,提供直观旋钮。Responsiveness \(\omega_r\) 调整贴合目标轨迹的程度;Continuity \(\omega_c\) 控制姿态连续性权重;Evasion \(\omega_e\) 在靠近障碍时按 \(\lambda_d=\lambda_d^0\max\!\left(\omega_e,\frac{\lVert\boldsymbol{o}-\boldsymbol{p}\rVert}{t}\right)\) 降低方向权重,让身体朝向能自适应障碍;Anticipation \(\omega_a\) 按目标速度放大环境权重 \(\lambda_e=\max(\lambda_e^0\cdot\dot{v}\cdot\omega_a,\ \lambda_e^0)\),让高速移动时也能提前避障而不必减速。
-
可扩展的额外环境特征:框架不局限于 2D 椭圆。文中通过给每个椭圆再加最小/最大竖直分量两个数,实现高度特征,使角色能自动选择跳过栅栏或下蹲/趴下钻过低矮天花板。
性能优化
朴素实现里,环境特征依赖动态障碍,必须线性遍历数据库,随姿势数与障碍数线性增长,代价高昂。作者做了两类优化:
-
基础优化(不改变行为、始终启用):核心是早期拒绝——先算查询距离,只有低于当前最优才继续算惩罚;遍历障碍时一旦累计得分超过当前最优立即拒绝;先算第一个椭圆再算权重更低的后两个以加速拒绝;先处理简单障碍(圆盘)再处理复杂的(椭圆)。还预筛选轨迹附近的相关障碍(半径 \(r_{obs}+t+r_{ellipse}\),\(r_{ellipse}=0.9\) m),无障碍时退回 BVH 加速的纯查询搜索。配合面向数据的连续内存布局与 SIMD。
-
时间相干性优化:引入最小搜索步长(stride \(k=8\) 帧)与自适应阈值,预处理时挑出彼此至少 \(k\) 帧、特征差异 ≥5% 的代表性特征向量,形成稀疏数组,先粗搜代表向量、命中后再在其邻域细搜,形成两级层次搜索。粗搜时按当前代表向量与当前最优的差异 \(s=\lVert\boldsymbol{z}^{(i)}-\boldsymbol{z}^{(i^*)}\rVert\) 动态调步长:\(k'=\max\!\left(1,\ v\sqrt{\frac{s}{s^*}}\right)\),\(v\) 控制搜索激进程度。搜索还从上一帧最优索引附近约 1% 处起步,利用运动的周期性快速建立好的初始最优分以触发早期拒绝。
实验结果
系统在 Unity 中用面向数据编程与 Burst 编译器实现,在 i7-12700k 单线程 CPU 上运行搜索。作者在一个密集障碍的最坏情况环境里(角色跟随预定路径约 90 秒)做了性能与消融分析,指标包括:搜索耗时(ms,每 10 帧一次)、多样性(使用的不同姿势数)、轨迹误差(每帧偏离目标路径的米数)、碰撞时间(每次障碍相交的平均时长)。
| 配置 | 性能↓ (ms) | 多样性↑ | 误差↓ (m) | 碰撞时间↓ (s) |
|---|---|---|---|---|
| Motion Matching(基线) | 0.22 ±0.05 | 1997 | 0.09 ±0.04 | 0.88 ±0.64 |
| Linear Search(仅基础优化) | 9.50 ±4.16 | 3305 | 0.12 ±0.06 | 0.05 ±0.04 |
| One Obstacle | 5.83 ±0.12 | 2103 | 0.09 ±0.04 | 0.79 ±0.67 |
| Disk(圆盘代理) | 0.90 ±0.22 | 3838 | 0.29 ±0.17 | 0.37 ±0.29 |
| No Adaptive | 2.40 ±0.70 | 3729 | 0.13 ±0.07 | 0.08 ±0.08 |
| No Dissimilarity | 1.62 ±0.17 | 3608 | 0.13 ±0.08 | 0.12 ±0.10 |
| Start 0 | 1.02 ±0.20 | 3807 | 0.16 ±0.10 | 0.06 ±0.12 |
| Large \(v\) | 0.88 ±0.35 | 4389 | 0.37 ±0.34 | 0.12 ±0.10 |
| Ours(全部优化) | 0.80 ±0.16 | 4378 | 0.14 ±0.07 | 0.08 ±0.05 |
关键结论:
- 标准 Motion Matching 虽最快(0.22 ms,靠 BVH),但完全无视环境,约 30% 的时间都在穿模,且姿势多样性低(1997);本文完整方法碰撞时间占比降到约 2%,多样性反而最高(4378),仅以略高的轨迹误差(0.14 vs 0.09 m)为代价——这是优先避障的合理权衡。
- One Obstacle 实验(模拟早期拒绝理想工作)仍需 5.83 ms,说明必须「跳过」特征向量而非仅靠早期拒绝;时间相干性优化把线性搜索的 9.50 ms 降到 0.80 ms,约十倍加速,且无障碍时性能与基线持平(0.22 ms)。
- 圆盘代理误差最高(0.29 m),因为无法区分动作类型,两角色在窄道相遇时会卡死;椭圆则能自然找到侧身序列通过。
- 数据库可扩展性分析(10 万姿势为 100% 基准,测到 400% 约 41 万姿势)显示实际增长斜率远低于线性预期,得益于早期拒绝丢弃大量数据库、以及相关障碍数受角色周围环境限制而有界。整个动捕库(约 18.5 万姿势、约 50 分钟)未压缩仅约 50 MB。
定性上,系统能在渐窄至 0.35 m 的走廊里从奔跑过渡到侧身,能在锥形障碍锯齿走廊仅凭「持续向前」一个输入生成丰富的绕行/侧身动作,能应对移动方块与冲来的汽车(自动后退跳避),能让多角色在不同宽度走廊相向通过时按需转身,还能与规则式人群系统集成、在窄门口产生自然的等待行为。仅靠替换动捕库即可切换动画风格(持道具、抬箱过头、收窄手肘等),约两小时即可采集出一套全新可用的动画库。
亮点与局限
亮点:
- 把碰撞代理直接融入 Motion Matching 搜索这一想法既简单又工程友好,能无缝接入现有 Motion Matching 管线,只需单演员动捕、无需多角色采集或障碍标注;
- 「查询特征 vs 环境特征」的抽象干净利落,新增交互类型(如高度特征实现跳/蹲/趴)几乎不改算法;
- 恢复了姿态与轨迹的双向耦合,直接解决人群仿真中身体动画与根运动脱节的老问题,且能从最简单的输入生成复杂行为;
- 一整套优化把朴素线性搜索加速约十倍达到实时,\(v\) 参数还天然支持按角色调质量-性能权衡,适合人群的 LOD 策略;相比强化学习,无需训练、无灾难性遗忘/模式坍缩,扩展新运动模态或风格只需扩充数据库。
局限(作者自述):
- 当前碰撞代理只基于骨架、不含实际网格或蒙皮,若需更高几何精度需在预处理阶段投影网格顶点,或改用凸包/完整 3D 表示;
- 无法严格保证无碰撞,因为轨迹与环境特征的姿势是以离散间隔(约 333 ms)采样的,采样点之间可能出现短暂穿插;
- 对用户输入的响应性存在固有权衡:像快节奏游戏那样要求对根运动精细直接控制时,本方法会为迁就环境约束而偏离精确目标轨迹,只能靠 Responsiveness 控制与充分多样的动捕库来缓解。
延伸思考
- 「把物理仿真里的障碍势能函数(IPC 的 log-barrier)借来做数据驱动搜索的软约束」是一个很有迁移潜力的思路:它把连续优化里的碰撞处理经验,低成本地嫁接到了纯检索式的动画框架上,而无需真正做物理仿真。
- 环境特征作为「不参与匹配、只算惩罚」的旁路信号,本质上是给检索加了一个可插拔的软约束通道。这套抽象或许能推广到更多非几何约束,例如社交距离偏好、注视/朝向舒适度、地形代价等,只要能定义成关于候选姿势的惩罚即可。
- 方法目前保证「自然运动」却牺牲了「轨迹精确性」和「无碰撞硬保证」。对于需要硬约束的场景(如严格禁止穿模的机器人/XR 交互),如何在检索得到候选后再叠加一层轻量投影/求解来消除采样间隙的穿插,是值得探索的补强方向。
- 作者提到的 budget-based 搜索(到达帧时间上限即终止)与按距离分配搜索激进度,指向一个完整的动画 LOD 体系;结合把每 10 帧一次的搜索负载跨帧分摊,理论上能支撑相当大规模的人群,这对实时人群渲染是很实际的工程价值。