WWDC 2018: ARKit 2 的新功能

本文是针对 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 平台。markdown

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

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

  • Boulevard AR 用史无前例的直接的方式带你欣赏英国国家肖像馆里的著名艺术品,能够把它们摆在地上或是挂在墙上,而后贴近查看全部的细节,告诉咱们艺术品背后的故事。

ARKit 也是一种很是有趣的教育方式:session

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

除了上面举的几个例子,App Store 里还有不少不少神奇的 AR 做品。app

ARKit 回顾

追踪

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

场景理解

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

渲染

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

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

因此若是要开始制做 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 专题目录