WWDC 2018: ARKit 2 的新功能

5,631 阅读26分钟

本文是针对 Session 602: What's New in ARKit 2 的解读

ARKit 2 让我们用全新的方式与真实世界互动——多台 iOS 设备可以同时浏览同一个 AR 场景,或是玩多人 AR 游戏。此外还增加了追踪 2D 图片和检测已知 3D 对象(例如雕塑、玩具、家具等等)的能力。


Apple 在去年的 WWDC 上发布了 iOS 11 与移动 AR 开发框架 ARKit,目前 ARKit 已经部署到了数亿台 iOS 设备上,让 iOS 成为了最大的、最先进的 AR 平台。

ARKit 的接口简单易用,但具备很多强大的功能,开发者也在过去的一年里开发出了很多神奇的产品:

  • BBC 出品的 Civilisations AR 为你展示历史上的艺术杰作,你可以从任意角度观察它们,还可以查看它们的详细资料,甚至还可以把它们摆在自家院子里。

  • Boulevard AR 用前所未有的直接的方式带你欣赏英国国家肖像馆里的著名艺术品,可以把它们摆在地上或是挂在墙上,然后贴近查看所有的细节,告诉我们艺术品背后的故事。

ARKit 也是一种非常有趣的教育方式:

  • WWF Free Rivers 可以在你的面前展现沉浸式的风景,跟随一条在人和野生动植物的生活中穿流而过的河,了解人类家园对河流的依赖,以及通过建设水坝观察人类活动是如何影响野生动植物的生活的,鼓励大家保护环境、进行可持续性发展。

除了上面举的几个例子,App Store 里还有很多很多神奇的 AR 作品。

ARKit 回顾

追踪

追踪是 ARKit 的核心功能,可以获得设备在物理世界中的方向和位置,此外还可以追踪物体(例如人脸)。

场景理解

场景理解通过学习环境的一些属性来优化追踪,检测水平面(例如地面和桌面)和垂直面以便在场景中放置物体。场景理解还会学习环境中的光照情况,以便在虚拟场景中精确模拟真实的光照,以防物体看起来过亮或过暗。

渲染

渲染就是指用户在设备上实际看到、并且在 AR 场景中交互的内容。ARKit 可以很方便的与你喜欢的渲染引擎进行集成,还为 SceneKit 和 SpriteKit 提供了内置视图。此外 Xcode 还提供了可以快速上手的 Metal 模板。

此外还为 Unity 和 Unreal 的公开游戏引擎集成了完整的 ARKit 功能。

所以如果要开始制作 ARKit 项目,以上游戏引擎都可供选择。

ARKit 2 的新功能

  • 加载和保存地图,提供了全新的持久化及多人体验
  • 环境纹理,可以更真实地渲染 AR 场景
  • 图像追踪,实时追踪 2D 图片
  • 物体检测,检测场景中的 3D 物体
  • 面部追踪提升

加载和保存地图

加载和保存地图是世界追踪的一部分,世界追踪可以给出真实世界中设备的位置和角度(6自由度),以便在场景中放置物体,如下图中的桌子椅子所示。

世界追踪还可以给出精确的物理尺度,以便以正确的尺寸放置物体,以防过大或过小。物理尺寸还可以用于精确测量,例如 iOS 12 中提供的 Measure app。

世界追踪还会给出 3D 特征点,可以了解环境中的一些物理结构,以便执行命中测试(hit testing),从而在场景中放置物体。

iOS 11.3 发布了重新定位(Relocalization)功能,即使 ARSession 被打断了(例如 app 进入后台或使用 iPad 上的画中画功能),也可以随后恢复之前的追踪状态。

ARWorldMap

重新定位功能的实现依赖于一张被世界追踪不断绘制的地图,随着用户在环境中不断移动,这张地图也会学习更多环境特征并不断延展,现在这张地图在 ARKit API 中以 ARWorldMap 对象提供给开发者使用了。

ARWorldMap 映射了物理 3D 空间,如上图所示。

同时,物理空间中的锚点(anchor)也很重要,以便在相应的位置放置虚拟物体,所以 ARWorldMap 中默认包含所有平面锚点,此外开发者还可以在场景中添加自定义锚点,WorldMap 中的锚点列表也会保存这些自定义锚点。

为了便于可视化和 debug,ARWorldMap 还会提供原始特征点以及范围(extent),以便理解用户扫描的物体空间结构。

最关键的一点是,ARWorldMap 是一个可序列化(serialization)对象,可以被序列化为任意你想要的数据格式,作为本地磁盘上一个文件或分享到云端。

所以,ARWorldMap 为我们带来了 ARKit 的两种全新体验:

持久化

举个例子,一个用户开启了世界追踪,然后通过 ARKit 命中测试在场景中放了一个物体。

在用户离开之前,他在设备上保存了这张 WorldMap。

一段时间之后,这个用户又回到了这里,此时他可以加载之前的那张 WorldMap,并获得与之前完全相同的增强现实体验。

他还可以不断重复这个过程,并且以后每次来到这个桌子的时候都能看到他之前摆放的这些物体。

以上就是世界追踪中的持久化体验。

多人体验

ARWorldMap 还为我们带来了多人体验,现在 AR 体验可以与其他用户共享,而不再只局限于单设备或单用户。用户可以生成地图,并将其共享给其他用户。

WorldMap 代表了现实世界中的坐标系,所以用户会共享同一个坐标系,并且从不同的视角体验同一个 AR 场景,就像 WWDC 上演示的那个多人游戏一样,此外 WorldMap 还可以用于创建多人共享的教育体验。

由于 ARWorldMap 是开放给开发者的,所以我们可以用任意技术手段来共享它,例如使用支持多人连接的隔空投送(依赖本地蓝牙或 WiFi),所以即使没有网络也可以实现。

获取和加载 WorldMap 的 API 非常简单:

在任何时间点都可以从 ARSession 对象上获取当前的 WorldMap,并在 completion handler 里返回该 ARWorldMap 对象,如果无法获取 WorldMap 则会返回 error。

取得 WorldMap 之后,只要在初始化 ARWorldTrackingConfiguration 时给 initialWorldMap 属性赋值并运行即可,或者通过配置 ARSession 的 configuration 并运行即可实现动态改变。

ARSession 携带 ARWorldMap 启动之后,会执行 iOS 11.3 引入的重新定位功能。

获得良好的 World Map

要让重新定位功能可靠运行,就需要获取良好的 WorldMap。首先,要从多个视角扫描物理空间,便于追踪系统学习环境中的物理结构。同时,环境需要是静态的,并且具有良好的纹理,以便学习更多环境特征。其次,地图需要密集的特征点,这样才能可靠地进行重新定位。

不过不用担心,ARKit API 简化了这一步,ARFrame 上新增了 worldMappingStatus 属性:

每个 ARFrame 都会更新 worldMappingStatus 属性,使用方法如下:

刚启动世界追踪时,WorldMappingStatus 处于 Not Avaiable 状态,开始扫描物理空间后,状态就会变为 Limited:

随着在物理世界中的移动,世界追踪会持续延展 World Map(Extending)。

如果对物理世界的扫描充足,WorldMappingStatus 会变成 Mapped:

但如果走出了 map 所对应的物理空间,WorldMappingStatus 就会再次回到 Limited,并继续学习新看到的环境:

所以应该如何在应用里使用 WorldMappingStatus 呢?假设我们正在开发一个 app,用户可以与其他人分享他的 World Map,界面下方有一个 “Share Map” 按钮:

WorldMappingStatus 处于 Not Available 或 Limited 状态时,应该禁用这个按钮。

状态进入 extending 后,则需要在界面上显示一个 Activity Indicator:

这样会鼓励用户在物理世界中继续移动,持续扫描并扩展 map 以便用于进行重新定位。WorldMappingStatus 变成 mapped 之后,就可以启用 Share Map 按钮并隐藏 Activity Indicator 了,以便让用户分享地图:

Demo

下面是保存和加载地图的 Demo,这个 Demo 由两个 app 组成,一个用于获取地图并保存为本地文件,另一个则会加载之前那张地图并恢复为与之前完全相同的 AR 体验:

刚打开 app 时,可以看到右上角的 WorldMappingStatus 为 Not Available:

然后在环境里来回移动,状态就会变为 Extending:

然后继续在环境中移动,WorldMappingStatus 就会变成 Mapped:

也就是说目前特征点已经足够重新定位使用了,所以此时已经可以获取并保存 World Map 了,但为了让 AR 体验更有趣一点,我打算通过命中测试来放置一个自定义锚点(一台老电视):

点击保存 World Map(当然我也可以继续构建地图),World Map 保存后 app 显示出了它包含的所有特征点:

上面这些小蓝点都是 World Map 的一部分,并且该 World Map 已经序列化为文件了,现在可以在另一个 app 中恢复刚刚的 AR 体验。我移动到了与刚刚不同的位置,屏幕上显示出了我目前的世界原点:

目前世界追踪正处于重新定位状态,也就是 iOS 11.3 引入的重新定位功能。现在把设备指向刚刚创建 World Map 的物理位置,就在我指向刚刚那的点的瞬间,世界原点恢复到了之前那个位置,同时也恢复了我的自定义锚点,这样我就拥有了与之前一模一样的 AR 体验:

后面我可以无数次重启这个 app,每一次都会展示与之前完全相同的体验。World Map 当然也可以分享给其他设备,这就是持久化功能。

以上就是保存和加载地图功能的介绍,为 ARKit 带来了持久化和多人体验。除了保存和加载地图,世界追踪还在以下方面进行了提升:

  • 更快速的初始化和平面检测
  • 更健壮的追踪系统,可以在更复杂的环境中检测平面
  • 水平面和垂直面都具备了更精确的范围和边界,以便更精准地放置物体
  • 持续对焦(iOS 11.3 引入)

除了上面这几项,iOS 还有很多其他专为 AR 体验而进行的优化,例如:

  • 4:3 视频格式,这是一种广角视频格式,可以极大地提升 iPad 上的视觉体验,因为 iPad 的屏幕显示比例就是 4:3,同时 4:3 的视频格式也会成为 ARKit 2 的默认格式。

除了 4:3 视频格式以外的所有优化都会应用到 App Store 目前的 app 上,如果想使用 4:3 视频格式,则需要用新的 SDK 重新构建 app。

环境纹理

为了提升用户体验,我们推出了用于渲染的环境纹理,可以极大地提升用户体验。

真实的渲染

假设设计师非常努力地创建了这样一个虚拟物体,准备用在 AR 场景里:

首先,我们需要做下面这些事情:

  • 在正确的位置用正确的角度摆放,就像在真实世界里那样
  • 使用正确的尺寸,看起来既不会太大又不会太小,ARKit 中的世界追踪会提供正确的 transform
  • 使用环境中的真实光照,ARKit 会提供环境光估计(ambient light estimate)用于调整虚拟物体的亮度,这样看起来既不会太亮又不会太暗,和环境融为一体
  • 如果把物体摆放在物体表面(例如水平面)上,还需要加上阴影,这样可以极大提升人类的视觉感知,看起来好像真的在表面上一样
  • 最后,如果是会反光的物体,人们希望能够从虚拟物体的表面上看到周围环境的反射,这就是环境纹理发挥作用的地方。

这是上面那个虚拟物体在增强现实场景中的显示效果:

可以看到,尺寸恰当,但更重要的是,在物体表面可以看到周围环境的反射,右面可以看到黄色的香蕉和橙子的反射,左面则可以看到绿叶的反射,中间还能看到板凳表面的反射,这些就是 ARKit 2 的环境纹理的强大功能。

环境纹理功能会获取场景的纹理信息,通常情况下用 cube map 来表示,但有时候也会用其他格式表示,这个 cube map 还可以用作渲染引擎的 reflection probe,把纹理信息应用到虚拟物体上,就像上面那盆水果一样,极大地提升了可反光的物体的视觉效果。

ARKit 在运行时通过世界追踪和场景理解持续学习环境中的信息:

通过计算机视觉提取纹理信息并填充 cube map,并将 cube map 精确地放置在场景中。注意,上面的 cube map 只被填充了一部分,但要将其设置为 reflection probe 的话,则需要被完全填充。要得到一个完全填充的 cube map,需要彻底扫描身边的物体空间,例如 360 度转一圈,就像做一张全景图一样。但这样对于用户来说太难了,所以 ARKit 会借助先进的机器学习算法来自动填充 cube map,让这一切变得相当容易:

补充一句,以上这些计算都是在本地实时进行的。

有了 cube map 后就可以将其设置为 reflection probe,然后把虚拟物体放进场景,它们就会开始反射环境了:

以上就是对环境纹理功能的工作原理的简单介绍,借助 ARKit API,使用起来也非常简单,只要在 ARWorldTrackingConfiguration 里将 environmentTexturing 属性设置为 automatic 然后运行:

就这么简单!

然后 ARSession 会在后台自动处理环境纹理,并将环境纹理提供为 environment probe anchor。

AREnvironmentProbeAnchor

AREnvironmentProbeAnchor 是 ARAnchor 的 extension,意味着它有 6 自由度的位置与角度 transform。此外,它还有一个 MTLTexure 格式的 cube map:

ARKit 还提供了 cube map 的物理范围,也就是 reflection probe 的影响范围,渲染引擎会借助它来纠正视差,比如物体在场景中移动时会自动适应新的位置,并反射环境中新的纹理。

AREnvironmentProbeAnchor 的生命周期和其它 anchor 相同,例如 ARPlaneAnchor 和 ARImageAnchor。

此外,AREnvironmentProbeAnchor 还被完全整合进了 ARSCNView,如果你的渲染引擎是 SceneKit,那就只要在 WorldTrackingConfiguration 里启用这个功能就好了,其余的工作 ARSCNView 会自动搞定。

对于更复杂的使用场景,可能需要在场景里手动放置 AREnvironmentProbeAnchor,这时需要把 environmentTexturing 属性设置为 manual:

然后可以按照理想的位置和角度将 AREnvironmentProbeAnchor 添加到 ARSession 对象中,ARSession 获得更多有关环境的信息时会更新其纹理。

Demo

下面这个小 Demo 展示了环境纹理是如何真实地渲染 AR 场景的。放上之前那个模型,先来看一下未启用环境纹理的情况:

可以在底部的开关上看到目前采用的是环境光估算,看起来还可以,摆在桌上,有自然的阴影,但缺少的就是对木头桌子的反射。如果在旁边再放点东西:

虚拟物体并没有反射出这个水果。下面启用环境纹理功能:

可以看到,启动环境纹理功能后物体立刻开始反射木头桌子和香蕉的纹理,极大地提升了 AR 场景的效果,看起来非常理想,就像真的在桌上一样。

以上就是 ARKit 2 强大的环境纹理功能,让 AR 场景变得异常真实。

图像追踪

iOS 11.3 引入了图像检测功能,作为世界追踪的一部分。图像检测会搜索场景中指定的 2D 图像,但这些图像必须是静止的、不能被移动,例如电影海报或博物馆里的画作。

ARKit 会估算被检测到的图像的位置和角度(6自由度),可以用来触发渲染场景中的内容。由于图像追踪是被完全整合在世界追踪里的,所以只要设置一个属性就可以用了。

为了加载用于图像检测的图片,可以从文件中加载,也可以使用 Xcode 的 asset catalog,asset catalog 可以提供图像的检测质量。

图像检测是一个很棒的功能,但在 iOS 12 里会因为图像追踪功能的加入变得更加出色。

图像追踪是对图像检测功能的一个补充,最大的好处就是图像不再需要是静止的,可以移动:

ARKit 现在会以每秒 60 帧的速率估算每一帧的位置和方向,可以实际增强 2D 图像,例如杂志、桌游等等具有真实图片的东西。

ARKit 还可以同时追踪多个图像:

默认情况下只追踪一张图像,例如杂志封面。但如果是杂志的内页,则可以设置为同时追踪两张图像。

此外,iOS 12 和 ARKit 2 还带来了全新的 ARImageTrackingConfiguration,可以用来单独进行图像追踪,设置方法如下。

首先从文件或 asset catalog 中加载一组 Reference Image:

然后把这些 Reference Image 设置为 ARWorldTrackingConfiguration 的 detectionImages 属性:

或者设置为 ARImageTrackingConfiguration 的 trackingImages 属性:

然后用刚刚设置好的 configuration 来运行 session:

然后和之前一样,在 ARSession 运行时,每次更新都会提供 ARFrame:

如果图片被检测到了,ARFrame 则会包含 ARImageAnchor 对象:

ARImageAnchor 是一个可被追踪的对象,因为它符合 ARTrackable 协议,所以有一个布尔型的 isTracked 属性,指出当前图像的追踪状态,true 表示正在被追踪:

还有一个属性指向当前被检测到的图像,同时用一个 4x4 矩阵来表示位置和角度。

使用良好的图像

获取 Image Anchor 的第一步就是加载图像,那么应该选择怎样的图像呢?

这是一张来自儿童读物的图像:

这张图像对于图片追踪来说非常理想,有清晰的特征、良好的纹理、鲜明的对比。

下面这张图片同样来自于儿童读物,但并不建议使用:

它有多个重复性结构、均匀的色域、狭窄的灰度直方图。但我们不需要自己辨别这些图片是否存在问题,Xcode 会帮助我们:

如果我把上面的图片导入 Xcode,会发现左侧那张图片没有警告,也就是说它是被建议使用的。然而右面那张 three kids reading 则出现了警告图标,说明不建议使用它,如果点击该图标,可以看到不建议用于图像追踪的详细原因:

可以看到原因和直方图、色域以及重复结构有关。

配置图像追踪

图片加载完之后,有两种方式配置图像追踪,第一种是使用 ARWorldTrackingConfiguration。

如果使用世界追踪中的图像追踪功能,image anchor 会以世界坐标系进行表示,也就是说 image anchor、plane anchor 以及世界原点都会处于同一坐标系中,它们之间的交互也会变得简单、直接。

第二种则是使用全新推出的 ARImageTrackingConfiguration,用于单独执行图像追踪。

也就是说 ARImageTrackingConfiguration 会从世界追踪中独立出来,不用依赖运动传感器也可以进行追踪,识别图像前也不需要初始化,此外还可以用在无法使用世界追踪的场景下,例如电梯或火车等正在移动的场所。

在这种配置下,ARSession 会以 60 帧一秒的速度估算位置和角度,实现起来也非常简单:

首先创建一个 ARImageTrackingConfiguration 类型的 configuration,然后指定需要追踪的图像数组,接下来还可以指定希望追踪的图片数量。(需要注意的是,上面设置了三张需要追踪的图像,但将同时追踪的图像上限设置为了 2,所以如果已经追踪到了前两张图像,此时第三张图像进入画面的话,仍然能够收到 detection 的更新,但不会追踪第三张图像)。最后,用 configuration 运行 session。

如前文所述,还可以通过 World Tracking 实现图像追踪,只要替换图中高亮的两行代码即可:

图像检测和图像追踪之间的唯一区别就在于 maximumNumberOfTrackedImages,所以如果你的 app 正在使用图像检测功能,只要加上这一行,重新编译,就可以使用全新的追踪功能了。

Demo

这个 demo 是一个 AR 相框 app,首先用 Xcode 生成一个 AR app 的模板:

接下来需要指定待检测的图像,一只叫 daisy 的猫咪:

在属性面板将此图片命名为 daisy,同时指定该图像文件在真实世界的尺寸,也就是相框的尺寸。此外还在 Xcode 中载入了一段 daisy 的视频:

下面,先创建一个 ARImageTrackingConfiguration 类型的 configuration:

并且使用 group name “Photos” 从 asset catalog 中载入了图像数组,数组中只有一张图像 “daisy”,然后将其设置为 configuration 的 trackingImages 属性,接下来把 maximumNumberOfTrackingImages 属性设置为 1。

如果此时运行这个 app,ARSession 已经可以在图片被检测到时提供 ARImageAnchor 了,但还需要再增加点内容——创建一个 AVPlayer 来加载 Resource Bundle 中视频:

下面把它覆盖到现实中的图片上:

首先检测 imageAnchor 的类型是否是 ARImageAnchor,然后使用与被检测到的图像相同的物理尺寸创建一个平面,然后把 videoPlayer 设置为平面的纹理,并让视频开始播放。接下来用平面几何体来创建 SCNNode,并旋转使其与 anchor 的坐标系相匹配。

就是这样,运行!

可以看到,就在我把猫咪相框放进屏幕的瞬间视频就开始播放了,猫咪在里面动来动去。由于 ARKit 会实时估算位置,所以可以任意移动设备,每一帧都会相应更新。

以上就是对 ARKit 中图像追踪功能的介绍,使用起来非常简单。

物体检测

图像追踪适用于 2D 图像,但 ARKit 不只局限于此,物体检测功能可以用于检测场景中给定的 3D 物体。

和图像检测一样,物体检测只适用于无法移动的静态物体,例如博物馆里的展品、某些指定的玩具或是家庭物品等等。

此外,与图像检测不同的是,物体检测需要先用运行 ARKit 的 iOS app 扫描该物体。幸运的是,Apple 为我们提供了完全开源的、功能齐全的 iOS app 用于扫描自己的 3D 物体,这些物体需要有一些特征,例如拥有良好的纹理、硬性并且不会反光。

ARKit 可以估算这些物体的位置和角度(6自由度)。

同时,物体追踪功能被完全整合进了世界追踪功能中,所以只要设置一个属性,就可以开始进行物体追踪了。设置方法如下:

从文件或 Asset Catalog 中加载 ARReferenceObject 数组,然后将其设置为 ARWorldTrackingConfiguration 的 detectionObjects 属性:

configuration 设置完成之后,运行 session:

和图像检测一样,每次更新都会获得 ARFrame:

如果检测到了场景中的物体,ARFrame 就会包含 ARObjectAnchor:

ARObjectAnchor 是 ARAnchor 的一个简单子集:

transform 表示 6 自由度的位置和角度,同时还会通过 referenceObject 指出被检测到的物体。

只要三行代码就可以实现:

首先创建一个 ARWorldTrackingConfiguration 类型的 configuration,然后指定想要检测的物体数组(古代半身雕像以及陶罐),最后用它来运行 session。

上面的代码最终构成了一个简单的 AR 博物馆 app:

这个半身雕像进入 iOS 的视图中后,可以得到 6 自由度的 pose,利用它在雕像头顶浮现一个非常简单的信息图形,包括这位埃及女王的姓名(Nefertiti)以及她的出生日期,当然还可以添加任意渲染引擎支持的内容。

物体扫描

为了构建这个 app,我需要先扫描这个物体。物体扫描会收集场景中的信息,和平面检测类似,通过收集场景中的信息来估算水平面或垂直面的位置,这里则是获取有关 3D 对象的信息。

为了指定物体检测的区域,会生成 transform、extent 和 center,这样可以在物体周围形成一个立体边框,定义了它在场景中的位置。

Xcode asset catalog 完美支持提取出的对象,便于导出到其它 app 并进行复用。

Apple 还针对扫描功能推出了全新的 ARObjectScanningConfiguration,但我们并不需要自己写扫描 app,因为 Apple 开源了一个功能齐全的扫描 app,叫做 Scanning and detecting 3D objects。下面是这个 app 的工作方式:

现在我们要为上面的 Nefertiti 雕像创建立体边框,外边框并不需要很精确,因为真正重要的是边框内部那些特征点。

对外边框感到满意之后,就可以点击 Scan 按钮开始扫描物体了,可以看到进度在不断增加,表示物体被扫描的程度:

需要注意的是,并不一定要把物体的每一面都扫描下来,例如博物馆里的某些靠着墙壁的雕塑,无法从背后进行扫描,那一面就可以不扫。

对扫描感到满意之后,可以调整 extent 的 center(与物体的原点相对应),唯一的要求就是 center 要留在 extent 内部。

最后,扫描 app 还可以执行检测测试:

上图中的检测测试在多个视角下都通过了,说明扫描很成功。我还建议把物体移动到其它位置进行检测测试,看看在不同的材质和光照情况下能否成功:

扫描完成后会获得一个 ARReferenceObject 类型的对象(在之前的图表里提到过):

这个对象可以被序列化为文件,后缀名一般是 .arobject,name、center 和 extent 属性可以在 asset catalog 里查看。此外还可以得到之前扫描区域的所有原始特征点。

以上就对物体检测功能的介绍,记住在检测之前要先扫描一遍物体,扫描 app 所有的源码都是开源的,现在就可以下载

面部追踪

去年发布 iPhone X 的同时,ARKit 也推出了健壮的面部识别和追踪功能,每一帧都会估算面部的角度和位置(速度为每秒60帧),得到的 pose 可以用于增强用户面部,例如增加面具、帽子甚至是替换脸部材质。ARKit 还会以 ARFaceGeometry 格式提供面部三角网格:

面部追踪的主要锚点类型是 ARFaceAnchor,包含了面部追踪所需的所有信息。为了更真实地渲染,ARKit 还会提供方向性光线估算,将面部用作光线探测器(light probe),估算光线强度、方向以及色温:

光线估算对于大部分 app 来说非常够用了,但对于有更复杂业务需求的 app,ARKit 会收集整个场景的光线情况并提供球面谐波系数(spherical harmonics coefficient),可以进一步提升视觉效果。

blendshapes

ARKit 还可以实时追踪表情,支持超过 50 种特定的 blendshape (面部特征点),blenshape 会假设一个介于 0 和 1 之间的值来表示对应面部特征点的活跃程度,1 表示极度活跃,0 表示不活跃。例如张开嘴时 jawOpen 系数会接近 1,闭嘴时则接近 0。blendshapes 对于创造虚拟角色动画来说非常有用,例如结合使用 jawOpen、eyeBlinkLeft 和 eyeBlinkRight 系数就可以让下面这个小方盒角色动起来:

但还可以更进一步:

创建 Animoji 的时候会使用很多其它 blendshapes,通过右边的蓝色柱状图获得头部 pose,然后映射到那只熊猫上,ARKit 为你提供了创建虚拟卡通角色动画所需的一切信息,和 Animoji 一样。

面部追踪的新功能

ARKit 2 增加了凝视追踪(gaze tracking)功能,会以 6 自由度追踪左右眼球:

两个 6 自由度的 transform 是 ARFaceAnchor 的属性,还有一个属性叫做 lookAtPoint,估算了两个眼球的凝视方向在面部坐标空间中的交汇点:

可以用这些信息给虚拟角色生成动画,或者作为 app 信息输入的全新交互方式。

此外 ARKit 2 还支持了舌头检测:

舌头是一种全新的 blendshape,1 表示舌头伸出,0 表示没有伸出:

tongueOut 系数可以用在虚拟角色的动画中,当然,也可以用作 app 的交互方式(笑

总结

强大的保存和加载地图功能可以让我们获得持久化体验以及多人体验,世界追踪功能的提升可以让平面检测变得更快、更精确,同时还提供了全新的视频格式。环境纹理功能可以收集场景的材质并应用到物体上,让物体看起来更加真实,与场景融为一体。此外还有全新的 2D 图像追踪功能,以及 3D 物体检测功能。面部追踪功能则推出了全新的“凝视追踪”以及“舌头追踪”。

两个新增的 session configuration,ARImageTrackingConfiguration 用于独立图像追踪,ARObjectScanningConfiguration 则用于物体扫描。此外还有一些用于与 ARSession 交互的补充类型:

ARAnchor 用于表示现实世界中的某个具体位置,新增了两个全新类型:

相关 Session

查看更多 WWDC 18 相关文章请前往 老司机x知识小集xSwiftGG WWDC 18 专题目录