iOS ARKit 学习第一天

802 阅读14分钟

ARKit

集成iOS设备相机和运动功能,在您的应用程序或游戏中提供增强现实体验。

Overview

增强现实(AR)描述了从设备的相机向实时视图添加2D或3D元素的用户体验,使这些元素看起来像存在于现实世界中。ARKit结合了设备运动跟踪、相机场景捕捉、高级场景处理和显示便利性,以简化构建AR体验的任务。您可以使用前传或后传验证设备支持和用户权限使用这些技术创造多种增强现实体验

检查您的应用程序是否可以在iOS设备的runtime.a上使用ARKit并尊重用户隐私。

Essentials

验证设备支持和用户权限

检查您的应用程序是否可以在运行时使用ARKit并尊重用户隐私。

ARKit需要iOS 11.0或更高版本以及配备A9或更高版本处理器的iOS设备。某些ARKit功能需要更高版本的iOS或特定设备。ARKit还使用设备摄像头,因此您需要配置iOS隐私控制,以便用户可以允许您的应用程序访问相机。

如何处理设备兼容性支持取决于您的应用程序如何使用ARKit:

  • **如果您的应用程序的基本功能需要增强现实(使用后置摄像头):**在应用程序的“Info.plist”文件的[UIRequiredDeviceCapabilities](developer.apple.com/library/arc…

  • **如果增强现实是应用程序的次要功能:**通过测试相应ARConfiguration子类的isSupported属性,检查当前设备是否支持您想要使用的AR配置。

  • **如果您的应用程序使用面部跟踪AR:**面部跟踪需要iPhone X上的前置原深感摄像头。您的应用程序仍然可以在其他设备上使用,因此您必须测试ARFaceTrackingConfiguration.isSupported属性,以确定当前设备上的面部跟踪支持。

处理用户同意和隐私

要使您的应用程序使用ARKit,用户必须显式授予您的应用程序相机访问权限。当您的应用程序首次运行AR会话时,ARKit会自动征求用户的许可。

iOS要求您的应用程序提供静态信息,以便在系统请求相机或麦克风许可时显示。您的应用程序的“Info.plist”文件必须包含[NSCameraUsageDescription](developer.apple.com/library/arc…

如果您使用Xcode模板创建新的ARKit应用程序,将为您提供默认相机使用说明。

image.png

image.png

Setup

选择哪个相机来增强

通过前置或后置摄像头在增强现实体验中为用户环境添加视觉效果。

iOS设备配备了两个摄像头,对于每个ARKit会话,您需要选择要增强的相机。ARKit 3及更高版本同时提供来自两个相机的锚点(请参阅[组合用户面部跟踪和世界跟踪]()),但您仍然必须选择一个相机向用户显示。

使用后置摄像头增强现实

最常见的增强现实体验显示设备后置摄像头的视图,并辅之以其他视觉内容,为用户提供了一种查看和与周围世界互动的新方式。

ARWorldTrackingConfiguration提供这种体验:ARKit跟踪用户居住的真实世界,并将其与放置虚拟内容的坐标空间匹配。世界跟踪还提供了使AR体验更身临其境的功能,例如识别用户环境中的物体和图像并响应现实世界照明条件的能力。

前置摄像头增强现实

对于配备原深感摄像头的iOS设备,ARFaceTrackingConfiguration允许您增强前置摄像头馈送,同时为您提供面部姿势和表情的实时跟踪。例如,有了这些信息,您可以选择覆盖逼真的虚拟掩码。或者,您可以省略相机视图,并使用面部表情数据为虚拟字符添加动画效果,如iMessage的动话表情应用程序。

管理会话生命周期和跟踪质量

让用户随时了解当前的会话状态,并从中断中恢复。

世界跟踪AR会话使用一种名为视觉惯性里程测量的技术。此过程将运动传感器数据与相机图像的计算机视觉分析相结合,以跟踪设备在现实世界中的位置和方向,也称为pose,以ARCameratransform属性表示。为了获得最佳效果,世界跟踪需要具有视觉复杂性或可识别功能的一致的传感器数据和相机图像。

当您开始会话时,ARKit需要一些时间来收集足够的数据来精确建模设备姿势。在会话期间,影响世界跟踪质量的条件可能会发生变化。使用ARSessionObserver委托方法和ARCamera属性来跟踪这些更改。

AR会话的基本生命周期

下图显示了您开始运行AR会话时跟踪状态的变化。

image.png

运行新会话后,所提供的帧的跟踪状态是ARCamera.TrackingState.notAvailable,表示ARKit尚未收集足够的信息来估计设备的姿势。

几帧后,跟踪状态更改为ARCamera.TrackingState.limited(_:),表明设备姿势可用,但其准确性不确定。有限状态总是包括跟踪质量下降的原因;在这种情况下,会话仍然是ARCamera.TrackingState.Reason.initializing

短时间内,跟踪状态更改为ARCamera.TrackingState.normal,表明设备姿势准确,所有ARKit功能都可用。

为跟踪质量变化提供反馈

下图显示了因用户交互或环境变化而可能发生的跟踪状态变化。

image.png

当跟踪质量为ARCamera.TrackingState.limited(_:)时,依赖ARKit映射用户本地环境的功能不可用:

-飞机检测不会添加或更新飞机锚

-命中测试方法不提供结果

根据用户本地环境的变化或移动设备的用户,会话可以随时输入ARCamera.TrackingState.limited(_:)跟踪状态。例如,如果用户将设备指向空白墙,或房间里的灯熄灭,跟踪质量可能会因ARCamera.TrackingState.Reason.inufficientFeatures而降低。

使用关联的ARCamera.TrackingState.Reason值提供反馈,指导用户解决情况,以便跟踪状态可以返回ARCamera.TrackingState.normal

Recover from Session Interruptions

没有正在运行的ARSession,ARKit无法跟踪设备姿势。默认情况下,如果您的会话中断(例如,切换到其他应用程序),该会话中的任何虚拟内容都可能与现实世界环境不合时宜。

您可以使用重定位来尝试从中断中恢复。如果您从sessionShouldAttemptRelocalization(_:)方法返回true,ARKit将尝试将其中断前的用户环境知识与当前相机和传感器数据相协调。在此过程中,跟踪状态为ARCamera.TrackingState.limited(_:)(以ARCamera.TrackingState.Reason.relocalizing为原因)。如果成功,跟踪状态将在短时间内返回ARCamera.TrackingState.normal

image.png

要使重新定位成功,设备必须返回到会话中断时附近的位置和方向。如果这些条件从未发生(例如,如果设备已移动到完全不同的环境),会话将无限期地保持在ARCamera.TrackingState.Reason.relocalizing状态。

创建持久的增强现实体验

在iOS 12.0及更高版本中,ARWorldMap类存储ARKit用于恢复会话的信息。通过将世界地图保存到文件,您可以使用相同的重定位过程从短暂中断中恢复,也可以从早期会话中恢复,即使您的应用程序已重新启动。世界地图包含锚点,因此您也可以替换虚拟内容以匹配早期会话。

image.png

要允许用户在离开应用程序后返回同一AR会话,您可以在用户操作时显式保存世界地图,或在applicationDidEnterBackground(_:)中自动保存世界地图。仅当您的AR会话具有值得保存的状态时,才能保存世界地图——例如,如果用户放置了您想要记住其位置的虚拟对象,并且会话处于ARFrame.WorldMappingStatus.mapped状态(或在会话期间至少处于该状态一次)。

要重新定位到已保存的世界地图,请在运行会话时使用initialWorldMap属性。与从中断恢复时一样,会话以ARCamera.TrackingState.limited(_:)(ARCamera.TrackingState.Reason.relocalizing)跟踪状态开始。如果ARKit可以将世界地图与当前环境进行对账,则在短时间内,跟踪状态将变为ARCamera.TrackingState.normal,表明会话与录制的世界地图匹配。

从世界地图恢复的会话包括保存在该世界地图中的所有锚。如果您使用name属性来识别您放置锚点的虚拟对象,您可以参考恢复会话中的锚点来重新创建该虚拟内容。为确保正确放置此类内容,仅在会话的跟踪状态更改为ARCamera.TrackingState.normal后才显示它。

如果ARKit无法将录制的世界地图与当前环境对账(例如,如果设备与记录世界地图的地方完全不同),会话将无限期保持在ARCamera.TrackingState.Reason.relocalizing状态。为用户提供一种重新启动会话的方法,以防他们无法恢复会话。要放弃世界地图重定位,请在会话上再次调用run(_:options:),使用resetTracking选项和initialWorldMap为`nil'的配置。

使用Metal显示增强现实体验

在相机上控制应用程序虚拟内容的渲染。

ARKit包含视图类,可轻松显示SceneKit或SpriteKit的AR体验。但是,如果您改用Metal构建自己的渲染引擎,ARKit还提供使用自定义视图显示AR体验所需的所有支持。

image.png

在任何AR体验中,第一步是配置一个`ARSession'对象来管理相机捕获和运动处理。会话定义并维护设备居住的真实空间与您建模AR内容的虚拟空间之间的通信。要在自定义视图中显示您的增强现实体验,您需要:

1.从会话中检索视频帧和跟踪信息。

2.渲染这些帧图像作为您视图的背景。

3.使用跟踪信息在相机图像上定位和绘制AR内容。

从会话中获取视频帧和跟踪数据

创建和维护您自己的ARSession实例,并使用适合您想要支持的AR体验类型的会话配置运行它。会话从相机中捕捉视频,跟踪设备在建模的3D空间中的位置和方向,并提供ARFrame对象。每个此类对象都包含单个视频帧图像和从帧捕获的那一刻起的位置跟踪信息。

有两种方法可以访问AR会话生成的ARFrame对象,具体取决于您的应用程序是喜欢拉取还是推送设计模式。

如果您更喜欢控制帧计时(拉取设计模式),请在每次重新绘制视图内容时使用会话的currentFrame属性获取当前帧映像和跟踪信息。ARKit Xcode模板使用以下方法:

image.png

或者,如果您的应用程序设计倾向于推送模式,请实现session(_:didUpdate:)delegate方法,会话将为其捕获的每个视频帧调用一次(默认为每秒60帧)。

获取帧后,您需要绘制相机图像,并更新和渲染您的AR体验中包含的任何叠加内容。

绘制相机图像

每个ARFrame对象的capturedImage属性都包含从设备相机捕获的像素缓冲区。要将此图像绘制为自定义视图的背景,您需要从图像内容创建纹理,并提交使用这些纹理的GPU渲染命令。

像素缓冲区的内容以双平面YCbCr(也称为YUV)数据格式编码;要渲染图像,您需要将此像素数据转换为可绘制的RGB格式。对于使用Metal渲染,您可以在GPU着色器代码中最高效地执行此转换。使用CVMetalTextureCacheAPI从像素缓冲区创建两个金属纹理——缓冲区的亮度(Y)和色度(CbCr)平面各一个:

ARSession

管理与每次增强现实体验相关的主要任务的对象,如运动跟踪、相机直通和图像分析。

“ARSession”对象协调ARKit代表您执行的主要进程,以创建增强现实体验。这些过程包括从设备的运动感应硬件读取数据,控制设备的内置相机,并对捕获的相机图像进行图像分析。会话综合了所有这些结果,以便在设备居住的现实世界空间与您建模AR内容的虚拟空间之间建立对应关系。

创建会话

每个AR体验都需要一个“ARSession”。如果您实现自定义渲染器,则自行实例化会话。

let session = ARSession()
session.delegate = self

如果您使用标准渲染器之一(如ARViewARSCNViewARSKView)),渲染器将为您创建一个会话对象。当您想与应用程序的会话交互时,您可以在应用程序的渲染器上访问它。

let session = myView.session

运行会话

运行会话需要配置。ARConfiguration的子类决定了ARKit如何跟踪设备相对于现实世界的位置和运动,从而决定了您创建的AR体验类型。例如,ARWorldTrackingConfiguration允许您通过设备的后置摄像头增强用户对周围世界的视图。

image.png

image.png

image.png

image.png

image.png

[配置对象]()

配置您的增强现实会话以检测和跟踪特定类型的内容。

配置对象定义了ARKit如何设置和运行增强现实会话。虽然ARWorldTrackingConfiguration在后置摄像头体验中提供了最广泛的功能,但请谨慎启用其他选项。每个功能消耗设备能量和计算周期,因此为了最大限度地提高设备正常运行时间和性能,仅启用应用程序所需的世界跟踪功能。

通过禁用应用程序不需要的选项来采取主动措施。例如,当您不希望有人出现在现场时,不要为单用户体验打开人们的遮挡。如果另一个AR配置通过更简洁的功能集满足您的要求,请改用该配置。例如,如果您不需要用户面部跟踪、协作或场景重建,请使用`ARBodyTrackingConfiguration'而不是世界跟踪配置进行3D运动捕捉。

在发生低功耗或热事件时,优雅地降级AR体验。例如,如果您的应用程序可以在该有限容量下基本运行,则可以暂时从世界跟踪配置切换到位置跟踪配置(ARPositionalTrackingConfiguration),直到设备冷却。当您更改应用程序的配置体验时,请使用更新或新的配置调用run(with:)

配置对象定义了ARKit如何设置和运行增强现实会话。虽然ARWorldTrackingConfiguration在后置摄像头体验中提供了最广泛的功能,但请谨慎启用其他选项。每个功能消耗设备能量和计算周期,因此为了最大限度地提高设备正常运行时间和性能,仅启用应用程序所需的世界跟踪功能。

通过禁用应用程序不需要的选项来采取主动措施。例如,当您不希望有人出现在现场时,不要为单用户体验打开人们的遮挡。如果另一个AR配置通过更简洁的功能集满足您的要求,请改用该配置。例如,如果您不需要用户面部跟踪、协作或场景重建,请使用`ARBodyTrackingConfiguration'而不是世界跟踪配置进行3D运动捕捉。

在发生低功耗或热事件时,优雅地降级AR体验。例如,如果您的应用程序可以在该有限容量下基本运行,则可以暂时从世界跟踪配置切换到位置跟踪配置(ARPositionalTrackingConfiguration),直到设备冷却。当您更改应用程序的配置体验时,请使用更新或新的配置调用run(with:)

image.png

image.png