WWDC Quick Look 💓 By SwiftGGTeam
Explore ARKit 5

Explore ARKit 5

观看原视频

Highlight

ARKit 5 扩展了位置锚点的支持区域、新增 App Clip Code 追踪、支持 iPad Pro 超广角前置摄像头的人脸追踪,并提升了动作捕捉的精度和距离范围。

核心内容

位置锚点:从室内走向户外

01:31

ARKit 4 引入的位置锚点(Location Anchors)让 AR 内容可以绑定到真实世界的经纬度坐标。这在室内 AR 已经很好用了,但户外场景才是它真正的舞台。ScavengAR 应用就用它创建了虚拟公共艺术装置,iOS 15 的地图应用也用它实现了 AR 步行导航。

今年位置锚点的支持区域从美国 5 个大都市扩展到了 25 个以上,还首次增加了美国以外的城市:伦敦。对于不在支持区域的开发者,ARKit 提供了录制和回放功能,可以用 Reality Composer 在户外录制场景数据,然后在 Xcode 中回放调试。

引导用户完成定位:GeoTracking Coaching Overlay

05:06

位置锚点需要设备在户外扫描建筑物立面来完成定位。这个过程中用户不知道该怎么操作,容易放弃。

ARKit 5 新增了 .geoTracking 目标的 ARCoachingOverlayView,它会显示动画引导用户将设备对准建筑物。这个 UI 和地图应用中的引导界面一致,用户已经有认知基础。开发者只需要设置 goal: .geoTracking 就能启用。

App Clip Code:AR 内容的精确入口

09:10

App Clip Code 去年随 App Clips 一起推出,用户扫码就能启动轻量应用。今年 ARKit 5 新增了对 App Clip Code 的追踪能力。

ARAppClipCodeAnchor 包含三个关键属性:嵌入的 URL、解码状态(.decoding / .decoded / .failed)和码的物理半径。解码 URL 需要时间,开发者可以在解码过程中显示占位内容,给用户即时反馈。

Primer 应用展示了实际用法:用户扫描瓷砖样品上的 App Clip Code,App Clip 启动后直接在墙上预览该瓷砖的 AR 效果,无需下载完整应用。

人脸追踪:超广角视野

17:29

新款 iPad Pro 配备了超广角前置摄像头,视野比普通前置摄像头大很多。ARKit 5 支持在这颗摄像头上运行人脸追踪,但需要开发者主动选择。

通过遍历 supportedVideoFormats,检查 captureDeviceType 是否为 .builtInUltraWideCamera,然后将选中的格式设置到 ARFaceTrackingConfiguration 上即可启用。注意超广角摄像头不提供深度数据,capturedDepthData 会为空。

动作捕捉:更远的距离和更大的动作范围

18:59

在 A14 芯片设备(如 iPhone 12)上,ARKit 5 的动作捕捉支持更宽的身体姿态范围。旋转精度更高,适合追踪运动动作。摄像头可以从更远的距离追踪身体关节,肢体活动的追踪范围也大幅增加。这些改进不需要修改代码,iOS 15 上的所有动作捕捉应用自动受益。

详细内容

检查位置锚点支持并创建 GeoTracking 会话

import ARKit
import CoreLocation

func startGeoTrackingSession() {
    // 检查设备是否支持
    guard ARGeoTrackingConfiguration.isSupported else {
        print("Geo tracking requires A12+ with cellular and GPS")
        return
    }

    // 检查当前位置是否可用
    ARGeoTrackingConfiguration.checkAvailability { available, error in
        guard available else {
            print("Geo tracking not available at this location")
            return
        }

        let configuration = ARGeoTrackingConfiguration()
        let session = ARSession()
        session.delegate = self
        session.run(configuration)
    }
}

// 添加位置锚点
func addGeoAnchor(at coordinate: CLLocationCoordinate2D, altitude: CLLocationDistance? = nil) {
    let geoAnchor: ARGeoAnchor
    if let altitude = altitude {
        geoAnchor = ARGeoAnchor(coordinate: coordinate, altitude: altitude)
    } else {
        geoAnchor = ARGeoAnchor(coordinate: coordinate)
    }
    session.add(anchor: geoAnchor)
}

关键点:

  • ARGeoTrackingConfiguration.isSupported 检查设备硬件条件(A12+、蜂窝网络、GPS)
  • checkAvailability 异步检查当前地理位置是否在支持区域内
  • ARGeoAnchor 可以用经纬度创建,也可以额外指定海拔高度
  • 添加锚点时设备距离目标位置应在 50 米以内,以获得更精确的高度数据

使用 GeoTracking Coaching Overlay

import ARKit
import UIKit

class ViewController: UIViewController, ARSessionDelegate {
    @IBOutlet var arView: ARView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let coachingOverlay = ARCoachingOverlayView()
        coachingOverlay.session = arView.session
        coachingOverlay.goal = .geoTracking
        coachingOverlay.translatesAutoresizingMaskIntoConstraints = false
        arView.addSubview(coachingOverlay)

        NSLayoutConstraint.activate([
            coachingOverlay.leadingAnchor.constraint(equalTo: arView.leadingAnchor),
            coachingOverlay.trailingAnchor.constraint(equalTo: arView.trailingAnchor),
            coachingOverlay.topAnchor.constraint(equalTo: arView.topAnchor),
            coachingOverlay.bottomAnchor.constraint(equalTo: arView.bottomAnchor)
        ])
    }
}

关键点:

  • ARCoachingOverlayViewgoal 设为 .geoTracking 会显示针对位置锚点的引导动画
  • 引导完成后 overlay 自动消失,应用可以开始放置 AR 内容
  • 建议同时监听 session(_:didChange:) 中的 geo tracking 状态,获取更详细的定位信息

追踪 App Clip Code

import ARKit

class ViewController: UIViewController, ARSessionDelegate {
    var session: ARSession!

    func startAppClipCodeTracking() {
        guard ARAppClipCodeAnchor.isSupported else {
            print("App Clip Code tracking requires A12+")
            return
        }

        let configuration = ARWorldTrackingConfiguration()
        configuration.appClipCodeTrackingEnabled = true
        session.run(configuration)
    }

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        for anchor in anchors.compactMap({ $0 as? ARAppClipCodeAnchor }) {
            switch anchor.urlDecodingState {
            case .decoding:
                // 显示占位内容,提示用户正在解码
                showPlaceholder(at: anchor)
            case .decoded:
                // URL 解码成功,加载对应内容
                if let url = anchor.url {
                    loadContent(for: url, at: anchor)
                }
            case .failed:
                // 解码失败,提示用户
                showDecodingError(at: anchor)
            @unknown default:
                break
            }
        }
    }
}

关键点:

  • ARAppClipCodeAnchor.isSupported 检查设备是否支持(A12+)
  • appClipCodeTrackingEnabled 必须在配置中显式开启
  • 解码状态分三种:.decoding(正在解码)、.decoded(成功)、.failed(失败)
  • anchor.radius 提供码的物理半径,可用于精确放置内容

启用 iPad Pro 超广角人脸追踪

import ARKit

func enableUltraWideFaceTracking() -> ARFaceTrackingConfiguration? {
    guard ARFaceTrackingConfiguration.isSupported else { return nil }

    let configuration = ARFaceTrackingConfiguration()

    // 查找超广角摄像头格式
    for format in ARFaceTrackingConfiguration.supportedVideoFormats {
        if format.captureDeviceType == .builtInUltraWideCamera {
            configuration.videoFormat = format
            break
        }
    }

    return configuration
}

关键点:

  • 超广角格式需要主动遍历 supportedVideoFormats 查找
  • 设置 videoFormat 后运行会话即可启用超广角人脸追踪
  • 超广角模式下没有深度数据,依赖深度数据的功能需要回退到普通前置摄像头

核心启发

  1. 做什么:在城市景点或商业区部署基于位置的 AR 导览 为什么值得做:位置锚点让 AR 内容精确绑定到真实地理坐标,用户走到特定位置自动触发内容 怎么开始:用 ARGeoTrackingConfiguration 创建会话,通过 ARGeoAnchor 在目标位置放置虚拟内容

  2. 做什么:为零售商品添加 App Clip Code,实现扫码即看 AR 效果 为什么值得做:用户无需下载完整应用,扫码就能预览家具、瓷砖、装饰品在自己空间中的效果 怎么开始:在商品包装上印刷 App Clip Code,App Clip 中启用 appClipCodeTrackingEnabled,扫描后加载对应 3D 模型

  3. 做什么:开发一款舞蹈或健身教学 App,实时评估用户动作 为什么值得做:ARKit 5 的动作捕捉支持更远距离和更大动作范围,适合家庭健身场景 怎么开始:使用 ARBodyTrackingConfiguration,从 ARFrame 中提取 skeleton3D,计算关节角度并与标准动作比对

  4. 做什么:在 iPad Pro 上构建多人 AR 面具或表情应用 为什么值得做:超广角前置摄像头可以容纳更多人的面部,适合多人互动场景 怎么开始:选择 .builtInUltraWideCamera 格式启动人脸追踪,为检测到的每个 ARFaceAnchor 叠加虚拟内容

关联 Session

评论

GitHub Issues · utterances