Zack.Zhang Game Developer

基于ARKit的面部捕捉技术生成高质量面部动画的原理

2022-04-25
zack.zhang

对于很多游戏来说,角色模型的制作者喜欢通过骨骼蒙皮模型来制作角色表情,在这个过程中动作师投入了大量的时间去将角色的表情调得惟妙惟肖,虽然花费了很多时间,往往还是有一些让人觉得不自然的地方,这个和动作师的经验有很大的关系。通过这样的方式想要获得高质量的,更加真实的面部动画,需要:

  • 大量的人力来调整骨骼动画

  • 制作人员需要有丰富的表情制作经验

对于有一些游戏来说,特别是带有捏脸系统的游戏来说,他们通常会使用Morph动画来表现人物面部。本文便是在Morph动画的基础上展开的。

硬件环境和软件环境

硬件上,我们需要一部iPhone X或者更加新的版本的iPhone手机,因为ArKit是伴随着iPhone X一起发布的。另外还需要一台Windows系统的个人电脑,用来处理捕捉到的面部动画数据。

软件上,我们需要在个人电脑上安装Unity 2019.2及其以上版本的Unity编辑器。在Unity编辑器的Package Manager里还需要安装ARKit Face Tracking。

BlendShape/Morph动画

Morph动画,即形变动画,存储了每一个关键帧上,所有顶点的位置。两个关键帧之间,通过对顶点位置进行插值,来实现变换动画。

BlendShape是Morph动画的一种应用,实际制作过程中,会将变换后的模型指定给原模型,再通过0到1之间的值对模型的变换程度进行控制。

BlendShape要求变换后的模型和原模型有相同的拓扑结构。

Apple的ARKit面部追踪系统定义了一套运动因子,总共包含52个BlendShape位置:

BlendShapeLocation 描述
eyeBlinkLeft 左眼眨眼
eyeLookDownLeft 左眼目视下方
eyeLookInLeft 左眼注视鼻尖
eyeLookOutLeft 左眼向左看
eyeLookUpLeft 左眼目视上方
eyeSquintLeft 左眼眯眼
eyeWideLeft 左眼睁大
eyeBlinkRight 右眼眨眼
eyeLookDownRight 右眼目视下方
eyeLookInRight 右眼注视鼻尖
eyeLookOutRight 右眼向左看
eyeLookUpRight 右眼目视上方
eyeSquintRight 右眼眯眼
eyeWideRight 右眼睁大
jawForward 努嘴时下巴向前
jawLeft 撇嘴时下巴向左
jawRight 撇嘴时下巴向右
jawOpen 张嘴时下巴向下
mouthClose 闭嘴
mouthFunnel 稍张嘴并双唇张开
mouthPucker 抿嘴
mouthLeft 向左撇嘴
mouthRight 向右撇嘴
mouthSmileLeft 左撇嘴笑
mouthSmileRight 右撇嘴笑
mouthFrownLeft 左嘴唇下压
mouthFrownRight 右嘴唇下压
mouthDimpleLeft 左嘴唇向后
mouthDimpleRight 右嘴唇向后
mouthStretchLeft 左嘴角向左
mouthStretchRight 右嘴角向右
mouthRollLower 下嘴唇卷向里
mouthRollUpper 下嘴唇卷向上
mouthShrugLower 下嘴唇向下
mouthShrugUpper 上嘴唇向上
mouthPressLeft 下嘴唇压向左
mouthPressRight 下嘴唇压向右
mouthLowerDownLeft 下嘴唇压向左下
mouthLowerDownRight 下嘴唇压向右下
mouthUpperUpLeft 上嘴唇压向左上
mouthUpperUpRight 上嘴唇压向右上
browDownLeft 左眉向外
browDownRight 右眉向外
browInnerUp 蹙眉
browOuterUpLeft 左眉向左上
browOuterUpRight 右眉向右上
cheekPuff 脸颊向外
cheekSquintLeft 左脸颊向上并回旋
cheekSquintRight 右脸颊向上并回旋
noseSneerLeft 左蹙鼻子
noseSneerRight 右蹙鼻子
tongueOut 吐舌头

其中也有51个BlendShape位置的版本,即如果不需要做舌头动画可以去掉“tongueOut(吐舌头)”。

在DCC工具中如何生产BlendShape,相信已经有很多很详细的教程可以参考,本文不再赘述。

面部捕捉HelloWorld

第一次接触ARKit,可能会比较难于上手,推荐以下视频,可以帮助快速上手。

Unity教程:10分钟挑战实现AR人脸捕捉!Face Tracking

当ARKit识别出人脸后,会在人脸上生成一个面部模型,UV展开如下图所示。

wireframeTexture.png

根据展开的UV可以制作喜欢的面部纹理,放到Demo里面体验。

face1.png

总体设计

使用TCP搭建一个简单C/S结构的系统,服务器在Unity编辑器上运行,客户端在移动设备上运行。移动设备通过ARKit捕捉到的面部动画数据,通过客户端向服务器传输,Unity编辑器端从服务器里面取出传输的数据生成动画文件。


Similar Posts

评论