Introduction
本文介绍了一种结合Animation Layering技术和MoE的角色动画生成模型。做到具有一定编辑能力的Learning Generative Model.
一般基于Learning的方法在编辑、控制这两个方面都有很大的不足。个人总结的原因如下
- 使用End2End的模型,控制方法就被定死了,想要替换控制方法必须retrain整个模型,
- 控制方式变化后,网络的结构,特别是网络的输入格式也要响应调整,
- 动画师对动画的调整一般是建立在已有动画的基础上反复修改,而现有的基于Laerning的模型,没有这种修改方式的切入点。
这些原因导致在实际使用Learning模型时,体验是非常糟糕的。
作者从这个切入点入手,将模型分为两个部分控制模块和生成模块分别训练。受Condition VAE 这篇论文 启发,生成模块的训练使得其代表了motion的流形,从而对于不同的输入都能有一个pose的输出。控制模块则是计算出控制信号所对应的生成模块的输入。同时为了解决3. 问题,作者在控制层面使用reference motion作为控制方式,而这个reference motion的来源一般可分为两类:原始数据、动画师编辑后的数据。
此篇论文的主要贡献如下
- 一个基于learning的animation layering动画框架,用于合成类型丰富的运动
- 一个用户透明的控制接口,使得可以对运动进行编辑,同时不必重新训练动作生成网络
- 一组控制模块用于对合成角色动画,甚至是有接触的多名角色动画
- 一个评估框架,用于评估不同应用下武术动作制作过程
Overview
为了解决基于学习的 Motion Synthesis 难以编辑,特别是动画师无法直观的编辑人物的动作,论文作者提出了如上图的架构。图中分为三个模块,分别是用户可以编辑动作的Control Modules,以及动作生成模块 Motion Generator。由于Control Modules可以有多个控制的方式,而Motion Generator只接受一个输入,因此这里还提出了一个Control Interface模块,用于将Control Modules的输出整合成Motion Generator的输入,具体将Control Interface中在阐述。
个人认为,这里的Motion Generator可以看作是MoCap数据库的表示。而它的输入是一些key joints的预测信息,以及当前姿势信息。Generator 将这些信息投影到流形上得到下一帧动作的变化信息。而这个输入的形式又可以在业界中常用的技术中找到类似的数据格式,比如motion matching使用一段预测的motion去数据库中找到类似的motion,又比如关键帧技术的插值后生成也是一段动画,而这段动画刚好作为动画师调整动画的参考。那么如果我们将一个motion片段作为generator的input,那么我们就可以和现有技术结合起来用。而这时motion generator就可以看成是motion数据库的一个压缩。
Motion Generator
这篇文章的Motion Generator和MANN 所用的生成模型基本一致,它的gating network输入是key joints在未来一秒(7个采样点)的速度大小,输出blending因子。姿势预测网络的输入是key joints在过去到未来两秒内(13个采样点)的位置、速度、朝向、以及路径积分、角度累积 ,同时还有当前帧关节的位置、角度、速度 。key joints的信息 作为控制信息,而当前帧的关节信息 则作为状态信息,两者通过Motion Generator共同决定下一帧的姿势。
个人认为key joints的选取,关系到Motion Generator能否生成合理的姿势。文章中选取的是hip, legs, arms, spine, and head。这些key joints都比较均匀分布在身体上。这里可以有两个解释
- 根据 local motion phase这篇文章可以知道,使用多个局部信息去指导 gating network 能够让输出更加好,gating network可能会从key joints的窗口中学到Phase的概念,
- 第二种解释是,key joints 之间缺失的关节点信息,可以通过IK解出来(有解),而数据集所训练出来的Generator相当于是在constraint(数据集)下的solver。如果key joints选取的不好,那么缺失的关节的解空间就会太大,效果可能就不好。
Motion Generator的输出则有 ,分别表示下一帧的人物的姿势、手指的重构变换(用于角色间的接触修正)、接触标记(用于end effector的IK)、以及人物朝向变化。
对Motion Generator的训练思路比较简单,而且输入输出都是在数据集中都是匹配的。对于Motion Generator来说,最重要的一点就是它需要能够生成足够广的动作,这样我们才能在更小的空间内去制作编辑motion。论文作者使用了大约20小时的数据(~70 GB原始数据,增强后数据~300 GB)来训练,耗时快一个月。但是考虑到Motion Generator训练完后,不会再重新训练,那么这个耗时还算可接受的。只要数据量足够大,那么Motion Generator的可用程度就会更好。这个过程就可以看作是motion matching一类技术中对search这一步骤的预计算以及dataset的高度压缩(网络大小约46MB)。
泛化能力
上图表示了这个模型的泛化能力,其中红色的骨骼表示ground truth,蓝色部分为motion。可以看到,对于训练集中已有类型的动作,结果时很好的;而完全不在数据集中的动作则是不是很好,右图最为明显,它的手并没有很好的接触膝盖。
这也是learning based motion synthesis这一类技术的局限性,但也算是监督学习的固有特性。但这些问题可以通过后处理来解决,最常见的就是IK。
可能的做法是,在runtime维护一个contact表,用于IK。
Control Modules
控制模块,顾名思义就是用于控制动画生成的模块,它可以有多种形式的控制方法,只要最后的输出格式满足Control Interface的格式即可,也就是输出未来一段控制轨迹(key joints)。为了最大化编辑能力,框架支持多个Control Modules,也就是说你可以通过不同的方式编辑和控制。而实现这一能力的方法是:将不同模块的输出控制序列在Control Interface进行mix操作,论文中提供了三个mix的操作,分别是override, additive, blending layering,(这三个操作将在Control Interface中展开),同时可以分别对关节进行不同的编辑,然后在mix中将它们组合起来,类似组合技。
对于一个控制器来说,只要它的输出满足Control Interface的输入格式即可,如下
这里, 表示一个控制器,它会输出一个key joints的窗口信息,称为控制序列 (如Motion Generator中所述)
论文中介绍了用于拳击游戏的五种控制器,来说明框架在编辑方式上的可扩展性,同时也介绍了一些处理多角色间接触定位的方法。
- Idling:直接使用一小部分来自数据集中的数据
- Locomotion:使用local phase的neural network,类似Strake 在2020年的这篇文章中 的生成网络
- Attacking and Targeting:使用类似motion generator的网络
- Hit Reactions and Avoidance:使用了motion matching
- Clinching and Carrying:使用contact matrix,让优势方控制劣势方的motion生成,这里不再赘述。
这里只详细介绍 Attacking and Targeting
Attacking and Targeting
对于拳击游戏来说,“攻击”是一个必不可少的环节。这里会有两个问题,一是动画师需要对特定的招式进行编辑,二是如何让编辑后的招式能够“落到”敌人身上。
对于问题一来说是比较简单的,我们只需要一些攻击的动作片段,它可以来自动作捕捉,也可以里用关键帧技术生成,那么动画师就可以对这些片段进行编辑。
而问题二就会比较棘手,主要是敌人会移动,也就是玩家和敌人的距离在变化。为了解决攻击能够定位到敌人身上,论文作者使用名为Redirected Control技术来解决。这个技术的思想类似于NSM这篇文章中的双向策略 。作者利用含有两个人进行拳击对抗的数据集来训练一个control module,使得control module能够将motion reference的攻击位置修正到对手身上。
具体而言,作者在两名角色 之间定义了一个重定向空间 。 这个空间中的原点是 的根节点位置,向前方向是 ,向上向量则是垂直于地面。而这个control module的输出就是在这个重定向空间下的控制序列 ,它会在运行时被transform会角色 的空间。
至于这个targeting module的输入,则是角色 的控制序列、角色 的姿势信息 以及它的根节点的transform信息 。
这个targeting module的形状在文中只有粗略的介绍,大概是一个gating network 和 main network,前者使用一个控制序列的子集,应该和motion generator类似
Control Interface
Control Interface的主要作用就是将多个控制模块的输出控制序列合成为一个序列,然后将其输入到motion generator中。个人认为这是这篇论文最核心的地方,而前面所述的motion generator其实并无太大变化,对于control modules偏工程化,需要根据特定问题来设计控制器。
在Control Interface还有一个layer masks的技术,它可以选择性屏蔽掉某些关节的通道,以帮助动画师进行动作调整。同时通过关节通道的激活与否,可以很容易地在Control Interface这一阶段就生成一些新颖的组合动作(就是控制序列),最后再又motion generator生成自然的动作。
文中Control Interface主要有三种layering方式,如上图分别是
- Override Layering:选择不同部位的控制序列,作为整体。例如,分别选择来自不同动作的脚序列和手序列,组成一个新的序列。这个操作应该是通过masks来完成,
- Additive Layering:对控制序列的一些通道进行数值的操作,比如加上一定的偏移、缩放,或者直接将两段序列加起来,
- Blending:顾名思义,将两段控制序列进行过渡插值。
下图显示类override lyaering的具体形式。
下图表示additive layering的具体形式
训练模型
具体的网络参数在原文中有介绍,这里就不再赘述。对于数据部分,在这里提一下,正如本文开头所述,原始数据近70 GB,经过60Hz->30Hz的降采样、临近元素填充、镜像操作,使得实际被用于训练的数据近300 GB,训练这个motion generator可以将近一个月。之后再对不同控制模块进行分别训练(有些非神经网络的控制模块不用训练)。
这么看来,控制模块输出的控制序列,最好是能够投影到motion manifold上的。如果控制序列超脱出数据集本身能表达的范围,那么这个模型可能就不work。这里我有一个想法,能否对motion generator做增量式更新,当有一批不太相同的数据时,在原有的generator上继续训练?
总结
这篇论文还是相对工程性的,这里我把一些控制模块的细节去掉,因为在不同需求下,控制模块会有所变化。而将重点放在control interface上,对于layering、mask channel这些方法,可能在业界中都是非常常见的方法,然而将其与基于学习的模型结合并且得到好的结果,算是比较贴近业界的工作。
通过reference motion来控制motion generator生成这个方法,可以说是最具有编辑扩展能力的方法了。个人感觉再极端一点就退回到传统的方法上,直接编辑出的reference motion就是motion。所以在另外一个视角来看,这篇文章也有点像motion database的压缩。