[ WWDC2018 ] - ARKit2 革新 What’s New in ARKit 2

Session 602:What’s New in ARKit 2


ARKit 概述(ARKit Recap)

ARKit主要由三部分组成:

arkit_recap.png

1. 跟踪(Tracking)

跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。

2. 场景理解(Scene Understanding)

场景理解通过学习更多关于环境的属性,以对水平平面进行检测,如地面或桌面;iOS 11.3开始还支持检测垂直平面。这些在场景中平面可用于放置虚拟物体。此外,场景理解还会了解当前环境的光照情况,以提供光照信息用于在虚拟场景中反映真实环境,避免过亮或过暗。

3. 渲染(Rendering)

通过ARKit可以很容易地集成你所选的渲染引擎。ARKit可通过SceneKit和SpriteKit渲染。Xcode中还提供了Metal模板,方便快速地开始你的增强现实体验(augmented reality experience)项目。此外,Unity和Unreal也已经集成ARKit完整的功能集到他们主流的游戏引擎中,因此你可以通过这些引擎开始使用ARKit。

ARKit 2 新特性

主要新特性如下:

  1. 保存与加载地图(Saving and Loading Maps):用于支持持久化与多用户体验的强大新特性。
  2. 环境纹理(Environment Texturing):用于更逼真地渲染你的增强现实场景(augmented reality scene)。
  3. 图像跟踪(Image Tracking):对真实场景中的2D图像进行跟踪。
  4. 物体检测(Object Detection):对真实场景中的3D物体进行跟踪。
  5. 人脸跟踪的提升(Face Tracking Enhancements)

1. 保存与加载地图(Saving and Loading Maps)

世界跟踪概述(World Tracking Recap)

保存与加载地图是世界跟踪(World Tracking)的一部分,世界跟踪提供了以下信息:

  • 设备在真实世界中的位置与方向:用于在场景中放置物体。
  • 精确的物理尺寸:用于使用正确的尺寸放置物体,避免物体看上去过大或过小。还可可用于实现精确的测量。
  • 3D特征点:用于了解环境的物理结构,还可用于执行HitTest以在场景中放置物体。

在iOS 11.3引入了重定位(Relocalization),此功能可用于在ARSession被中断后(如进入后台),恢复之前的跟踪状态。

译注:世界跟踪中的位置与方向信息transform通常都是以6自由度的坐标系(6 degrees of freedom paws)的方式提供。

six_degrees_of_freedom_paws.png

映射(Mapping)

重定位工作于世界跟踪持续构建出来的地图上。当在环境中做越多的移动后,将能了解和学习到环境中越多不同的特征,而得到越完整的地图。然而此地图只在你的ARSession存活时存在。

mapping.png

在ARKit中,地图以ARWorldMap表示。ARWorldMap代表了3D物理空间中的映射状态及此空间中的Anchor。Anchor是物理空间中重要项,它们可被放置在你想要放置虚拟物体的地方,因而ARWorldMap中默认包含了平面(PlaneAnchor)。

ARWorldMap中的Anchor列表是可变。为在场景中创建自定义的Anchor,可以向其中添加这些Anchor。

为了方便查看与调试,ARWorldMap也提供了原始的特征点和范围。

更重要的是,ARWorldMap是个可序列化的对象,可将其序列化为任意你所选的数据流,如本地文件系统中的文件或放在共享网络上。由于此特性,使得可通过WorldMap对象为用户带来强大的新体验。

持久化(Persistence)

若将物体放在场景中,并在离开场景前保存WorldMap,之后再回来时,可加载同一的WorldMap,此时将发现之前的物体仍在场景中,而得到与之前相同的增强现实体验。

多用户体验(Multi-User Experiences)

multi_user_experiences.png

ARWorldMap提升了多用户体验。现在你的增强现实体验(augmented reality experience)并不局限于单一设备或单一用户。一个用户可创建一个WorldMap后,分享给一个或多个其他用户。

要注意的是,WorldMap表示真实世界中的一个单一的坐标系,这意味着每个用户共享同一空间,他们可以从不同观察点体验同一AR内容。因而可将此新特性用于多用户游戏或教学。

// Saving and Loading World Maps

// Retrieve world map from session object
session.getCurrentWorldMap { worldMap, error in  
    guard let worldMap = worldMap else {
        showAlert(error)
        return
    }
}

// Load world map and run the configuration
let configuration = ARWorldTrackingConfiguration()  
configuration.initialWorldMap = worldMap  
session.run(configuration)  

获取良好的世界地图(Acquiring Good World Maps)

为表现稳定,重要的是要获取良好的地图。要点如下:

  • 从多个角度扫描物理空间,使得跟踪系统可学习环境的物理结构。
  • 环境需要是静止的,纹理良好的,使得可以提取到更多的特征并学习到更多的环境情况。
  • 地图上存在密集的特征点,使得重定位更可靠。

然而不需要担心以上要点,ARKit会在每一帧更新worldMappingStatus,以便于了解当前World Mapping的状态。此状态一开始是不可用的(notAvalable),一旦开始扫描物理空间后,将立即进入受限状态(limited)。之后越是在物理世界中移动,世界跟踪将持续扩展地图(extending)。如果我们在当前视角已经扫描到足够的物理世界信息,状态将被置为mapped。若视角从一个已mapped的物理空间中移开,WorldMappingStatus将重置回limited状态,使其开始学习更多当前新环境的信息。

open class ARFrame : NSObject, NSCopying {  
    open var worldMappingStatus: ARFrame.WorldMappingStatus
}

public enum WorldMappingStatus : Int {  
    case notAvalable
    case limited
    case extending
    case mapped
}

world_mapping_status.png

若你有一个程序可分享WorldMap给其它用户,程序界面上有一个分享按钮,好的实践是在notAvalable或limited时禁用按钮。而当状态变为extending时,可考虑在界面上显示一个提示图,以鼓励你的用户在物理世界中持续移动并持续扫描,通过扫描去扩展地图。一旦完整地mapped,就可以隐藏提示图并启用分享按钮,以允许你的用户分享地图。

世界跟踪的提升(World Tracking Enhancements)

  • 更快的初始化及平面检测:从ARKit2开始,初始化及平面检测更快。
  • 更健壮的跟踪及平面检测:能在更复杂的环境下检测平面。水平平面和垂直平面都有更精确的范围和边界,意味着可以在场景中更精准地放置对象。
  • 持续自动对焦:从iOS 11.3开始,为增强现实体验而引入此特性。
  • 新的4:3视频格式:从iOS 12开始,在ARKit中引入了4:3视频格式。4:3是一种广角的视频格式,其大大加强了iPad上的视觉效果(Visualization),因为iPad的屏幕显示比例就是4:3,同时4:3的视频格式也将成为ARKit 2的默认格式。

2. 环境纹理(Environment Texturing)

为提升终端用户的体验上,我们引入了环境纹理,其大大增强了渲染效果。

真实感渲染(Realistic Rendering)

为保证渲染结果逼真,使它看起来真的像是被放置在真实世界中,需要做到以下几点:

  • 物体的位置与方向正确
  • 比例正确,避免物体不会过大或过小。世界跟踪会提供为你正确的transform。
  • 环境光。ARKit会提供给你测量的光照情况,你可用于渲染时修正虚拟物体的光照,使物体看起来不会过亮或过暗
  • 添加阴影,若将物体放置在水平平面上,为物体添加阴影也是重要的,以大大提升视觉感知,使得真正感觉物体被放置在表面上
  • 表面反光。对于会反光的物体,人们希望看到环境呈现在虚拟物体的表面上。

环境纹理(Environment Texturing)

环境纹理为收集到的场景纹理的信息,通常表示为立方体贴图(Cube Map),但也有其它表示方式。环境纹理被渲染在此立方体贴图中,可被用于作为渲染引擎中的反射探针(Reflection Probe)。此反射探针可应用纹理在虚拟物体上,这将大大提升了会反射的物体的视觉效果。

收集场景纹理的工作方式为:ARKit运行期间,世界跟踪和场景理解持续学习环境的更多信息。通过计算机视觉,其可提取信息并逐渐填充立方体贴图。只有立方体贴图填充完成,才可作为反射探针。为得到此完成的立方体贴图,你需要像360度全景扫描整个物理空间,但这对任何用户不实用,因而ARKit为了简化使用,通过高级的机器学习算法自动完成此立方体贴图的填充。需要注意的是,所有处理都是在你的设备上实时执行的。因而一旦有了一个完整填充的立方体,就可用于配置反射探针,之后只要虚拟物体放到场景中,就会开始反射环境光。以下是通过代码启用此特性:

// Environment Texturing
let configuration = ARWorldTrackingConfiguration()  
configuration.environmentTexturing = .automatic  
session.run(configuration)  

environment_texturing.png

使用环境纹理后对比如下:

environment_texturing_demo_1.png

environment_texturing_demo_2.png

ARSession会在后台自动执行环境纹理的收集,并以AREnvironmentProbeAnchor对象给到程序使用。AREnvironmentProbeAnchor是ARAnchor的扩展,因而其提供了位置与方向的transform,和一个使用Metal格式的纹理(MTLTexture)表示的立方体贴图,及立方体贴图的物理范围。

应注意的是,其与其它Anchor的生命周期相同,如ARPlaneAnchor或ARImageAnchor。此外,其完全集成进ARSCNView,若使用此View作渲染,则只需要在跟踪配置中启用此特性,其它的会自动处理。

你可以手动地将一个AREnvironmentProbeAnchor放在任意想要放的位置,或以任意方向摆放,可通过以下代码配置:

// Enable manual placement

configuration.environmentTexturing = .manual  

3. 图像跟踪(Image Tracking)

图像检测概述(Image Detection Recap)

iOS 11.3开始引入了图像跟踪作为世界跟踪的一部分。检测场景中的2D图像时,这些图像需要是静止且不被移动的,如电影海报或博物馆中的画作。一旦图像被检测到,ARKit会估量图像的位置与方向,之后可用于在你的渲染场景中触发一些AR内容。

图像跟踪被完全集成进世界跟踪,需要做的只是对一些属性进行配置就可以启用。

为了加载图片用于图像检测,可从文件或Xcode的Asset Catalog中加载,后者还会提供一个图像的检测质量信息。

虽然这功能已经很好,但从iOS 12开始提供了相对更做优的图像跟踪。

图像跟踪(Image Tracking)

图像跟踪是图像检测的扩展,其显著的优点是不要求图像静止,而是允许图像移动。 ARKit会以每秒60帧的帧率为每一帧提供位置与方向,且可同时跟踪多张图像。在iOS 12的ARKit2中引入的新的配置ARImageTrackingConfiguration进行图像跟踪。

其配置方式为通过文件或Asset Catalog加载到ARReferenceImage中作为ARWorldTrackingConfiguration的detectionImages属性,或ARImageTrackingConfiguration的trackingImages属性,并将配置交给ARSession运行。ARSession运行后,可在每次update方法回调中取得ARFrame。只要图片已被检测到,ARFrame中将包含ARImageAnchor。具体如下图所示:

image_tracking.png

open class ARImageAnchor : ARAnchor, ARTrackable {  
    public var isTracked: Bool { get }
    open var transform: simd_float4x4 { get }
    open var referenceImage: ARReferenceImage { get }
}

使用利于识别的图像(Using Good Images)

为了得到利于识别的图像,要求图像

  • 利于识别的图像:

    • 特征明显(Distinct features)
    • 细腻(Well textured)
    • 对比度好(Good contrast)
  • 不利于识别的图像:

    • 结构重复(Repetitive structures)
    • 色域一致(Uniform color regions)
    • 直方图窄(Narrow histogram)

以下是两种图的示例:

using_good_images_1.png

若被识别的图片导入到Asset Catalog中,将不需要自己检查,Xcode会自动给出警告,并提示原因,如下图所示:

using_good_images_2.png

配置图像跟踪(Configuration for Image Tracking)

加载完图像后,有两个配置可供选择:

  • ARWorldTrackingConfiguration
    • 在世界参照系中的图像锚点(Image anchors in world reference frame)
    • 被检测的图像可被跟踪(Detected images can be tracked)
  • ARImageTrackingConfiguration
    • 独立于世界跟踪(Independent from world tracking)
    • 为每一帧提供位置与方向(Position and orientation for every frame)

两种配置的使用示例如下:

// Create an image tracking configuration
let configuration = ARImageTrackingConfiguration()  
configuration.trackingImages = [catPhoto, dogPhoto, birdPhoto]  
configuration.maximumNumberOfTrackedImages = 2  
session.run(configuration)  
// Create a world tracking configuration
let configuration = ARWorldTrackingConfiguration()  
configuration.detectionImages = [catPhoto, dogPhoto, birdPhoto]  
configuration.maximumNumberOfTrackedImages = 2  
session.run(configuration)  

4. 物体检测(Object Detection)

物体检测(Object Detection)

物体检测可用于检测场景中已知的3D对象,并提供检测到的物体的位置与方向。当检测到特定物体时,可根据需要触发AR内容。

与图像检测相同的是,物体检测只适用于无法移动的静止物体,如博物馆的展品或特定玩具等;而与图像检测不同的是,物体检测需要先运行ARKit的iOS应用扫描此物体。Apple提供了开源且功能齐全的应用Scanning and detecting 3D objects用于物体的扫描。这些被扫描的物体需要有点特征,如纹理良好,硬且不反光。

物体跟踪已被完全集成到世界跟踪中,因而使用此特性时,只要设置ARWorldTrackingConfiguration的detectionObjects属性,即:

// Object Detection
let configuration = ARWorldTrackingConfiguration()  
configuration.detectionObjects = [ancientBust, clayPot]  
session.run(configuration)  

物体扫描的具体使用方法如图所示:

object_detection.png

启用物体检测后,若检测到场景中的物体,则每次更新的ARFrame中将包含ARObjectAnchor表示此物体。

open class ARObjectAnchor : ARAnchor {  
    open var transform: simd_float4x4 { get }
    open var referenceObject: ARReferenceObject { get }
}

物体扫描(Object Scanning)

已知的物体可通过Xcode的Asset catelog导入,而未知的物体在进行物体检测前,需要先对物体进行扫描,才可检测到。物体扫描时会收集场景中的信息。与平面检测类似的是,通过收集场景中的信息估算水平平面或垂直平面的位置,但这里获取的是3D对象的信息。为确定物体检测的区域,会生成transform, extent和center,以在物体周围形成立体边框,定义在其在场景中的位置。需要注意的是,扫描时,并不需要将扫描物体的每个面,如博物馆内部分靠墙的雕塑,可以不扫描无法扫描的背面。对扫描结果满意后,可通过extent的center调整物体的原点,但需要确保center始终在extent内部。扫描完成后将得到一个ARReferenceObject对象,此对象可序列化为文件(通常后缀名为.arobject),可在Asset Catelog中查看name,center和extent属性。

open class ARReferenceObject : NSObject, NSCopying, NSSecureCoding {  
    open var name: String?
    open var center: simd_float3 { get }
    open var extent: simd_float3 { get }
    open var rawFeaturePoints: ARPointCloud { get }
}

5. 人脸跟踪的提升(Face Tracking Enhancements)

人脸跟踪概述(Face Tracking Recap)

去年发布iPhone X的同时,ARKit也推出了健壮的人脸检测与跟踪,并以每秒60帧的帧速为每一帧提供面部的位置与方向。人脸跟踪的结果使用ARFaceAnchor表示。得到的pose可用于增强人脸效果,如增加面具,帽子或替换脸部素材。ARKit还以ARFaceGeometry的格式提供面部的三角形网格。

方向光的估测(Directional Light Estimation)

ARKit会提供方向光的估测,会将脸部作为光线探测(light probe),估算光线强度,方向及色温。对于对光线要求复杂的应用,ARKit还会收集整个场景中的光线情况,并提供球面谐波系数(Spherical harmonics coefficients),以进一步提升视觉效果。

融合变形概述(Blendshapes Recap)

ARKit可实时跟踪表情,支持识别超过50种以上特定的面部特征点(Blendshapes),Blendshapes使用0与1间的值表示对应面部特征点的活跃程度,其中1表示极度活跃,0表示不活跃,如张嘴时jawOpen系数接近1,闭嘴时则接近0。此特性对创建虚拟角色的动画非常有用(Animation of virtual character),可用于实现类似Animoji的效果。

人脸跟踪的提升(Face Tracking Enhancements)

视线跟踪(Gaze tracking)

gaze_tracking.png

open class ARFaceAnchor : ARTrackable {  
    open var leftEyeTransform: simd_float4x4 { get }
    open var rightEyeTransform: simd_float4x4 { get }
    open var lookAtPoint: simd_float3 { get }
}
支持舌头(Tongue support)

tongue_support.png

extension ARFaceAnchor.BlendShapeLocation {  
    public static let tongueOut: ARFaceAnchor.BlendShapeLocation
}

相关视频:

  • WWDC 2018

Creating Great AR Experiences Inside SwiftShot: Creating an AR Game Integrating Apps and Content with AR Quick Look Understanding ARKit Tracking and Detection What’s New in Safari and WebKit

  • WWDC 2017

Introducing ARKit: Augmented Reality for iOS

本文总阅读量