对于很多游戏来说,角色模型的制作者喜欢通过骨骼蒙皮模型来制作角色表情,在这个过程中动作师投入了大量的时间去将角色的表情调得惟妙惟肖,虽然花费了很多时间,往往还是有一些让人觉得不自然的地方,这个和动作师的经验有很大的关系。通过这样的方式想要获得高质量的,更加真实的面部动画,需要:
-
大量的人力来调整骨骼动画
-
制作人员需要有丰富的表情制作经验
对于有一些游戏来说,特别是带有捏脸系统的游戏来说,他们通常会使用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展开如下图所示。
根据展开的UV可以制作喜欢的面部纹理,放到Demo里面体验。
总体设计
使用TCP搭建一个简单C/S结构的系统,服务器在Unity编辑器上运行,客户端在移动设备上运行。移动设备通过ARKit捕捉到的面部动画数据,通过客户端向服务器传输,Unity编辑器端从服务器里面取出传输的数据生成动画文件。