Blendshape学习笔记
Blendshape(Morph Target动画)
Blendshapes泛指3D定点动画的制作方式 (Maya里面称之为 blend shapes ,而3DS Max里称之为morph targets) ,在3D动画中用的比较多,尤其是人脸动画的制作,通过blendshape来驱动角色的面部表情。
用在脸部动画制作时,blendshape可以被称之为脸部特征,表情基准,定位符等等。这里要引入一个FACS的概念,可以简单理解为将脸部进行合理化的分区标准。
“表情这个东西看起来是一个无限多可能的东西,怎么能够计算expression呢?
这就带来了Blendshapes——一组组成整体表情的基准(数量可以有十几个、50个、100+、 200+,越多就越细腻)。我们可以使用这一组基准通过线性组合来计算出整体的expression,用公式来说就是 ,其中e是expression,B是一组表情基准,d是对应的系数(在这一组里面的权重),b是neutral。”
BlendShape系数介绍
在ARKit中,对表情特征位置定义了52组运动blendshape系数(
https://developer.apple.com/documentation/arkit/arfaceanchor/blendshapelocation ),每个blendshape系数代表一种表情定位符,表情定位符定义了特定表情属性,如mouthSmileLeft、mouthSmileRight等,与其对应的blendshape系数则表示表情运动范围。这52组blendshape系数极其描述如下表所示。
每一个blendshape系数的取值范围为0~1的浮点数。以jawOpen为例,当认为用户的嘴巴完全闭紧时,返回的jawOpen系数为0。当认为用户的嘴巴张开至最大时,返回的jawOpen系数为1。
在用户完全闭嘴与嘴张到最大之间的过渡状态,jawOpen会根据用户嘴张大的幅度返回一个0~1的插值。
脸部动捕的使用
ARKit 脸部与Vive脸部blendshape基准对比
| ARKit(52) | Extra | VIVE(52) | Extra | |
|---|---|---|---|---|
| Brow | 5 | 0 | ||
| Eye | 13 | 14 | Eye Frown + 1 | |
| Cheek | 3 | 3 | ||
| Nose | 2 | 0 | ||
| Jaw | 4 | 4 | ||
| Mouth | 24 | 20 | O shape - 1 | |
| Tongue | 1 | Tongue + 7 | 11 | |
| Sum | 52 | 59 | 52 | 52 |
ARKit的52个Blendshape表情基准组
可以看ARKit Face Blendshapes的照片和3D模型示例:https://arkit-face-blendshapes.com/
| CC3 | ARKit Name 表情基准/定位符 | ARKit Picture | CC3 Picture |
|---|---|---|---|
| A01 | browInnerUp | ![]() |
![]() |
| A02 | browDownLeft | ![]() |
![]() |
| A03 | browDownRight | ![]() |
![]() |
| A04 | browOuterUpLeft | ![]() |
![]() |
| A05 | browOuterUpRight | ![]() |
![]() |
| A06 | eyeLookUpLeft | ![]() |
![]() |
| A07 | eyeLookUpRight | ![]() |
![]() |
| A08 | eyeLookDownLeft | ![]() |
![]() |
| A09 | eyeLookDownRight | ![]() |
![]() |
| A10 | eyeLookOutLeft | ![]() |
![]() |
| A11 | eyeLookInLeft | ![]() |
![]() |
| A12 | eyeLookInRight | ![]() |
![]() |
| A13 | eyeLookOutRight | ![]() |
![]() |
| A14 | eyeBlinkLeft | ![]() |
![]() |
| A15 | eyeBlinkRight | ![]() |
![]() |
| A16 | eyeSquintLeft | ![]() |
![]() |
| A17 | eyeSquintRight | ![]() |
![]() |
| A18 | eyeWideLeft | ![]() |
![]() |
| A19 | eyeWideRight | ![]() |
![]() |
| A20 | cheekPuff | ![]() |
![]() |
| A21 | cheekSquintLeft | ![]() |
![]() |
| A22 | cheekSquintRight | ![]() |
![]() |
| A23 | noseSneerLeft | ![]() |
![]() |
| A24 | noseSneerRight | ![]() |
![]() |
| A25 | jawOpen | ![]() |
![]() |
| A26 | jawForward | ![]() |
![]() |
| A27 | jawLeft | ![]() |
![]() |
| A28 | jawRight | ![]() |
![]() |
| A29 | mouthFunnel | ![]() |
![]() |
| A30 | mouthPucker | ![]() |
![]() |
| A31 | mouthLeft | ![]() |
![]() |
| A32 | mouthRight | ![]() |
![]() |
| A33 | mouthRollUpper | ![]() |
![]() |
| A34 | mouthRollLower | ![]() |
![]() |
| A35 | mouthShrugUpper | ![]() |
![]() |
| A36 | mouthShrugLower | ![]() |
![]() |
| A37 | mouthClose | ![]() |
![]() |
| A38 | mouthSmileLeft | ![]() |
![]() |
| A39 | mouthSmileRight | ![]() |
![]() |
| A40 | mouthFrownLeft | ![]() |
![]() |
| A41 | mouthFrownRight | ![]() |
![]() |
| A42 | mouthDimpleLeft | ![]() |
![]() |
| A43 | mouthDimpleRight | ![]() |
![]() |
| A44 | mouthUpperUpLeft | ![]() |
![]() |
| A45 | mouthUpperUpRight | ![]() |
![]() |
| A46 | mouthLowerDownLeft | ![]() |
![]() |
| A47 | mouthLowerDownRight | ![]() |
![]() |
| A48 | mouthPressLeft | ![]() |
![]() |
| A49 | mouthPressRight | ![]() |
![]() |
| A50 | mouthStretchLeft | ![]() |
![]() |
| A51 | mouthStretchRight | ![]() |
![]() |
| A52 | tongueOut | ![]() |
- CC3 额外的舌头Blendshape(with open month):
| T01 | Tongue_Up | ![]() |
|
|---|---|---|---|
| T02 | Tongue_Down | ![]() |
|
| T03 | Tongue_Left | ![]() |
|
| T04 | Tongue_Right | ![]() |
|
| T05 | Tongue_Roll | ![]() |
|
| T06 | Tongue_Tip_Up | ![]() |
|
| T07 | Tongue_Tip_Down | ![]() |
Vive面部的表情基准组
Vive这一套脸部追踪也是52个blendshapes,但是和苹果的基准有很大区别。
- 区别一:舌头
苹果其实是52+7,因为舌头在52个里只有一个伸舌头的blendshape,但vive其实是42 + 10,整体来讲Vive表情记住能tracking到的表情细节还是更少一些。
- 区别二:眉毛
ARKit的52个blendshapes,是根据硬件分区一对一tracking的,然而Vive眉毛不分是没有单独另设blendshapes,而是与眼睛的动作blended在一起作为一个blendshape的,并不是精准的一对一分区tracking。
我下面编号的排序是按照VIVE Eye and Facial Tracking SDK unity 里inspector里的顺序,方便我加表情。
这里是整理的用ARKit制作Vive基准的对应编号:
https://docs.google.com/spreadsheets/d/1kWXnqtiVbXRb1FrD5NLlxxuxbYmS0Z6YBLuIE1WwqD4/edit?usp=sharing
- Eye Blendshapes (14 = 12 + 2)
| Vive编号 | Vive表情基准 | Vive Picture | Create by CC3 blendshapes |
|---|---|---|---|
| V01 | Eye_Left_Blink | ![]() |
![]() |
| V02 | Eye_Left_Wide | ![]() |
![]() |
| V03 | Eye_Left_Right | ![]() |
![]() |
| V04 | Eye_Left_Left | ![]() |
![]() |
| V05 | Eye_Left_Up | ![]() |
![]() |
| V06 | Eye_Left_Down | ![]() |
![]() |
| V07 | Eye_Right_Blink | ![]() |
|
| V08 | Eye_Right_Wide | ![]() |
|
| V09 | Eye_Right_Right | ![]() |
|
| V10 | Eye_Right_Left | ![]() |
|
| V11 | Eye_Right_Up | ![]() |
|
| V12 | Eye_Right_Down | ![]() |
|
| V13 | Eye_Left_squeeze: The blendShape close eye tightly when Eye_Left_Blink value is 100. | ![]() |
![]() |
| V14 | Eye_Right_squeeze | ![]() |
- Lip Blendshapes (38 = 37 + 1)
| Vive编号 | Vive表情基准 | Vive Picture | Create by CC3 blendshapes |
|---|---|---|---|
| V15 | Jaw_Right | ![]() |
![]() |
| V16 | Jaw_Left | ![]() |
![]() |
| V17 | Jaw_Forward | ![]() |
![]() |
| V18 | Jaw_Open | ![]() |
![]() |
| V19 | Mouth_Ape_Shape | ![]() |
![]() |
| V20 | Mouth_Upper_Right | ![]() |
![]() |
| V21 | Mouth_Upper_Left | ![]() |
![]() |
| V22 | Mouth_Lower_Right | ![]() |
![]() |
| V23 | Mouth_Lower_Left | ![]() |
![]() |
| V24 | *Mouth_Upper_Overturn | ![]() |
![]() |
| V25 | *Mouth_Lower_Overturn | ![]() |
![]() |
| V26 | Mouth_Pout | ![]() |
![]() |
| V27 | Mouth_Smile_Right | ![]() |
![]() |
| V28 | Mouth_Smile_Left | ![]() |
![]() |
| V29 | Mouth_Sad_Right | ![]() |
![]() |
| V30 | Mouth_Sad_Left | ![]() |
![]() |
| V31 | Cheek_Puff_Right | ![]() |
![]() |
| V32 | Cheek_Puff_Left | ![]() |
![]() |
| V33 | Cheek_Suck | ![]() |
![]() |
| V34 | Mouth_Upper_UpRight | ![]() |
![]() |
| V35 | MouthUpper UpLeft | ![]() |
![]() |
| V36 | Mouth_Lower_DownRight | ![]() |
![]() |
| V37 | Mouth_Lower_DownLeft | ![]() |
![]() |
| V38 | Mouth_Upper_Inside | ![]() |
![]() |
| V39 | Mouth_Lower_Inside | ![]() |
![]() |
| V40 | Mouth_Lower_Overlay | ![]() |
![]() |
| V41 | Tongue_LongStep1 | ![]() |
![]() |
| V42 | Tongue_LongStep2 | ![]() |
![]() |
| V43 | *Tongue_Down | ![]() |
![]() |
| V44 | *Tongue_Up | ![]() |
![]() |
| V45 | *Tongue_Right | ![]() |
![]() |
| V46 | *Tongue_Left | ![]() |
![]() |
| V47 | *Tongue_Roll | ![]() |
![]() |
| V48 | *Tongue_UpLeft_Morph | ![]() |
|
| V49 | *Tongue_UpRight_Morph | ![]() |
|
| V50 | *Tongue_DownLeft_Morph | ![]() |
|
| V51 | *Tongue_DownRight_Morph | ![]() |
|
| V52 | *O-shaped mouth | ![]() |
![]() |
MediaPipe提取BlendShape
MediaPipe Face Landmarker解决方案最初于5月的Google I/O 2023发布。它可以检测面部landmark并输出blendshape score,以渲染与用户匹配的3D面部模型。通过MediaPipe Face Landmarker解决方案,KDDI和谷歌成功地为虚拟主播带来了真实感。
技术实现
使用Mediapipe强大而高效的Python包,KDDI开发人员能够检测表演者的面部特征并实时提取52个混合形状。
1 | import mediapipe as mp |


















































































































































































































