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 |