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 上新增的 APIhighFrameRateTrackingEnabled按对象配置,不同对象可以有不同的追踪策略- 这个配置在运行时决定,不需要重新训练模型
扩展训练模式
(04:50)Create ML 新增了扩展训练模式,提升手持物体的追踪精度和鲁棒性。
命令行训练方式:
% xrun createml objecttracker \
--source flashlight.usdz \
--output flashlight.referenceobject \
--training-mode extended \
--all-angles
关键点:
--training-mode extended启用扩展训练,耗时比标准模式长很多- 扩展训练模式建议和高帧率追踪配合使用
- 命令行方式支持在远程机器上训练
--all-angles表示从所有角度训练
度量空间坐标
(05:25)coordinateSpace(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
- 探索 visionOS 的对象追踪 — 对象追踪的基础入门,适合先看完再理解本次增强
- 探索 visionOS 上的空间配件输入 — 深入讲解空间配件的按钮、触觉和输入事件处理
- RealityKit 新特性 — Physical Surroundings Light 等光照特性可以和对象追踪结合使用
- Create ML 与对象追踪 — Reality Composer Pro 3 中的对象追踪训练工作流
- SwiftUI 与空间计算 — 将追踪到的物体与 SwiftUI 界面结合展示
评论
GitHub Issues · utterances