Facial Animation
🥴

Facial Animation

💡
人的表情是怎么来的?

Face is Driven by Complex Muscle System

Facial Muscles
Facial Muscles
  • 43 Muscles
  • Variant shape, strength and movement
  • Work together to make expressions
横向的、纵向的、放缩的肌肉能够形成人的表情。
其实人类的 Facial 在进化学上是有很多讨论的,整个动物界好像只有人类进化出如此丰富如此细腻的表现系统,甚至我们认为人类社会之所以能进化这种高级文明,就是因为表情帮助了我们在族群内部的沟通。包括为什么要养宠物,是因为大部分动物是读不懂人类的表情的,而我们的狗跟着人类上万年,它是少有的几个能够看得懂人类的表情的物种。

High Precision Requirements

Minor change makes difference:
  • Voluntary / Forced
  • Natural / Intentional
  • Sometimes shows quite opposite expressions
'In Love' Stare to 'Hate You' Stare
'In Love' Stare to 'Hate You' Stare
表情为什么他这么难?举个例子,上图是一个演员的表演,她从喜欢到嫌弃,几乎没有明显地动她的五官。
这种微表情就是特别难做的一个东西。过去早年我们在做计算机的人物角色的时候,实际上只能做简单的角色,就是开口张口说话、大笑、哭,都非常浮夸。但是现代的游戏引擎,它就越做越细腻,越做越真实。这其实就在追求这样的一种真实度,因为它的精度要求是非常非常高的。
💡
怎么去表达表情?

Facial Action Coding System

Facial Action Coding System (FACS) is a system to taxonomize human facial movements by their appearance on the face.
notion image
Part of 46 basic movements are named action units(AU)
Part of 46 basic movements are named action units(AU)
很久以前,电影行业就引入了 Facial Action Coding System (FACS) 系统。它把人类常用的表情归纳成了 46 种 Action Unit(表情单元,AU)。然后它认为表情可以用 46 种表情单元表达出来。
💡
电影行业的老哥有非常好的理工科的基础,通过用这种很工科的方法去把这么文科的事情给定量化了。就像前面讲 post process 的时候,电影行业就提出 Filmic Toon Mapping。 他们对真实度的要求是远远高于我们的游戏行业,特别是我们会发现最近几年奥斯卡电影的虚拟角色的水平是越来越高,所以他们是走在这个行业真正的前沿。

Action Units Combination

An expression can be considered as a combination of some of the basic movements
notion image
这些 AU 可以用某种方式进行组合。举个例子,比如这个男人的眉毛皱起来是一个 AU,眼睛睁大又是一个 AU。这就可以表达一个动作,眉毛放下来,眼睛睁大。
💡
专业的演员,实际上他们的表情肌是要经过专门的训练的。
💡
表情动画单元实际上可以像函数一样,可以自由地组合出各种各样的表情。

28 Core Action Units

  • Apple Inc. extracted the 28 core AUs
  • 23 Symmetric AUs are divided into two basic actions
  • Basic actions set varies according to the animation production requirements
有这样的概念之后,实际上我们很多东西可以做了。
Apple 将前面的 46个 AU 总结成了实用的 28 个。这 28 个最核心的 AU 其中发现有 23 个是对称的,比如说左眼的闭和开、右眼皮的闭合开,这两个只要存一个就可以了。因为人体的大量的表现肌都是对称的,所以在行业里面,一般用 28 个 Core AU 就好了。
notion image

Key Pose Blending

A set of key poses (a variation on per-vertex animation)
notion image
 
上一节课讲过一个很重要的动画,叫 vertex animation 顶点动画。顶点动画可以每个顶点存一个动画。那 28 个 AU 可以每个 AU 存一个动画。比如上图的嘴巴歪一下,眼睛睁开,表情两个叠到一起,就能形成一个想要的表情。看上去非常的简单。
但是这种简单的线性叠加会产生一个小问题,如果存的是每个顶点在这个表情下的位置,那动画的叠加就是一个 LERP 产生的结果,而这可能不是我们想要的。

Problems of Simple Blending

notion image
第一个动画是这个人张大了嘴,眼睛睁的很大,第二个想混合的表情是闭上眼睛。但是闭上眼睛张大嘴,这两个表情合到一起做线性加法时,得到的角色是嘴巴张得没那么开,眼睛是半闭着的结果。这就是因为线性插值,把眼睛张开和闭眼睛做了插值。

FACS In Morph Target Animation

Create AU key poses only store vertexes different from the neutral pose (Additive Blending)
notion image
因为这些 AU 都是在脸上的局部做的处理。我们想要的结果是嘴巴的区域要用张嘴的动画,但是眼睛闭眼的动画。
因此存一个 AU 的时候,是存这个表情下,对应区域相对于它的 neutual face 中性表情下的顶点的 offset,这样就可以自由地把这些动画合到一起。
这个方法就是 Morph Target Animation

Morph Target Animation

notion image
Key Poses
Key Poses
大部分的游戏表情动画都是用这个技术去做的。
骨骼动画也可以做,但骨骼动画有的时候表达一个简单的表情会比较困难。比如可以表达眼皮张开闭合,但是表达嘴巴往前嘟嘴收嘴这种动作,表达起来就比较麻烦,也不自然,所以一些细腻的动画表现主要用的就是 Morph Target Animation。
💡
在游戏引擎实战中,不会完全只用 Morph Target Animation。实际上在现代的游戏里面的,还是会用骨骼做大量动画表情的动画。
Complex Facial Skeleton
Complex Facial Skeleton
Complex Facial Skeleton
Complex Facial Skeleton
 
像是角色的眼球,眼睛很灵动,用 Morph Target Animation 就很难做。比较大的动作像是嘴巴张开,也会常用到骨骼。
更有用的是在捏脸。给一张标准的脸,可以给玩家捏出想要的脸。其实这里面既有 Morph 的功劳,又有骨骼的功劳,但这个模型就会比较复杂了。
其实它不是一个引擎技术的问题,而是艺术家同学有多强。所以在一个 3A 级游戏里面,特别是韩式游戏里面,光一个捏脸系统可能就是一个团队做三年以上的结果。因此我们经常说捏脸本身就是一个游戏。捏脸系统中,要花大量的时间去精细地调表皮下的骨骼,同时要做大量 Morph Target Animation 让角色有各种各样的外形和变化,而且动起来各种表情看上去很自然。
💡
在引擎中表达表情,其实不只是用几何表达。
⚠️
虽然 Morph Target Animation 算法非常简单,但是它的数据存储量很大。它的计算量,随着表面上的细节越来越多,它也会越来越复杂。

UV Texture Facial Animation

Using a series of texture maps applied to a simple head shape
Animal Crossing: New Horizons
Animal Crossing: New Horizons
The Legend of Zelda: Breath of the Wild
The Legend of Zelda: Breath of the Wild
其实做一个 2D 的动画 Texture 也能表达角色的各种各样的动画。
前面提过 Live2D 的方法。其实如果把 Live2D 变成一张 Texture,那么把这个 Texture apply 当几何上就能表现各种活灵活现的角色的效果了。这对于很多的卡通化渲染的游戏来讲,它比 Morph Target Animation 和骨骼动画更实用、效率更高。

Muscle Model Animation

In the reliance on a physical basis, more precise, but more sophisticated
  • Muscle controls most part of the face
  • 3 Layers: Skin Layer, Muscle Layer, Bone Layer
  • The point of insertion will move an amount determined by the muscle
The model used for the skin will dictate how the area around the insertion point muscle reacts
Muscle Spreads Over The Face
Muscle Spreads Over The Face
Cross Section of The Muscle Model
Cross Section of The Muscle Model
最后的这个方法,就是纯属于科研性质,现在还有人在研究,非常的前沿。
这个方法真正地把 43 块肌肉动起来来表达一个人。
要非常细腻地定义骨骼上面的肌肉的牵动皮肤的运动。这种方法现在有一些初步的结果,目前在游戏引擎中比较少,更多是在影视行业里面用。但是它的结果确实非常的漂亮。也许随着未来计算机的算力足够强,就不需要再用这么复杂的 Morph Target Animation 了,上文 Morph Target Animation 一节也提到其缺点。因此这个方法也许未来能给我们带来更高精度的角色表达。

Metahuman

notion image
Unreal 的 Metahuman 老师认为这是目前整个行业的这个天花板,这个角色很多细腻的微表情的表达,包括眼珠、角色的自然态和真实态。
如果要做得这么好的话,它可能不仅仅是考虑怎么用 Morph Target Animation 和骨骼动画来表达了,其实还包括考虑怎么去 capture 采集到这个东西。也就是说它不像我们的动作,可以在身上绑几个绑点就可以采集。它实际上现在面部表情的采集是一个相机对着你拍一帧帧的照片,要考虑怎么从一帧帧的照片中 decompose 解构出表情。这其实是非常挑战的一个技术,但是很感谢我们这个行业,这个技术目前也有一些很好的基础,有些成熟,但是做到像这个质量,还是有很多的挑战。