欢迎参加“探索 ARKit 6”课程。您将学习如何利用苹果增强现实框架中的最新进展。我们很高兴看到开发者在过去几年里使用ARKit创建了什么。我们在室内设计、旅行、虚拟展览、游戏等许多方面看到了一些令人惊叹的应用程序。苹果的 Apple 团队密切关注您的反馈,苹果已将很多反馈纳入 ARKit 6。让我们看看。。苹果正在引入一种新的4K视频模式,允许您以迄今为止最高的图像分辨率运行相机流。之后,我将谈谈苹果所做的一些额外的相机增强功能,这些增强功能可以让您更好地控制视频背景。苹果还更新了平面锚的行为,添加了Motion Capture API,并最终分享了支持位置锚点的新城市。
让我们从4K视频开始。在过去几年里,我们看到对高分辨率内容的需求很大,特别是那些利用增强现实功能进行电影制作的应用程序,一直渴望更多的像素。让我向您展示如何为ARKit捕获和处理图像。例如iPhone 13 Pro的摄像头模块。如果我们打开它,我们可以看到它的设置。让我们谈谈广角和超广角相机。这两台相机都可用于不同的计算机视觉任务,例如世界跟踪、运动捕捉或人员分割。广角摄像头在我们心中占有特殊的位置,因为它为渲染背景提供图像。了解图像如何处理渲染很重要,所以让我放大到传感器级别。
在为ARKit捕获图像时,我们使用大部分图像传感器。更准确地说,在这个特定型号上,它的面积为3840x2880像素。捕获后,我们使用一个名为binning的过程。它的工作原理如下:Binning取2x2像素的区域,平均像素值,并回写单个像素。这有两个显著的优势。首先,图像尺寸缩小了两倍,在这种情况下,它会缩小到1920x1440像素。因此,每个帧消耗的内存和处理能力都少得多。这允许设备以高达每秒60帧的速度运行相机,并释放资源进行渲染。其次,该过程在低光环境中提供了优势,其中像素值的平均值减少了传感器噪声的影响。
我们最终有一个相机流,大约每17毫秒提供一次高清分辨率的图像。在将当前帧用于各种计算机视觉任务后,ARKit会显示当前帧进行渲染。如果您正在编写自己的Metal渲染器,您可以通过ARSession的currentFrame.capturedImage访问它。
如果您使用的是RealityKit,则会自动进一步处理图像以用作背景。它在设备上缩放以匹配2532像素的屏幕宽度,并裁剪以匹配显示宽高比。RealityKit执行在框架顶部渲染和合成虚拟内容(如这艘盗版船)的任务,并在屏幕上显示最终结果。现在,凭借我们最新硬件的强大功能,我们在ARKit中启用了完整的4K视频模式。您的应用程序现在可以跳过绑定步骤并以全4K分辨率直接访问它,从而利用更高分辨率的图像。在4K模式下,使用3840x2160像素的图像区域,您可以以每秒30帧的速度拍摄视频。除了这些更改外,您的应用程序将以与以前相同的方式工作。如果您使用RealityKit,它会为您执行缩放、裁剪和渲染。
您可以通过几个简单的步骤启用4K模式。让我们看看,这在代码中可以是这样的。
if let hiResCaptureVideoFormat = ARWorldTrackingConfiguration.recommendedVideoFormatForHighResolutionFrameCapturing {
// Assign the video format that supports hi-res capturing.
config.videoFormat = hiResCaptureVideoFormat
}
// Run the session.
session.run(config)
“ARConfiguration”具有新的便利功能“推荐VideoFormatFor 4KResolution”,如果您的设备上支持该模式,则返回4K视频格式。如果设备或配置不支持4K,此功能将返回零。然后,您可以将此视频格式分配给您的配置,然后使用调整后的配置运行会话。
4K视频模式适用于iPhone 11及更新机型以及任何配备M1芯片的iPad Pro。分辨率为3840x2160像素,每秒30帧。iPad的宽高比为16:9,这意味着图像必须在两侧裁剪以进行全屏显示,最终渲染可能会放大。
在使用ARKit时,特别是在新的4K分辨率下,请务必遵循一些最佳实践以获得最佳效果。不要在ARFrame上持续太久。这可能会阻止系统释放内存,这可能会进一步阻止ARKit向您铺设较新的帧。这将通过渲染中的帧下降变得可见。最终,ARCamera的跟踪状态可能会回落到有限的状态。检查控制台将会产生警告,以确保您在任何给定时间都不会保留太多的图像。还要考虑新的4K视频格式是否确实是您应用程序的正确选择。高分辨率视频的应用程序将是最大的受益者,诸如视频、电影制作和虚拟制作应用程序。处理高分辨率图像需要额外的系统资源,因此对于依赖高刷新率的游戏和其他应用程序,我们仍然建议以每秒60帧的速度使用全高清视频。
除了新的4K模式外,还有一些额外的增强功能,允许您更好地控制相机。我将首先介绍高分辨率背景照片API,并展示如何启用新的HDR模式。此外,我将演示如何访问底层AVCaptureDevice以获得更精细的粒度控制,并向您展示如何在ARKit中读取EXIF标签。让我们跳转到新的高分辨率背景照片API。
在运行ARSession时,您仍然可以像往常一样访问视频流。此外,当视频流不间断运行时,ARKit允许您请求在后台按需拍摄单个照片。这些单相框充分利用了您的相机传感器。在iPhone 13上,意味着广角摄像头的全1200万像素。在准备WWDC时,我们在ARKit对摄影应用程序有一个有趣的想法,该应用程序突出了这个新API可以帮助您创建的内容。在我们的示例中,我们将您带回2016年4月1日,当时著名的海盗旗在苹果无限环路校园上空飘扬。我问原始摄影师汤米,六年前他到底在哪里拍的那张照片。
基于这个坐标,我们可以创建一个位置锚,引导您到汤米在2016年4月站的位置,如大蓝点所示。到达那个地方后,它通过显示焦点正方形来帮助你框定完美的图片。最后,该应用程序允许您通过点击屏幕来拍照。该照片可以在当前ARKit会话运行期间以原生相机分辨率拍摄,而无需旋转另一个AVCapture会话。我们很高兴看到您拥有哪些想法结合了AR和摄影的力量。另一个将从此API中受益的用例是使用对象捕获创建3D模型。
对象捕获拍摄真实世界物体的照片,比如这款跑鞋,并使用我们最新的摄影测量算法,将它们变成一个3D模型,准备部署到您的AR应用程序中。使用ARKit,您可以将3D UI叠加在物理对象上,并提供更好的捕获指导。现在,有了新的高分辨率背景图像API,您可以拍摄物体的高分辨率照片,并创建更逼真的3D模型。我是摄影测量的忠实粉丝,所以我强烈建议您查看今年的“将您的世界带入增强现实”课程。让我向您展示如何在代码中启用高分辨率照片捕获。
首先,我们检查支持hiResCapture的视频格式。我们可以为此使用方便功能“推荐的VideoFormatForHighResolution FrameCapturing”。在确保支持该格式后,我们可以设置新的视频格式并运行会话。我们还必须告诉ARKit何时捕获高分辨率图像。在我们之前的示例中,照片的拍摄是通过点击屏幕触发的。在您自己的应用程序中,您可能希望对触发高分辨率帧捕获的不同事件做出反应。这真的取决于你的特例。ARSession有一个名为captureHighResolutionFrame的新功能。调用此函数会触发高分辨率图像的带外捕获。您可以在完成处理程序中异步访问包含高分辨率图像和所有其他帧属性的ARFrame。在访问其内容之前,您应该检查帧捕获是否成功。
if (config.videoFormat.isVideoHDRSupported) {
config.videoHDRAllowed = true
}
session.run(config)
在本例中,我们将帧存储到磁盘中。还要记住我之前提到的我们在图像保留方面的最佳做法,特别是因为这些图像使用图像传感器的全分辨率。接下来,我们来谈谈HDR。高动态范围可以捕获更广泛的颜色,并将这些颜色映射到您的显示器。这在对比度高的环境中最为明显。这是我后院的一个很好的例子。这个场景的特点是非常黑暗的区域——例如木栅栏上——和一些非常明亮的区域,如天空中的云彩。打开HDR模式时,如右侧,您可以看到这些区域的详细信息,如云端的蓬松,在HDR中保存得更好。让我们看看如何在代码中打开HDR。您可以通过其“isVideoHDRSupported”属性查询任何视频格式是否支持HDR。目前,只有非绑定视频格式支持HDR。如果支持HDR,请将配置中的videoHDRAllowed设置为true,并使用该配置运行会话。打开HDR将产生性能影响,因此请确保仅在需要时使用它。
如果您更喜欢手动控制曝光或白平衡等设置,现在可以方便地直接访问AVCaptureDevice并更改其任何设置。
if let device = ARWorldTrackingConfiguration.configurableCaptureDeviceForPrimaryCamera {
do {
try device.lockForConfiguration()
// configure AVCaptureDevice settings
…
device.unlockForConfiguration()
} catch {
// error handling
…
}
}
在我们的代码示例中,调用配置的“configurableCaptureDevice ForPrimaryCamera”,以访问底层的“AVCaptureDevice”。使用此功能为您的ARKit应用程序创建自定义外观,但请记住,图像不仅用作渲染背景,而且ARKit还积极用于分析场景。因此,任何变化,如强烈过度曝光,都可能对ARKit的输出质量产生负面影响。您还可以执行一些高级操作,例如触发焦点事件。有关如何配置AVCaptureSessions的更多信息,请参阅 developer.apple.com 上的 AVCapture 文档。最后,ARKit会向您的应用程序公开EXIF标签。它们现在可以与每个ARFrame一起使用。EXIF标签包含有关白平衡、曝光和其他对后处理有价值的设置的有用信息。图像捕获管道的所有更新到此结束。让我们看看我们对飞机锚有什么变化。
自第一个版本的ARKit以来,飞机锚一直是一项受欢迎的功能。你们中的许多人表示,需要更清洁地分离平面锚和底层平面几何形状。因此,我们正在宣布关于平面锚的行为和平面几何形状的更新。这是iOS 15中典型平面锚的一个例子。在AR会话开始时,它适合桌子上这个质地良好的笔记本。在运行会话时,平面会逐渐更新,以考虑表中出现的新部分。每次更新平面几何形状时,锚旋转也会更新,以反映平面的新方向。在iOS 16中,我们引入了平面锚及其平面几何形状之间的更干净的分离。
平面锚点和几何更新现已完全解耦。当平面随着完整表格的出现而扩展和更新其几何形状时,锚旋转本身保持不变。
与左侧的旧行为形成对比时,您可以看到iOS 16中的平面锚在整个AR会话中一直保持相同的方向,与笔记本对齐。
有关平面几何的所有信息现在都包含在一个名为ARPlaneExtent的类中。旋转更新不再通过旋转平面锚本身来表达。相反,ARPlaneExtent包含一个新的属性,旋转OnYAxis,表示旋转角度。除了这个新属性外,平面完全由宽度和高度以及PlaneAnchor的中心坐标定义。让我向您展示如何在代码中创建此平面可视化。
// Create a model entity sized to the plane's extent.
let planeEntity = ModelEntity(
mesh: .generatePlane (
width: planeExtent.width,
depth: planeExtent.height),
materials: [material])
// Orient the entity.
planeEntity.transform = Transform(
pitch: 0,
yaw: planeExtent.rotationOnYAxis,
roll: 0)
// Center the entity on the plane.
planeEntity.transform.translation = planeAnchor.center
首先,我们根据指定的宽度和高度生成一个基于平面网格的实体。然后,我们根据y轴上的旋转设置实体变换,并用中心属性的值抵消它。每次更新平面时,我们都必须考虑到宽度、高度和中心坐标以及新的旋转OnYAxis可能会发生变化。要利用这一新行为,请在 Xcode 设置中将部署目标设置为 iOS 16。下一次更新是在MotionCapture上,我们的机器学习策划人努力做出进一步改进。有一整套更新,包括2D骨架和3D关节。对于二维骨架,我们正在跟踪两个新的关节:左耳和右耳。我们还改进了整体姿势检测。在iPhone 12及更新机型上,以及在配备M1芯片的最新iPad Pro和iPad Air机型上,红色显示的3D骨架得到了改进。您将体验到更少的抖动,整体时间一致性会更高。如果部分人被遮挡或靠近相机时,跟踪也会更稳定。要使用改进的MotionCapture,请在Xcode设置中将部署目标设置为iOS 16。接下来,我还想宣布支持LocationAnchors的新城市和国家。作为一个小提醒,Apple Maps使用LocationAnchor API为其行人步行说明提供动力。在这个例子中,你可以看到,由于LocationAnchors的力量,它可以带你穿过伦敦的街道。LocationAnchors已经在美国和英国伦敦越来越多的城市可用。从今天开始,它们将在加拿大温哥华、多伦多和蒙特利尔等城市提供。我们还在新加坡和包括东京在内的日本七个大都市地区启用了它们。以及澳大利亚墨尔本和悉尼。今年晚些时候,我们将在新西兰奥克兰、以色列特拉维夫和法国巴黎提供它们。如果您想知道特定坐标是否支持LocationAnchors,只需使用ARGEoTrackingConfiguration的checkAvailability方法。
这些都是对ARKit 6的更新。总而言之,我介绍了如何以新的4K视频格式运行ARKit。对于高级用例,我演示了如何启用HDR或手动控制AVCaptureDevice。对于更多像素饥饿的应用程序,我演示了如何从ARKit会话中获取高分辨率照片。我们讨论了飞机锚的新行为,我介绍了MotionCapture的新耳关节和其他改进。您还了解了今年晚些时候将在哪些国家/地区提供 LocationAnchors。