查看原文
其他

iPhoneX上的ARKit人脸跟踪

2017-11-07 Unity官方 Unity官方平台


自从6月份在WWDC大会上首次发布以来,ARKit已经成为实现稳定的消费者级AR的可靠方式。最近在iPhone X发布会上,苹果公司透露将会为ARKit加入一些仅在iPhone X上可用的人脸跟踪功能,该功能将会使用iPhoneX上包含深度摄像头的前置摄像头阵列。


Unity一直与苹果密切合作,在ARKit发布的同时就提供了对应的Unity ARKit插件,以确保Unity开发者可以在最短的时间内就可以开发出ARKit应用。我们与苹果公司紧密合作,使ARKit的人脸追踪功能成为了Unity ARKit插件的一部分。

 

这些新功能的相关代码与示例已集成至Unity ARKit插件,我们会提供所有涉及资源的下载地址。

 

插件中的新增API内容

如果你的应用运行在iPhoneX上,现在可以使用一个名为ARKitFaceTrackingConfiguration的配置信息。新的RunWithConfig 和 RunWithConfigAndOptions方法可以使用ARKitFaceTrackingConfiguration配置信息,用于启动AR会话。

 


新增了用于添加、删除或更新ARFaceAnchor的事件回调。


   

人脸跟踪功能

ARKit中的人脸跟踪有四个主要功能。下面会对它们进行介绍,并给出相应的使用示例。


人脸锚点Face Anchor



人脸跟踪的一个基本功能是当iPhoneX的前置摄像机检测到人脸时提供一个人脸锚点。这个人脸锚点与ARKit通常返回的平面锚点相似,另外当你移动头部时,它会跟踪头部中心的位置和方向。通过这种方式,你可以使用面部运动作为ARKit应用的输入,同时也允许你使用这个锚点将对象附加到脸部或头部,这样它就会随着你头部的移动而移动。

 

我们制作了一个示例场景FaceAnchorScene,用于演示这个功能。它里面有一个附加了UnityARFaceAnchorManager组件的游戏对象,该组件会使用ARKitFaceTrackingConfiguration初始化ARKit。它还连接到FaceAnchor,创建、更新和移除事件,以便执行以下操作:

  1. 在创建人脸锚点时,它会启用一个需要引用的游戏对象。在示例中是一个三坐标轴模型,将这个模型移动到由FaceAnchor返回的位置和方向上。

  2. 在人脸锚点更新时,它将会更新游戏对象的位置和方向。

  3. 当移除人脸锚点时,它会禁用游戏对象。

 

这一场景还使用了ARCameraTracker组件,该组件通过FrameUpdateEvent更新主Unity摄像机,如同常规的ARKit应用程序一样。


人脸网格几何体Face Mesh Geometry


 

人脸跟踪API还可以将它检测到的人脸形状作为一个网格返回。在Unity中使用这些网格顶点可以创建一个对应的网格。然后将其与透明纹理一起使用,即可进行各种脸部或面具绘制。当我们把对象连接到人脸锚点时,也可以为这个网格赋予一个遮挡材质,这样网格物体就能正确地挡住脸部的视频。

 

示例场景FaceMeshScene展示了如何在你的脸上显示一个使用默认材质的脸部网格几何体 。它有一个常见的ARCameraTracker游戏对象,用于在场景中移动摄像机。此外它还有一个ARFaceMeshManager游戏对象,该对象拥有一个标准网格渲染器以及一个空的网格过滤器组件。这个游戏对象还拥有UnityARFaceMeshManager组件,用以执行以下操作:

  1. 配置人脸跟踪。

  2. 根据锚点位置和旋转,更新对应游戏对象的变换信息。

  3. 提取每帧中锚点的网格数据,填充成一个网格,并将该网格赋予网格过滤器组件。


混合形状Blend Shapes



我们从人脸跟踪得到的另一组数据是描述面部表情的系数,将它们映射到一个虚拟面部,可以模仿你的表情。

 

我们的示例场景FaceBlendShapeScene展示了这项应用。在UI中,它显示了根据当前表情返回的不同混合形状值的系数。看看它们在你改变你的表情时是如何变化的。

 

这个场景与FaceMeshScene拥有相同的游戏对象,但是另外还有一个包含了BlendshapePrinter组件的BlendshapeOutput游戏对象。该组件从人脸锚点中提取存在的混合形状,并将其输出到屏幕UI。

 

我们正在制作一个更详细的例子,在这个例子中,这些值将被映射到虚拟头部的面部动画中,以帮助你更好地了解它的用途。

 

定向光估计 Directional Light Estimate



使用人脸跟踪还能获取另一组有趣的数据: 将你的脸作为场景中的光线探头,生成场景的定向光估计 。生成的数据包含三个方面:

  1. 主光源方向

  2. 主光源亮度

  3. 预估的全向照明环境的球面调和系数

 

最后一项在Unity中对我们来说很有意思,因为它是我们标准渲染管线中用于动态全局照明的解决方案。了解这些信息后,我们就可以在示例场景中利用它。

 

FaceDirectionalLightEstimate场景拥有一个ARCameraTracker和一个ARFaceAnchorManager,它使一个标准灰色球体网格随你的脸四处移动。ARKitLightManager游戏对象是新增的,它包含一个UnityARKitLightManager组件,用于从FrameUpdated事件获取球面调和系数,并将其赋予场景中所有的Unity光线探头,包括环境光线探头。这样就能根据估计的环境光线,有效地为场景中的网格提供动态照明。

 

如果你希望使用自己的机制来提供场景照明,可以通过FrameUpdated事件,获取以Unity坐标系统表示的原始球面调和系数,插入到你的照明公式中。你也可能只是想使用主光源的方向和强度来照明,同样的方式也适用。


ARkit插件下载

Bitbucket:

https://bitbucket.org/Unity-Technologies/unity-arkit-plugin 


Asset Store:

https://www.assetstore.unity3d.com/en/#!/content/92515


说明:受插件审核影响,如果您需要参考本文中所提供的示例场景,请从Bitbucket下载。


小结

正如你所看到的,在iPhone X上有一些不错的与人脸跟踪有关的ARKit功能。Unity的ARKit插件可以帮助你轻松地在你的应用中实现这些功能。iPhone X目前已正式发售,所以AR的开发者,赶紧行动起来,在你的应用中使用人脸跟踪吧。后面我们还将为大家分享更多新功能及相关教程在Unity官方中文社区(unitychina.cn),请保持关注!


推荐阅读

在Unity中创建ARCore项目《Akira》

使用Unity在手机上实现移动Inside-out VR追踪

在iOS 11中发布ARKit应用

Unity 与 ARkit 开发-基础篇

Unity ARKit Remote发布,支持远程调试ARKit应用


近期Unity官方活动

11,Unity教育峰会,上海站报名仅剩最后半天广州桂林、济南、武汉站报名火热进行中。


11月11日Unity技术路演成都站火热报名中!


Unity Connect火热征文中,赶紧来分享你的Made with Unity作品吧!


点击“阅读原文”进入Unity官方中文社区

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存