ARKit 2简介-世界地图

按照系列,第二部分介绍ARKit 2中的World Mapping 。系列的其余部分如下:

  1. 影像追踪
  2. 世界地图
  3. 物体扫描
  4. 视觉整合(即将推出)
  5. 金属和反射性表面(即将推出)

World Mapping是ARKit 2中一个了不起的新功能,它允许用户在以前的AR体验中保存的环境中进行保存和加载。

例如,您可以在后院的桌子周围移动,捕获尽可能多的东西,然后在桌子中间放一碗水果。 当天晚些时候,您可以将应用重新打开到同一张桌子。 该应用程序会自动检测到您之前保存的同一张桌子,然后重新加载之前的场景-在这种情况下,桌子上放着一碗水果。

物理3D映射

使用ARKit 2,您的应用程序将基本上能够以3D映射您的物理空间。 通过移动对象(如上表),您将为您的应用提供相同物理环境的多个视角。 这些观点通常称为锚点。

特征点

使用世界地图,您的设备还将扫描许多特征点,这些特征点将再次用于识别空间。 这些特征可以驻留在平面,拐角,点上,或者仅驻留在唯一的感兴趣的随机区域上。

分享经验

ARKit中的世界地图允许您与另一台设备共享地图,例如另一台具有ARKit 2(iOS 12或更高版本)的iPad或iPhone。 这样,您就可以进行实时交互并体验相同的事物,然后再次返回。 您还可以建立网络体验,并在诸如游戏之类的事物上同时互动。 Apple演示的一个示例(是开源的)是SwiftShot。 你可以在这里下载。

持久的AR体验

这样,您可以在关闭应用程序之前保存世界地图,然后在下次打开应用程序时将其加载。 如果在与保存时相同的物理空间中打开,则虚拟体验将继续。 一个示例用例是在墙上或桌子上加载并保存一个木板,该木板上有您需要记住的东西列表(非常乏味的示例,但无论如何)。 每次您在办公桌附近或与该板子在同一位置打开该应用程序时,它都会像从未离开过一样重新加载。

实例化和使用世界地图所需的主要方法是getCurrentWorldMap(completionHandler:) 。 这使您可以保存会话的世界地图。 然后,可以将其分配给配置的initialWorldMap属性,并使用run(_:options:)启动具有相同锚点和物理世界地图的另一个会话。

从会话对象中检索世界地图

 会议。  getCurrentWorldMap {worldMap,错误 
守卫 let worldMap = worldMap else {
showAlert(错误)
返回
} return worldMap
}

加载世界地图并运行配置

 让配置= ARWorldTrackingConfiguration () 
组态。 initialWorldMap = worldMap
会议。 运行 (配置)

保存/存档世界地图数据以保持持久性

要保存世界地图(通常在getCurrentWorldMap(completionHandler:)处理程序中),可以使用以下方法使用NSKeyedArchiver在本地将其存档:

  func saveWorldMap (_ worldMap:ARWorldMap,网址:URL) 抛出 { 
数据= 试试 NSKeyedArchiver .archivedData(withRootObject:worldMap,requiredSecureCoding: true
尝试 data.write(to:url)
}

加载以前保存的世界地图

在您的应用程序中要做的一件好事是,在尝试获取或保存当前世界地图之前,先尝试检索世界地图。

  func loadWorldMap来自 url:URL) 抛出 -> ARWorldMap { 
mapData =试试数据(contentsOf:url)
卫队 worldMap = 尝试 NSKeyedUnarchiver .unarchivedObject(of: ARWorldMap。classForKeyedUnarchiver (),来自:mapData)作为? ARWorldMap
否则 { 抛出 ARError (.invalidWorldMap)}
返回世界地图
}

通常,启动应用程序应遵循的良好流程是:

  1. 尝试使用loadWorldMap方法加载世界地图
  2. 如果未找到世界地图,则提示用户在房间中四处移动,以便应用程序可以使用getCurrentWorldMap方法获取世界地图。
  3. 检索到世界地图后,请使用saveWorldMap方法将其保存。

而已! 就像您使用ARKit在您的应用中创建了一个世界地图系统。 看到开发人员如何将其应用于自己的应用程序真的很酷。

玩得开心!