探索 visionOS 的物体追踪能力
Explore object tracking for visionOS
2024年6月10日
一句话判断
visionOS 现在可以把现实世界中的真实物体变成虚拟锚点——你的 globe、显微镜、甚至玩具都可以被追踪并在上面叠加 AR 内容,这是空间计算从”平面+手部锚点”迈向”万物皆锚点”的关键一步。
这场 Session 讲了什么
Object Tracking 是 visionOS 今年推出的全新能力,它让你的 app 能够识别和追踪真实世界中的具体物体(不是平面、不是图像、不是手,而是你桌上的那个地球仪、那台显微镜),并把虚拟内容锚定在上面。演示中,一个真实的地球仪被虚拟卫星环绕,点击后还能看到地核的剖面图——虚拟的月球和空间站会消失在真实地球仪的背后,营造出强烈的沉浸感。
整个工作流分三步:第一步,提供目标物体的 USDZ 3D 模型(越逼真越好,可以用 Object Capture 从 iPhone 扫描生成)。第二步,在 Create ML app 中训练一个机器学习模型,输出一个 .referenceobject 文件。第三步,在你的 visionOS app 中加载这个 reference object,启动追踪,锚定虚拟内容。
苹果把这个能力设计得相对平易近人——Create ML 提供了可视化的训练界面,拖入 USDZ 文件就能开始训练,全程本地运行在你的 Mac 上。但也有一些明确的限制:物体必须是刚性(rigid)的、非对称的、基本静止的,而且需要逐个物体训练 ML 模型。
演示中最令人印象深刻的是虚拟内容与真实物体的交互方式。当虚拟卫星绕着真实地球仪飞行时,它们会消失在地球仪的背后——系统通过 Object Tracking 获取的真实物体边界信息,配合 RealityKit 的遮挡(occlusion)能力,实现了虚拟内容被真实物体遮挡的效果。这种”虚拟被真实遮挡”的体验,比”虚拟浮在真实之上”要沉浸得多。它让用户的大脑相信”这些虚拟东西是真的存在于我的空间里的”。
值得深挖的点
Reference Object 的训练流程和观看角度选择
Object Tracking 需要为每个目标物体单独训练一个 ML 模型。这不是一个可以”泛化”的系统——你训练了”我的地球仪”的模型,它就只能追踪”我的地球仪”,换一个外观不同的地球仪不行。训练过程在 Create ML app 中完成,完全本地运行。
训练配置中最关键的参数是观看角度(viewing angle),它告诉 ML 模型用户最可能从哪些角度看到这个物体。三个选项:
- All Angles:用户可能从任何方向看这个物体。要求物体从各个角度看都有独特的外观。适合可以旋转的物体,如地球仪。
- Upright:物体会竖直放在桌面上,用户不会从底部看。适合显微镜、台灯这类物品。
- Front:用户主要从正面看这个物体。适合挂在墙上的装饰品或贴在冰箱上的设备。
选对观看角度直接影响追踪质量。如果物体其实是 Upright 放置的,但你选了 All Angles,ML 模型会浪费算力去学习底部特征(用户永远看不到的角度),可能导致正面追踪质量下降。
物体适配的限制条件
苹果明确列出了 Object Tracking 的适用范围,这个列表本身就是一份设计指南:
适合追踪的物体:刚性外观(形状和纹理不会变)、非对称(每个角度看起来不一样)、基本静止(不会频繁移动)、有独特纹理(纯色球体不行)。Session 中演示的地球仪是个完美例子——球形但纹理非对称(有大陆和海洋的图案),放在桌上不动。
不适合追踪的物体:软体或可变形的(毛绒玩具)、对称的(纯色圆柱体)、频繁移动的(手持工具)、透明或高反光的(玻璃杯)。如果你的物体有这些特征,Object Tracking 的质量会很差。
这里有一个实用的建议:如果你要追踪的物体有支架(比如地球仪的底座),训练时应该只用主体部分(球体),不包括支架。因为支架的活动部分会引入形状变化,影响追踪稳定性。
关于 3D 模型的获取,苹果推荐使用 Object Capture 技术——只需要一台 iPhone 或 iPad 就能扫描实物生成 USDZ 模型。对于有光泽或透明部分的物体,单次扫描可能效果不好,苹果建议提供多材质(multi-material)USDZ 资产,可以从其他 3D 扫描工作流获取。训练前务必在 Create ML 的 3D 视口中检查模型——确认模型和实物的外观一致,确认右下角显示的尺寸和实际物体的尺寸匹配。一个和实物尺寸不符的模型会导致追踪定位出现偏移。
代码片段
在 Reality Composer Pro 中使用 Reference Object
import RealityKit
import ARKit
// 加载追踪的 reference object
let referenceObject = try await ReferenceObject.load(
named: "GlobeReferenceObject"
)
// 创建 Object Tracking provider
let objectTracking = ObjectTrackingProvider(
referenceObjects: [referenceObject]
)
// 启动 ARKit session
let session = ARKitSession()
try await session.run([objectTracking])
// 监听追踪更新
for await update in objectTracking.anchorUpdates {
switch update.event {
case .added, .updated:
let anchor = update.anchor
// 获取物体的位置和朝向
let position = anchor.originFromAnchorTransform.translation
let bounds = anchor.bounds
// 在物体上叠加虚拟内容
attachVirtualContent(to: anchor)
case .removed:
// 物体离开了视野
removeVirtualContent(for: update.anchor.id)
}
}
场景:在 visionOS app 中追踪真实物体并叠加 AR 内容。坑:ObjectTrackingProvider 需要在 ARKitSession 中运行,和 PlaneDetectionProvider 等其他 provider 可以共存。
追踪锚点上的虚拟内容放置
func attachVirtualContent(to anchor: ObjectAnchor) {
// 创建虚拟标签
let label = ModelEntity(
mesh: .generateText("点击查看详情"),
materials: [SimpleMaterial(color: .white, isMetallic: false)]
)
// 放在物体上方
label.position = SIMD3<Float>(
0, Float(anchor.bounds.extents.y) + 0.1, 0
)
// 添加到锚点,这样虚拟内容会跟随物体移动
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(label)
// 添加到场景
arView.scene.addAnchor(anchorEntity)
}
场景:在追踪到的物体上方放置虚拟标签。坑:虚拟内容的坐标系相对于 anchor 的原点,不同物体的原点位置可能不同,需要根据 bounds 做偏移。
在 SwiftUI 视图中集成 Object Tracking
struct ContentView: View {
@State var trackingProviders: [ObjectTrackingProvider]?
var body: some View {
RealityView { content in
// 加载 reference objects
let globeRef = try await ReferenceObject.load(
named: "GlobeReferenceObject"
)
let microscopeRef = try await ReferenceObject.load(
named: "MicroscopeReferenceObject"
)
let provider = ObjectTrackingProvider(
referenceObjects: [globeRef, microscopeRef]
)
trackingProviders = [provider]
let session = ARKitSession()
try await session.run([provider])
// 监听追踪事件
Task {
for await update in provider.anchorUpdates {
handleTrackingUpdate(update, in: content)
}
}
}
}
}
场景:在 SwiftUI 应用中同时追踪多个物体。坑:可以同时追踪多个物体,但每个物体需要单独训练 reference object。
最佳实践
新项目:在规划阶段就确定你要追踪哪些物体,尽早用 Object Capture(iPhone/iPad)扫描生成 USDZ 模型。在 Create ML 中训练时,仔细选择观看角度——这比调整其他参数对追踪质量的影响更大。真机测试是必须的,因为物体的实际外观、光照条件都会影响追踪效果。
已有项目:如果你已经有基于 plane anchor 或 image anchor 的 AR 体验,Object Tracking 给了你一个更精确的锚点方案。特别是当你的虚拟内容需要”附着”在特定物体上(而不是一个平面区域),Object Tracking 能提供更好的稳定性和一致性。注意它和现有的 SceneReconstructionProvider 可以在同一个 ARKitSession 中运行。
还有什么值得关注
- 物体的 3D 模型质量直接决定追踪质量——越接近物体的真实外观(digital twin),追踪越准确。Object Capture 是获取高质量模型的首选方式。
- 对于有光泽或透明部分的物体,苹果建议使用多材质(multi-material)USDZ 资产,可以通过其他 3D 扫描工作流获取。
- Create ML 的 Object Tracking 模板在今年的新分类”Spatial”下,和 Image Classification、2D Object Detection 等模板并列。