前言

表情动画方面在ilm、weta digital等为首的特效公司目前都已经在使用肌肉了,这里说的表情肌肉不是ziva dynamics那种计算果冻效果的,例如在用力摇头的时候,口轮轧肌会抖动,这类高频motion就是果冻效果,利用有限元分析可以对这类弹性力学现象仿真,ziva的肌肉是基于这类理论实现的。表情动画的肌肉方案有两个路线,根据人脸从内到外建立肌肉模型,解决肌肉运动后,再推算出皮肤的形变,最终产生表情,理论上,只要肌肉的运动足够接近真实,这种做法的效果是最好的,在2016年研究过这个方向,有篇论文做了一些初步研究:run.usc.edu/cs520-s12/f。当时判断这个方向太理想化,难度非常大,就放弃继续深入了,而且目前看起来学术界在这个方向上也没有继续发展。第二个路线,也就是我们目前采用的路线,ilm跟weta digital也用了同样的技术路线,在alita、avenger、the planet of apes里面大放异彩,效果甩blendshape动画好几个维度,我简单介绍一下思路,人的同一个表情,在每次出现时幅度跟形状都是不同的,我们只要保证计算出来的表情跟实际误差最够小,就可以接近演员的表情了,怎么做到这一点呢?

传统绑定的问题

我们先看一下Blendshape绑定的问题,bs绑定有个巨大缺陷,就是我们假设了人的每个表情只是幅度的不同,形状都是一样的。但实际情况是,同一个表情,每次做的时候形状也是不同的,如果微分到人脸上的每个点,这个解基本上是无穷的。试图解决这个问题,只能把bs数量放大,但实际上到了几百个bs后人工绑定的要求就非常高了,1k以上的绑定需要手艺很好的老师傅才能完成,而且国内这种人非常少,国外的绑定成本高得离谱,而且最终问题还是解决不了,因为bs动画无论加到多少,它都是一维的。

粗暴一点,拿iphonex举个例子,51个bs,bs动画的数学原理就是对这些表情求和,最终得出表情,每次只是变化幅度不一样,形状完全一样,线性组合嘛,问题就在这个线性,每次变化都是一维的,就算加到10w个bs,它也是一维的。给出公式:

F(w)是最终表情,Base是自然pose,对其余表情求和,w就是权重,很显然这个过程是线性的。第一代表情捕捉技术就是对w求值,这个公式的逆过程,因此像facegood P1、faceware、dynamixyz这类产品非常依赖于绑定,绑定做不好,算出来的表情是没法看的。上面指出了bs绑定的理论缺陷,但也并非bs完全没用,我们的解决方案是这样的,在bs绑定的基础上计算了一次肌肉,保留bs主要是为了方便动画师对动画二次加工,保留bs绑定,看一下我们是怎么解决这个缺陷的。

首先第一步是bs权重的计算,bs绑定,w的计算就是表情捕捉要计算的结果,计算公式就是求和公式的逆过程,把上面换个形式,如下图:

faceware跟dynamixyz在算这个权重w的时候也是有很大缺陷的,给到一个视频后,需要用户k几个关键pose,然后跟当前帧做线性回归,当用户k的pose超过个位数后,回归的结果会变得混沌,精度变得非常差,这就是为什么当台词多的时候,尤其是对白超过30秒后,效果非常差,另外还有个致命弱点,因为是根据pose来推算权重w,就导致人脸的局部肌肉的运动是算不出来的,例如苹果肌,一般只能由嘴部表情联动,这种效果是不精确的,容易导致僵尸脸。

FACEGOOD 方案

我们的做法是不用用户k关键pose,我们根据当前表情,计算出所有bs的权重,最终得出当前表情的粗解,如上图公式。为什么叫粗解,因此此时的结果是无法完全匹配到演员的,原因我们开始已经解释过了,人的表情,每次的形状都是有差异的,bs只记录的某个时刻的外观。我们要做的就是在bs权重计算完之后再做一次修正,如下图:

此时计算完bs权重后,可以看到内嘴唇是没有完全匹配到演员的,我们在这个基础上计算肌肉,这一步已经完全脱离了bs的一维线性空间变成顶点动画了。

肌肉计算完后,可以看到嘴唇已经完全匹配了,这时bs动画变为顶点动画,这是全自由度解,完美匹配真人的表情。尤其是细微的、高频的微表情,例如嘴唇的粘连、眼轮匝肌四周微小高频的motion等。第一步bs权重的粗算得到了八九不离十的大表情,最终算完肌肉后,演员的“神情”就被计算出来了,尤其是眼睛中的情绪,都可以还原,下图为完整算法。

以下这种级别的匹配度,可以说100%匹配,bs绑定就算细分到1k也是做不到的。因为人的维表情变化是无穷的,表演的灵魂恰恰都在这些微表情中。