WWDC Quick Look 💓 By SwiftGGTeam
Explore enhancements to visionOS object tracking

Explore enhancements to visionOS object tracking

观看原视频

Highlight

visionOS 27 的对象追踪支持高帧率追踪动态手持物体、度量空间坐标和 iOS 跨平台运行;同时开放第三方空间配件标准(LED + IMU + 蓝牙),让开发者可以自建带按钮和触觉反馈的物理交互外设。

核心内容

从静态摆件到手持工具

visionOS 2.0 的对象追踪(Object Tracking)有个硬伤:它只能追踪放在桌上的静态物体。手一拿起来,或者物体快速移动,追踪就丢了。

02:22)visionOS 27 加入了高帧率追踪(High Frame Rate Tracking)。配合 Create ML 的扩展训练模式(Extended Training Mode),系统能更稳定地追踪手持物体的运动轨迹。

演讲里举了一个医疗探针的例子:医生手持探针在脊柱模型上移动,系统能实时计算椎骨之间的距离。这类场景以前根本做不了,因为手会遮挡物体的一部分,静态追踪模式下很快就会丢失目标。

度量空间坐标:从”看着对齐”到”测得准确”

05:04)对象追踪在 visionOS 2.0 里有个隐藏问题:返回的坐标经过了显示校正(Display Correction)。苹果为了让虚拟内容在头显里看起来和物理物体对齐,对坐标做了微调。这个微调对渲染 UI 没有影响,但对物理测量是致命的。

visionOS 27 新增了 Coordinate Space Correction API。开发者可以选择两种坐标:

  • .rendered:带显示校正,适合渲染虚拟内容
  • .none:纯度量空间坐标,适合物理测量

这个区分让对象追踪从”视觉对齐工具”变成了”精密测量工具”。

对象追踪来到 iOS

05:53)今年对象追踪 API 正式登陆 iOS。训练好的 .referenceobject 文件在 iOS 和 visionOS 之间通用,同一套模型可以跨平台复用。

iOS 上的 API 和 visionOS 基本一致:加载参考对象、配置 ARWorldTrackingConfiguration、处理 ARObjectAnchor 的生命周期回调。

第三方空间配件:从消费到创造

07:25)visionOS 26 只支持官方认证的空间配件(Logitech Muse、PSVR2 Sense 手柄)。visionOS 27 彻底开放了标准。

任何满足以下三个条件的电子设备都可以成为空间配件:

  • LED 星座阵列(供 Vision Pro 的摄像头追踪)
  • IMU(惯性测量单元,提供方向和加速度)
  • 蓝牙芯片(与 Vision Pro 通信)

空间配件的追踪频率可以达到显示刷新率,延迟极低,而且被手短暂遮挡时仍能持续追踪。配件还可以搭载物理按钮和触觉马达,让交互更真实。

演讲里演示了一个方向盘配件:把空间配件装在物理方向盘内部,数字车辆就能和方向盘精确对齐。握住方向盘时,用户会感觉自己真的坐在车里。

详细内容

开启高帧率追踪

03:50)高帧率追踪用针代替全局开关,对单个参考对象的配置。

// 创建参考对象配置
var configuration = ReferenceObject.Configuration()
configuration.highFrameRateTrackingEnabled = true

// 加载参考对象时传入配置
let refObjURL = Bundle.main.url(forResource: "flashlight", withExtension: ".referenceobject")!
let refObject = try? await ReferenceObject(from: refObjURL, configuration: configuration)

关键点:

  • ReferenceObject.Configuration() 是 ARKit 在 visionOS 上新增的 API
  • highFrameRateTrackingEnabled 按对象配置,不同对象可以有不同的追踪策略
  • 这个配置在运行时决定,不需要重新训练模型

扩展训练模式

04:50)Create ML 新增了扩展训练模式,提升手持物体的追踪精度和鲁棒性。

命令行训练方式:

% xrun createml objecttracker \
    --source flashlight.usdz \
    --output flashlight.referenceobject \
    --training-mode extended \
    --all-angles

关键点:

  • --training-mode extended 启用扩展训练,耗时比标准模式长很多
  • 扩展训练模式建议和高帧率追踪配合使用
  • 命令行方式支持在远程机器上训练
  • --all-angles 表示从所有角度训练

度量空间坐标

05:25coordinateSpace(correction:) API 让开发者选择坐标精度策略。

// 获取带显示校正的坐标,用于渲染虚拟内容
let renderingPose = myObjectAnchor.coordinateSpace(correction: .rendered)

// 获取纯度量空间坐标,用于物理测量
let metricPose = myObjectAnchor.coordinateSpace(correction: .none)

关键点:

  • .rendered 返回的坐标经过显示校正,虚拟内容会和物理物体视觉上对齐
  • .none 返回物理世界的绝对坐标,不受任何显示校正影响
  • 医疗探针测量、工业检测等场景必须用 .none
  • 不要把 .none 的坐标直接用于渲染,会出现视觉错位

iOS 上的对象追踪

06:22)iOS 27 的 ARKit 完整支持对象追踪。

import ARKit
import RealityKit

class ObjectTrackingARSessionDelegate: NSObject, ARSessionDelegate {
    let arView = ARView(frame: .zero)
    var entities: [UUID: AnchorEntity] = [:]

    func start() throws {
        let stationaryObject = try ARReferenceObject(archiveURL:
            Bundle.main.url(forResource: "stationary", withExtension: "referenceobject")!)
        let movingObject = try ARReferenceObject(archiveURL:
            Bundle.main.url(forResource: "moving", withExtension: "referenceobject")!)

        let configuration = ARWorldTrackingConfiguration()
        configuration.detectionObjects = [stationaryObject]   // 低帧率,静态物体
        configuration.trackingObjects = [movingObject]        // 高帧率,动态物体

        arView.session.delegate = self
        arView.session.run(configuration)
    }

    func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        for case let anchor as ARObjectAnchor in anchors {
            let entity = AnchorEntity(anchor: anchor)
            entities[anchor.identifier] = entity
            arView.scene.addAnchor(entity)
        }
    }

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        for case let anchor as ARObjectAnchor in anchors {
            entities[anchor.identifier]?.isEnabled = anchor.isTracked
        }
    }

    func session(_ session: ARSession, didRemove anchors: [ARAnchor]) {
        for case let anchor as ARObjectAnchor in anchors {
            if let entity = entities.removeValue(forKey: anchor.identifier) {
                arView.scene.removeAnchor(entity)
            }
        }
    }
}

关键点:

  • ARReferenceObject 和 visionOS 的 ReferenceObject 使用相同的 .referenceobject 文件
  • detectionObjects 用于 mostly stationary 的物体,追踪频率较低
  • trackingObjects 用于移动物体,启用高帧率追踪
  • didAdd / didUpdate / didRemove 三个回调管理锚点的完整生命周期
  • anchor.isTracked 控制实体是否可见,追踪丢失时自动隐藏

发现并连接空间配件

12:26)空间配件通过 GameController 框架发现和连接。

import ARKit
import GameController

// 发现已配对的空间配件
if let device = GCSpatialAccessory.spatialAccessories.first {

    // ARKit 自动解析 .referenceaccessory bundle
    let accessory = try await Accessory(device: device)
    let provider = AccessoryTrackingProvider(accessories: [accessory])
    try await arkitSession.run([provider])
}

// 运行时热插拔,无需重启 session
try await provider.updateAccessories([newAccessory])

关键点:

  • GCSpatialAccessory.spatialAccessories 返回所有已配对的空间配件
  • Accessory(device:) 会自动解析设备中的 .referenceaccessory 文件
  • AccessoryTrackingProvider 和对象追踪的 provider 用法类似
  • updateAccessories 支持运行时切换配件,不会中断追踪 session
  • 配件制造商需要在 Info.plist 中把 .referenceaccessory 声明为 exported UTType
  • 第三方开发者可以把配件文件声明为 imported UTType,让 App 独立运行

核心启发

1. 手持医疗测量工具

做什么:做一个骨科手术训练 App,让医生手持追踪探针在骨骼模型上练习钻孔定位。

为什么值得做:高帧率追踪 + 度量空间坐标让手持工具的毫米级定位成为可能。以前只有固定台上的手术导航能做到这个精度。

怎么开始:用 Create ML 的 extended 模式训练探针的 reference object,开启 highFrameRateTrackingEnabled,用 coordinateSpace(correction: .none) 获取真实物理坐标计算距离。

2. 沉浸式赛车模拟器

做什么:把空间配件装在真实方向盘里,让数字赛车和物理方向盘完全同步转动。

为什么值得做:空间配件的追踪频率达到显示刷新率,延迟极低,而且支持物理按钮和触觉反馈。这比纯视觉追踪的方向盘体验好得多。

怎么开始:用 DFRobot 或 MIKROE 的现成硬件套件组装第一个原型,通过 GCSpatialAccessory 发现连接,用 AccessoryTrackingProvider 追踪位置。

3. 工业装配引导系统

做什么:在工厂流水线上,用对象追踪识别零件并叠加装配步骤提示。

为什么值得做:对象追踪来到 iOS 后,同一套 reference object 可以在 iPad(用于现场指导)和 Vision Pro(用于沉浸式培训)之间复用。

怎么开始:用 USDZ 模型训练零件的 reference object,在 iOS 上配置 detectionObjects 做静态识别,在 visionOS 上开启高帧率追踪做动态引导。

4. 3D 打印标记追踪任意物体

做什么:给没有 3D 模型的日常物品(如手术器械、工具)贴上 3D 打印的追踪标记,实现低成本追踪。

为什么值得做:不需要 photorealistic 的 USDZ 模型,只需要打印一个标记件装在物体上就能追踪。这大幅降低了对象追踪的门槛。

怎么开始:设计一个带独特纹理的 3D 打印标记,用 Create ML 训练标记的 reference object,把标记固定在要追踪的物体上。

5. 多配件协同的混合现实游戏

做什么:做一款支持多个空间配件同时追踪的 MR 游戏,比如一手持枪一手持盾。

为什么值得做updateAccessories 支持运行时动态增减配件,玩家可以随时换手或加入新设备,不需要重启游戏。

怎么开始:初始化时连接主配件启动 session,玩家拿起第二个配件时调用 updateAccessories 追加到追踪列表,通过配件的按钮事件触发游戏动作。

关联 Session

评论

GitHub Issues · utterances