Explore enhancements to visionOS object tracking
visionOS & Spatial Computing 高级 14m

探索 visionOS 对象追踪的增强功能

Explore enhancements to visionOS object tracking

2026年6月10日

在 Apple 官方观看视频

一句话判断

✅ visionOS 对象追踪终于从“看静态摆件”进化到了“精准操控动态手持工具”,并彻底开放了第三方空间配件的硬件定义权。

这场 Session 讲了什么

visionOS 2.0 的对象追踪(Object Tracking)只能搞定放在桌上的静态摆件,手一拿起来或者动得快就丢追踪。空间配件(Spatial Accessories)也只有苹果官方认证的几款,开发者没法自己做硬件。这场 Session 就是来还债的。

现在 visionOS 27 引入了高帧率追踪(High-frame-rate tracking)和 Create ML 的扩展训练模式(Extended training mode),专门死磕手持动态物体的追踪。新增了度量空间姿态(Metric-space poses)API 剥离了显示校正,让物理测量达到毫米级。空间配件方面,苹果彻底开放了第三方硬件支持,只要你的设备有 LED 星座、IMU 和蓝牙,就能通过 GCSpatialAccessory 接入,甚至支持热插拔。

这对做医疗手术模拟、工业精密测量、以及需要定制物理交互外设(比如赛车方向盘、飞行摇杆)的软硬件团队来说是绝对的利好。

值得深挖的点

度量空间姿态(Metric-space poses)与渲染坐标的剥离

以前我们用 ARKit 拿到的物体坐标,都是经过“显示校正(Display correction)”的。苹果为了让人眼在头显里看着舒服,会对坐标做微调。这在渲染 UI 时没问题,但如果你要做医疗探针测量脊椎距离,或者工业零件公差检测,这种微调就是致命的误差。

这次新增的 coordinateSpace(correction: .none) 直接给你物理世界的绝对真实坐标。设计上的 trade-off 很明显:物理坐标绝对精准,但如果直接拿它去渲染虚拟 UI,用户可能会觉得 UI 和物理物体有轻微的“漂移”或视差。实战中必须严格区分“用于物理计算的坐标”和“用于视觉渲染的坐标(.rendered)”,千万别混用。

第三方空间配件(Spatial Accessories)的热插拔与硬件门槛

苹果自己不可能做遍所有形态的外设。开放 LED+IMU+BLE 的标准,是把硬件定义权交给了开发者。最爽的设计是 AccessoryTrackingProvider 支持通过 updateAccessories 热插拔,换手柄再也不用重启整个 ARKitSession 了,这在以前是个巨大的痛点。

不过别高兴得太早,自定义硬件的门槛依然很高。你需要自己设计 LED 星座排布、搞 IMU 校准,还要走苹果的验证流程。苹果虽然在 Simulator 里提供了 debug tool,也推荐了 DFRobot 和 MikroE 的即插即用参考硬件,但建议先用现成硬件跑通软件流程,再去折腾自定义 PCB。

代码片段

1. 开启高帧率追踪

场景:追踪用户手里快速挥动的物体(如手术刀、手电筒)。

// 开启高帧率追踪配置
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)

坑:高帧率追踪必须配合 Create ML 的 extended 模式训练的模型使用,否则精度提升不明显,且会增加设备功耗。

2. 区分物理测量与视觉渲染坐标

场景:用追踪到的医疗探针测量物理距离,并在旁边渲染 UI 标签。

// 获取不受屏幕校正影响的物理绝对坐标,用于计算真实距离
let metricPose = myObjectAnchor.coordinateSpace(correction: .none)

// 获取经过显示校正的坐标,用于渲染贴合物体的虚拟 UI
let renderingPose = myObjectAnchor.coordinateSpace(correction: .rendered)

坑:把 metricPose 直接赋给 RealityKit 的 Entity 会导致视觉上的轻微错位,渲染 UI 必须老老实实用 .rendered

3. 空间配件的发现与热插拔

场景:连接第三方蓝牙空间手柄,并在运行时替换为另一个手柄。

import GameController

// 发现并连接第一个可用的空间配件
if let device = GCSpatialAccessory.spatialAccessories.first {
    let accessory = try await Accessory(device: device)
    let provider = AccessoryTrackingProvider(accessories: [accessory])
    try await arkitSession.run([provider])
    
    // 运行时热插拔替换配件,无需重启 ARKit session
    let newAccessory = try await Accessory(device: newDevice)
    try await provider.updateAccessories([newAccessory])
}

坑:GCSpatialAccessory 依赖设备固件里的 .referenceaccessory bundle,如果第三方硬件没打包这个描述文件,连接会直接报错。

最佳实践

  • 已有项目迁移:如果你之前的 App 追踪手持物体老是丢,赶紧用 Create ML 的 extended 模式重新训练 .referenceobject,并在代码里开启 highFrameRateTrackingEnabled。这能解决大部分动态遮挡丢追踪的问题。
  • 新项目采用:涉及物理测量的,务必使用 .none 获取 metric pose;涉及渲染的,继续用 .rendered。做空间配件别一开始就自己画板子,先买 DFRobot 或 MikroE 的现成参考硬件跑通 GCSpatialAccessory 流程。
  • CI/CD 集成:Create ML 现在支持命令行跑 extended 训练(xrun createml objecttracker --training-mode extended),可以直接把这个步骤塞进你的自动化构建流水线里,不用每次都在 Mac 上点鼠标。

还有什么值得关注

  • Object Tracking 登陆 iOS:ARKit 在 iOS 上也支持了这套 Reference Object API,方便做 iOS 和 visionOS 的跨端 AR 体验。
  • 物理环境光照(Physical Surroundings Light):RealityKit 新增了基于追踪物体(如手电筒)实时改变环境光照的能力,能让虚拟物体的阴影和反光更真实。
  • 即插即用硬件生态:苹果官方点名了 DFRobot 和 MikroE,这意味着你不需要懂硬件也能直接买模块拼装出第一个空间配件原型。
visionOS Object Tracking ARKit Spatial Accessories Create ML