WWDC Quick Look 💓 By SwiftGGTeam
Discover ARKit 6

Discover ARKit 6

观看原视频

Highlight

ARKit 6 增加了 4K 30fps 视频、运行中高分辨率照片、HDR、底层 AVCaptureDevice 配置、稳定平面锚点、Motion Capture 改进和更多 Location Anchors 城市支持,让 AR App 能同时获得更高画质和更细的相机控制。


核心内容

AR App 一直要在画质、追踪和性能之间取舍。影视预览、虚拟制作和摄影测量需要更多像素;游戏和交互体验需要更高帧率;扫描和后期处理又希望拿到相机的原始信息。

ARKit 6 的更新集中在这个取舍上。它给高画质场景提供 4K 视频和高分辨率单帧照片,给高对比场景提供 HDR,给需要定制影像风格的 App 暴露 AVCaptureDevice,同时把平面锚点、人体追踪和地理锚点继续向前推进。

这场演讲不是只列 API。它先解释 ARKit 过去如何用 binning(像素合并)把相机图像降到 HD,以换取 60fps 和较低内存占用;再说明 ARKit 6 如何在新硬件上跳过这一步,让 App 直接使用 4K 画面。(02:25

对于开发者,关键判断很实际:如果 App 做影视、虚拟制作、Object Capture 或摄影,优先看新画质能力;如果 App 是游戏或依赖高刷新率的互动体验,HD 60fps 仍然可能更合适。(06:26


详细内容

4K 视频模式:为像素饥渴场景准备

04:10)ARKit 6 可以跳过 binning,直接使用 3840×2160 的图像区域,以 30fps 输出 4K 视频。RealityKit 仍会处理缩放、裁切和渲染;自己写 Metal renderer 的 App 可以继续从 ARSession.currentFrame.capturedImage 取得画面。

演讲提到,开启 4K 要先查询配置是否支持 4K video format,再把它赋给 configuration 并运行 session。(04:49)下面是根据逐字稿中 API 名称整理的最小调用方式:

let config = ARWorldTrackingConfiguration()

if let format = ARWorldTrackingConfiguration.recommendedVideoFormatFor4KResolution {
    config.videoFormat = format
}

session.run(config)

关键点:

  • ARWorldTrackingConfiguration() 创建世界追踪配置。
  • recommendedVideoFormatFor4KResolution 在设备和配置支持 4K 时返回 4K video format。
  • if let 处理不支持 4K 的设备;演讲说明不支持时会返回 nil
  • config.videoFormat = format 把 session 切到 4K 视频格式。
  • session.run(config) 用更新后的配置启动 AR session。

4K 模式适用于 iPhone 11 及更新机型,以及配备 M1 芯片的 iPad Pro。它的输出是 3840×2160、30fps。iPad 全屏显示时,因为 16:9 画面要裁切两侧,最终渲染可能看起来更放大。(05:25

使用 4K 时还有一个内存规则:不要长期持有 ARFrame。4K 帧占用更多内存,保留太久会阻止系统释放图像,可能造成渲染掉帧,最后让 ARCamera tracking state 退回 limited。可以通过 Console 警告检查是否持有了过多图像。(05:53

高分辨率背景照片:不中断 ARSession 拍单张照片

07:30)ARKit 6 允许 App 在 ARSession 运行期间按需请求一张高分辨率照片。视频流不会中断,也不需要另起一个 AVCaptureSession。在 iPhone 13 上,这张照片可以使用 wide camera 的完整 1200 万像素。

这对 Object Capture 很直接。App 可以用 AR 在真实物体上叠加拍摄引导,再在合适角度触发高分辨率照片,给摄影测量算法更好的输入。(09:06

先选择支持高分辨率捕获的视频格式:

if let hiResCaptureVideoFormat = ARWorldTrackingConfiguration.recommendedVideoFormatForHighResolutionFrameCapturing {
    // Assign the video format that supports hi-res capturing.
    config.videoFormat = hiResCaptureVideoFormat
}
// Run the session.
session.run(config)

关键点:

  • recommendedVideoFormatForHighResolutionFrameCapturing 查询支持高分辨率背景照片的 video format。
  • if let 避免在不支持该能力的设备上强行配置。
  • config.videoFormat = hiResCaptureVideoFormat 让当前配置使用支持 hi-res capture 的格式。
  • session.run(config) 启动或重启 session,让该格式生效。

当用户点击屏幕、扫描到目标角度或 App 的其他事件发生时,再触发单帧捕获:

session.captureHighResolutionFrame { (frame, error) in
   if let frame = frame {
      saveHiResImage(frame.capturedImage)
   }
}

关键点:

  • captureHighResolutionFrame 触发一次 out-of-band 高分辨率图像捕获。
  • completion handler 异步返回 ARFrameerror
  • if let frame = frame 确认捕获成功后再访问图像。
  • frame.capturedImage 是要保存或送入后续处理的高分辨率图像。
  • saveHiResImage 代表 App 自己的保存逻辑;真实项目里要尽快写盘或处理,避免长时间持有大图。

HDR:让高对比环境保留更多细节

11:22)HDR(High Dynamic Range,高动态范围)会捕获更宽的颜色范围,并映射到显示设备。演讲用后院画面对比说明:打开 HDR 后,暗部木栅栏和亮部云层能保留更多细节。

启用 HDR 要检查当前 video format 是否支持:

if (config.videoFormat.isVideoHDRSupported) {
    config.videoHDRAllowed = true
}
session.run(config)

关键点:

  • config.videoFormat.isVideoHDRSupported 查询当前 video format 是否支持 HDR。
  • 演讲说明当前只有 non-binned video formats 支持 HDR。
  • config.videoHDRAllowed = true 允许 ARKit 使用 HDR。
  • session.run(config) 用 HDR 设置运行 session。

HDR 会带来性能开销。只有在高对比环境或画质需求明确时才应该打开,例如户外建筑预览、影视分镜、需要保留天空和阴影细节的 AR 拍摄 App。(12:22

AVCaptureDevice:控制曝光、白平衡和对焦

12:29)有些 AR App 需要手动控制相机设置,例如曝光、白平衡或触发对焦事件。ARKit 6 让配置可以访问 primary camera 对应的底层 AVCaptureDevice

if let device = ARWorldTrackingConfiguration.configurableCaptureDeviceForPrimaryCamera {
   do {
      try device.lockForConfiguration()
      // configure AVCaptureDevice settings

      device.unlockForConfiguration()
   } catch {
      // error handling

   }
}

关键点:

  • configurableCaptureDeviceForPrimaryCamera 返回可配置的底层 AVCaptureDevice
  • if let device 处理设备或配置不支持直访相机的情况。
  • try device.lockForConfiguration() 在修改相机设置前加锁。
  • 注释位置可以配置曝光、白平衡等 AVCaptureDevice 设置。
  • device.unlockForConfiguration() 修改完成后释放配置锁。
  • catch 处理加锁或配置失败。

这里要克制。ARKit 的相机画面既是渲染背景,也是场景分析输入。强烈过曝之类的设置会影响 ARKit 分析场景,降低输出质量。(12:58

ARKit 6 还会在每个 ARFrame 暴露 EXIF tags。它们包含白平衡、曝光等信息,可以用于后期处理或记录拍摄条件。(13:29

Plane Anchors:锚点方向更稳定,几何变化进入 ARPlaneExtent

13:53)iOS 15 中,plane geometry 更新时,plane anchor 的 rotation 也会随之更新。这样会让依附在 anchor 上的可视化内容跟着旋转。

iOS 16 中,plane anchor 和 plane geometry 更新被解耦。平面可以继续扩展和更新几何,但 anchor rotation 保持不变。所有平面几何信息进入 ARPlaneExtent,其中 rotationOnYAxis 表示几何在 Y 轴上的旋转。(14:39

演讲给出的 RealityKit 可视化代码如下:

// 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

关键点:

  • ModelEntity 创建用于显示平面的实体。
  • .generatePlane(width:depth:) 根据 planeExtent.widthplaneExtent.height 生成平面 mesh。
  • materials: [material] 给这个平面指定材质。
  • Transform(pitch:yaw:roll:) 设置实体方向。
  • yaw: planeExtent.rotationOnYAxis 使用几何自己的 Y 轴旋转,而不再依赖 anchor rotation 变化。
  • planeEntity.transform.translation = planeAnchor.center 把实体移动到 plane anchor 的中心坐标。

每次平面更新时,都要重新考虑 width、height、center 和 rotationOnYAxis。要启用这个新行为,项目 deployment target 需要设为 iOS 16。(16:16

Motion Capture 和 Location Anchors:追踪范围继续扩大

16:34)Motion Capture 增加了 2D skeleton 的左耳和右耳 joint,并改善整体 pose detection。iPhone 12 及更新机型、最新 iPad Pro 和 M1 iPad Air 上,3D skeleton 抖动更少,时间一致性更好;人物被遮挡或靠近相机时追踪也更稳定。要使用这些改进,deployment target 需要设为 iOS 16。

17:29)Location Anchors 增加了更多地区。演讲列出的新增范围包括加拿大 Vancouver、Toronto、Montreal,Singapore,日本包括 Tokyo 在内的七个都会区,澳大利亚 Melbourne 和 Sydney;稍后还会支持 Auckland、Tel Aviv 和 Paris。

逐字稿给出的可用性检查入口是 ARGeoTrackingConfiguration.checkAvailability

ARGeoTrackingConfiguration.checkAvailability(at: coordinate) { available, error in
    if available {
        // Create ARGeoAnchor-based content at this coordinate.
    }
}

关键点:

  • checkAvailability(at:) 用于检查某个坐标是否支持 Location Anchors。
  • coordinate 是 App 想放置或验证地理 AR 内容的位置。
  • completion handler 返回该坐标的可用性。
  • available 为真时,再创建基于 ARGeoAnchor 的 AR 内容。
  • 这段是根据逐字稿描述整理的调用示例;具体错误处理和锚点创建要按项目需求补齐。

核心启发

  • 做一个 AR 取景复拍工具:让用户走到历史照片的拍摄位置,再用 AR 引导构图。ARKit 6 的高分辨率背景照片可以在 session 不停止的情况下保存高清照片;入口是 captureHighResolutionFrame

  • 做 Object Capture 拍摄向导:围绕真实物体显示角度、距离和漏拍提示。ARKit 负责叠加 3D UI,高分辨率照片给摄影测量提供更好的输入,再把结果交给 RealityKit 或 Object Capture 流程。

  • 做虚拟制作预览器:在现场用 4K AR 背景合成虚拟道具或场景。先查询 4K video format,再根据设备性能决定使用 4K 30fps 还是 HD 60fps。

  • 做可控影像风格的 AR 相机:通过 configurableCaptureDeviceForPrimaryCamera 调整曝光、白平衡或对焦事件。适合需要统一色调的品牌滤镜、展陈或影视类 AR App。

  • 做稳定的平面标注工具:利用 iOS 16 的 ARPlaneExtent 更新尺寸和旋转,让桌面、墙面或地面标注在平面扩展时不被 anchor rotation 带着乱转。


关联 Session

评论

GitHub Issues · utterances