一、面部捕捉效果
在Demo中我们使用iPhone设备进行面部捕捉,最终的效果如下:
1)眨眼睛
2)嘟嘴
3)转动头部
4)吐舌头
从上面的效果来看,我们使用自定义的模型,进行面部捕捉采集到了丰富的表情变化,除了脸部动作之外,还包括眼睛、舌头和头部的动作。
下面介绍一下ARKit技术原理及开发流程
二、ARKit技术原理
ARKit1.0是2017年9月份随着iPhone X一起发布的,iPhone X中的TrueDepth摄像头可实时提供深度数据以及视觉信息,该系统使用LED投射超过30000个红外点的不规则网格,并且实现了毫秒级的记录,ARKit到现在已经到了4.0版本,在iPhone中Animoji是它的一个简单应用。
ARFaceTrackingConfiguration
人脸跟踪配置检测设备的前置摄像头中可见的面孔。当 ARKit 检测到一张脸时,它会创建一个 ARFaceAnchor 对象,该对象提供关于一个人的面部位置、方向、拓扑和表情的信息。可以使用ARFaceTrackingConfiguration.isSupported检测当前设备是否支持Face Tracking。
ARSCNFaceGeometry
ARKit提供的脸部网格数据,我们可以使用纹理或者图片添加特效,如下图所示:
ARFaceAnchor
当设备检测到人脸时,它会自动添加脸部锚点,锚点的位置在鼻子的后方位置。
这个类提供了Face Geomery(脸部拓扑的粗三角网格)、Tracking Eye Movement(面部眼睛的位置和方向的变换矩阵及人脸坐标空间中估计人脸凝视方向的位置)、Blend Shapes,其中我们最主要关心的是Blend Shapes数据。
面部表情追踪
BlendShapes属性提供了人脸面部表情的一个高阶模型,总共包含52组运动的特征因子,使用BlendShapeLocation作为表情定位符,里面每个特征因子key对应的值是取值范围为0.0~1.0的浮点数,0.0表示中立情况下的取值(面无表情),1.0表示最大程度(比如嘴巴张到最大时),具体key及表示的含义如下:
表情定位符 | 描述 | 表情定位符 | 描述 |
---|---|---|---|
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 | 吐舌头 |
有了这些运动的特征因子后,在游戏引擎中,计算最终的目标网格。比如Unity中,方法原型为:
public void SetBlendShapeWeight(int index, float value);
index指的是需要融合的网格索引,value指的是Blend Shape的权重,最终的值符合以下的计算公式:
因此,通过设置网格的BlendShape权重值可以将网格从源网格过渡到目标网格。如下图所示。
在进行面部捕捉的过程中,会将这些运动因子变化的数据传递给游戏引擎或者Maya等软件,将表情变化映射到模型上面,从而实现丰富的面部表情。
示例效果:
三、开发流程
在UE4中使用ARKit要求版本在4.25以上,官方在App Store中提供了Live Link Face免费应用和UE的Live Link Plugin,下面讲下具体的使用示例
1、准备工作
1)下载Live Link Face应用;
2)在Epic的学习窗口中下载官方的面部AR示例,并创建工程;
2、开发流程
1)进入Maps下的FraceTrackingMap2场景;
2)调整人物模型或摄像机的位置,让模型的整个头部部分都能够显示出来;
3)选中任务模型,点击Details下的KiteBoyHead_JointsAndBlends(Inherited);
4)双击击下方的Skeletal Mesh缩略图进入编辑器;
5)打开右上角的Blueprint进入以下界面,最主要的就是将iPhone与Live Link Pose中的 Live Link Subject Name进行连接;
6)打开iPhone设备上的Live Link Face app,进入Live Link设置界面,添加目标电脑的IP,如果在多台电脑上接收,可以添加多个,端口号默认不用修改;
7)在上面的Live Link Subject Name中选择自己的手机进行连接,如果设备没有显示出来,可能是因为不在相同的局域网内,可以使用热点进行连接;
8)点击Blueprint窗口中的complie按钮并保存。
9)回到UE的场景界面,点击Play按钮即可以通过iPhone实时的捕捉人物的面部表情了;在场景里面,你会发现人物的表情和眼睛都可以实现追踪,但是头部的方向是固定的,这里在app设置打开【流送头部旋转】选项即可。
注意:在ARKit中使用了镜像模型,所以在捕捉到的动作方向是相反的。
10)调整模型动作的方向和运动速率,将下图中从curve中获取的数值取反即可,比如将红色框框的值是90的时候,模型上下运动的方向和真人就会保持一致了,然后调整值的倍率就可以修改运动的快慢,值越大,运动的越慢;
注:这里介绍的是官方Demo使用流程,使用自定义模型详细教程后续给出。