Environmental and Motion Matched Interactions

《Environmental and Motion Matched Interactions; ‘Madden’, ‘FIFA’ and Beyond》演讲

《Environmental and Motion Matched Interactions; ‘Madden’, ‘FIFA’ and Beyond》是一个实现多人物,人物和场景间交互的技术(本文简称为 EMMI ),主要为了开发《Madden-NFL》来实现橄榄球运动中众多的身体接触,该技术是EA在GDC2017上分享的 N-teract 技术和 Motion Matching 技术的结合。要梳理 EMMI 的思路就要先分别了解 N-teract和 Motion Matching。

N-teract

EA Presents N-teract: Next Generation Multi-Character Interactions

这个演讲首先展示了EA的 N-teract 工具和工作流,类似于插件的形式,之后讲解了实现原理和一些挑战和解决方案。我们直接从实现原理开始梳理。

基础定义

在讲解具体原理之前,需要先了解几个定义:

  1. 多人动画;多人动画是一种同步动画,允许多个轨道分别控制一个角色来播放对应的动画。在N-teract系统中,一个场景(例如Tackle)可以存在多个多人动画,N-teract会从中挑选合适的多人动画播放。
  2. Slot(插槽);要实现多个角色顺利播放多人动画,那就必须要指定每个角色播放多人动画中的哪个角色动画,这就需要插槽来指定。
  3. Slots;来定义具体的一个多人动画应该如何分配插槽,这是一个自动的过程,但是需要针对不同的动画设置不同的分配规则,例如对于Tackle(橄榄球中常见的拦截动作)动画使用如下方式指定Slot:

实现原理

  1. 各个角色会根据游戏逻辑发出请求,请求开始播放多人交互动画;
  2. 系统会收集发出请求的角色,并为他们分配对应的插槽,这里具体分配哪一个插槽就需要根据不同的场景分别设定;
  3. 根据分配好的插槽去多人动画数据库中挑选合适的动画进行播放;
  4. 如果找到了合适的多人动画,就播放并且做一些对齐之类的后处理;

分配插槽和匹配多人动画

从上述的流程中可以看出N-teract中的核心步骤是分配插槽从数据库选择多人动画,这里就很像MotionMatching中选择关注的姿势信息和轨迹然后匹配下一帧姿势,这两步同样也是MM中核心步骤,决定MM实现质量。

分配插槽确实需要针对每一种不同的场景设计对应的分配规则,但是其实没有想象的那样需要设计很多分配规则,因为一个场景中可以有多种不同的多人动画。比如Tackle就是一个场景,将各种不同的tackle动画放进这个场景就行了,也就是说在实际操作中,我们只需要将动画数据分类,为每种类型的动画设计一个分配规则即可,这种思路就有点类似与状态机分层。

可以对匹配算法做一些优化,演讲中分为了两部分:

  1. 离线阶段:根据已有的动画数据构建一个动画表,其中标记哪些方向需要我们关注,在实时中,我们只需要关注对应的方向即可,减少开销,如下图,在runtime中只关注3,5,6,8四个方向即可。
  2. Runtime:仅检测离线阶段关注的插槽(方向),如果检测到其他角色就将该角色分配到对应插槽,并在数据库中寻找符合条件的动画。

整个过程如下:

左图检测到了1号和3号,但是数据库中没有1号和3号同时存在的多人动画,故没有播放tackle动画,继续移动到了右图所示,检测到了1号和2号,数据库中有1号和2号同时存在的动画就播放。

Late Join和Invites

和MotionMatching一样,N-teract显然也是动画数据越多效果越好,这就造成了Coverage问题,动画数据不可能无限多,那就要尽可能的重用已有的动画,这个思路在动画领域也比较常见了。

文中主要提到两个重用方法:

  1. Late Join:允许角色在播放动画的中途加入,其他角色如果恰好在正在播放的动画的路径上,就直接加入当前动画;

    Late Join的实现基于对动画数据的预处理,将多人动画分为好几段,如下图,每隔四帧标记一个入口并计算出对应入口的进入条件。
  2. Invites:字面意思邀请角色加入播放的动画,应用于角色不在路线上时,让角色移动到路线上,再用Late Join

被动交互

被动交互是指在多人动画中,其中一个角色在接触之前不播放该多人动画,比如上图中间的角色没有对冲过来的角色进行反应,直到被打击之后才播放受击动画。

其实我们在UE中做的一般都是被动交互,因为我们没有可以直接播放多人动画的动画状态机,只能在攻击之后让受击方播放受击动画;EA的引擎可以直接播放多人动画,那么猜测实现方式就是先禁用受击方的插槽,当检测到受击时启动插槽。

环境交互

环境交互其实可以理解成和一个不动的角色进行的多人动画,这里还是N-teract的思路,比如对于翻墙动画,要把手扶的点摆在场景中,之后角色进行N-teract的步骤将这个点当作一个角色,在动画库中找到可以播放的动画。

这种方式确实可以实现很好的动画效果,对于一些翻墙之类的(不需要很精细的交互)可以通过一些检测自动找到交互点。

在Madden中,这种环境交互技术主要用于实现下图效果:

所以可以用接口实现,只要有交互接口的对象都能触发N-teract系统:

动态物体交互

对于动态物体,其实就是提前计算动态物体的轨迹,设置几个交互点:

Environmental and Motion Matched Interactions

Rally Motion Matching

演讲中首先提到了最容易想到的Motion Matching的应用,利用MM的轨迹预测,让其他角色移动到可以触发N-teract的位置,也使用MM驱动来减少需要做的对齐或者扭曲。这种方法和Invites类似,不同点可能在于Invites是针对多人的,当一个角色开始交互动画之后将其他角色邀请来参加这个已经启动的交互动画,RallyMM则是在启动交互动画之前发生的。感觉没什么用,只是减少了Warping和Alignment。

多人动作匹配(MultiChar MotionMatching)

多人动作匹配是将传统动作匹配关注的单个骨架信息扩展为多个骨架,用多个角色的姿势和轨迹信息来匹配一个多人动画。这个理论上是确实是可行的,不过这是基于多人动画数据和EA的能够播放多人动画的状态机才能实现的,想要在UE中复现可能较难。

N-teract与MM的结合

这两个系统本身很相似,核心都是数据驱动的匹配算法,但是他们的匹配算法差异过大(N-teract依靠的分配Slot强制匹配,MM是计算Cost没那么强制),不能直接合并数据库。最终选择保留N-teract的框架,先进行N-teract,再进行MM:

这样的思路就要依靠之前提到的实现Late-Join的方法,将完整的多人动画设置很多入口(其实就是分成很多份),从而实现中途加入。进行改进之后允许在每一段中进行MM:

结合了MM之后效果如下,左图没有结合MM,在最后时刻由于受击者转身不匹配原本的动画,直接切换到了另一个动画;右图结合了MM,不匹配之后也切换了N-teract状态但是用到了MM,考虑了当前姿势,选择了合理的出拳动画(切换到站在背后的N-teract状态,开始MM选择继续出右拳)。

但是还是切换了动画片段,虽然MM了没有直接播放切换的片段,但是还是能感受到切换时会卡顿,还是希望不切换多人动画片段。这里感觉作者没细讲怎么做的(也可能我单纯没看懂

问题和解决方案

  1. EMMI的问题之一是交互状态切换频繁,这是因为交互状态的匹配是强制匹配,很可能在交互过程中稍微不满足条件就切换了状态,所以需要在进入状态后加大容忍,让状态更难切换:
  2. RootMotiom造成控制感较弱,这里解决方式就是一定程度放弃RootMotion,完全由玩家控制;
  3. 性能优化,实现Late-Join时设置了很多入口,其实不用设置那么多,可以进行预处理,减少入口数量;比如一个多人动画可能其中的角色相对位置始终没有改变,那么就只需要一个入口即可,也就是只在相对位置发生变化从而会影响交互状态匹配时,才设置入口。

总结

EMMI看起来是用MM对N-teract的一种优化,并没有对MM算法本身进行过多的调整,相当于部分使用MM,类似先使用状态机确定大状态,在大状态中交给MM驱动。


Environmental and Motion Matched Interactions
https://kenny-hoho.github.io/2023/12/14/Environmental and Motion Matched Interactions/
作者
Kenny-hoho
发布于
2023年12月14日
许可协议