ARKit面部捕捉及在UE4中的使用


一、面部捕捉效果

在Demo中我们使用iPhone设备进行面部捕捉,最终的效果如下:

1)眨眼睛
image-20210416105616733
2)嘟嘴
image-20210416105654588
3)转动头部
image-20210416112129677
4)吐舌头
image-20210416125018810

从上面的效果来看,我们使用自定义的模型,进行面部捕捉采集到了丰富的表情变化,除了脸部动作之外,还包括眼睛、舌头和头部的动作。

下面介绍一下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提供的脸部网格数据,我们可以使用纹理或者图片添加特效,如下图所示:

image-20210408212441666
ARFaceAnchor

当设备检测到人脸时,它会自动添加脸部锚点,锚点的位置在鼻子的后方位置。

image-20210408211827675

这个类提供了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的权重,最终的值符合以下的计算公式:

image-20210408215723017

因此,通过设置网格的BlendShape权重值可以将网格从源网格过渡到目标网格。如下图所示。

image-20210408215813606

在进行面部捕捉的过程中,会将这些运动因子变化的数据传递给游戏引擎或者Maya等软件,将表情变化映射到模型上面,从而实现丰富的面部表情。

示例效果:
WechatIMG211

三、开发流程

在UE4中使用ARKit要求版本在4.25以上,官方在App Store中提供了Live Link Face免费应用和UE的Live Link Plugin,下面讲下具体的使用示例

1、准备工作

1)下载Live Link Face应用;

2)在Epic的学习窗口中下载官方的面部AR示例,并创建工程;

image-20210409101104172

2、开发流程

1)进入Maps下的FraceTrackingMap2场景;

image-20210416130554417

2)调整人物模型或摄像机的位置,让模型的整个头部部分都能够显示出来;

3)选中任务模型,点击Details下的KiteBoyHead_JointsAndBlends(Inherited);

image-20210409101556118

4)双击击下方的Skeletal Mesh缩略图进入编辑器;

image-20210409101734992

5)打开右上角的Blueprint进入以下界面,最主要的就是将iPhone与Live Link Pose中的 Live Link Subject Name进行连接;

image-20210409102035151

6)打开iPhone设备上的Live Link Face app,进入Live Link设置界面,添加目标电脑的IP,如果在多台电脑上接收,可以添加多个,端口号默认不用修改;

image-20210409102326599

7)在上面的Live Link Subject Name中选择自己的手机进行连接,如果设备没有显示出来,可能是因为不在相同的局域网内,可以使用热点进行连接;

8)点击Blueprint窗口中的complie按钮并保存。

image-20210409102858096

9)回到UE的场景界面,点击Play按钮即可以通过iPhone实时的捕捉人物的面部表情了;在场景里面,你会发现人物的表情和眼睛都可以实现追踪,但是头部的方向是固定的,这里在app设置打开【流送头部旋转】选项即可。

注意:在ARKit中使用了镜像模型,所以在捕捉到的动作方向是相反的。

10)调整模型动作的方向和运动速率,将下图中从curve中获取的数值取反即可,比如将红色框框的值是90的时候,模型上下运动的方向和真人就会保持一致了,然后调整值的倍率就可以修改运动的快慢,值越大,运动的越慢;

image-20210414162821307

注:这里介绍的是官方Demo使用流程,使用自定义模型详细教程后续给出。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注