ARKit 空间计算能力全面升级
Create enhanced spatial computing experiences with ARKit
2024年6月10日
一句话判断
ARKit 今年给了 visionOS 开发者三样东西:房间级感知(Room Tracking)让 App 知道你在哪个房间、物体追踪(Object Tracking)让虚拟内容精准附着在真实物品上、倾斜平面检测补上了最后一块场景理解拼图。
这场 Session 讲了什么
visionOS 发布一年后,开发者反馈最集中的需求是”让 App 更懂周围环境”。去年的 ARKit 提供了平面检测和 mesh 重建,但这些信息缺乏”空间语义”——你知道面前有一面墙,但不知道这是一间卧室的墙。
今年的更新从三个维度加强了场景理解。Room Tracking 是最重磅的:ARKit 能识别房间的边界,给出精确的墙壁和地板几何体,并且在你从客厅走到卧室时自动切换数据源。Object Tracking 允许你用 USDZ 模型注册一个真实物体,ARKit 就能持续追踪它的位置和朝向。Plane Detection 新增了 Slanted 对齐方式,可以检测斜面。
此外,World Tracking 在各种光照条件下更稳定了,Hand Tracking 也更精准。这些改进让教育、工业、游戏类的 visionOS 应用有了更大的想象空间。
值得深挖的点
Room Tracking:空间感知的质变
之前的 mesh 和 plane anchor 只能告诉你”这里有个平面”或”这里有个几何体”,但你无法判断这些平面和几何体属于哪个房间、哪面墙。Room Tracking 在这个基础上加了一层空间语义。
RoomTrackingProvider 持续追踪用户当前所在的位置,判断是否在一个封闭空间内。如果是,就输出一个 RoomAnchor,包含这个房间的墙壁和地板几何体。这个几何体比普通 mesh anchor 更精确——它直接对齐到房间的边界,而不是靠传感器点的插值。
更妙的是房间切换:当你从一个房间走到另一个房间,Provider 自动更新数据,你收到的新 RoomAnchor 就是当前房间的信息。这意味着你可以实现”进卧室显示虚拟闹钟,进厨房显示食谱”这样的场景。
RoomAnchor 还提供了几个实用能力:contains(point:) 判断一个 3D 点是否在房间内(配合 World Tracking 可以做区域触发);墙壁和地板可以按独立几何体获取(适合做整面墙的虚拟门户);planeAnchorIDs 和 meshAnchorIDs 可以帮助你过滤不需要的数据,避免在当前房间外做昂贵的计算。
Object Tracking:让虚拟锚定在真实物体上
这个功能的思路是:你有一个真实物体的 3D 模型(USDZ 格式),用 CreateML 训练出一个 ReferenceObject,然后在 ARKit 里注册它。ARKit 就会在环境中搜索匹配的物体,一旦找到就持续输出它的位置和朝向。
使用流程分三步:准备 USDZ 模型 → 用 CreateML 的空间物体追踪功能生成 ReferenceObject → 加载到 ObjectTrackingProvider 里运行。Session 提到要详细了解训练过程需要看另一场 Session “Explore object tracking for visionOS”,这里只讲了最后一步的使用。
API 设计保持了 ARKit 一贯的风格:配置 DataProvider,跑 ARKitSession,处理异步输出的 Anchor。ObjectAnchor 包含一个轴对齐包围盒和变换矩阵,可以直接用来放置虚拟内容。
限制是物体必须是静态放置的——不能追踪移动中的物体。这排除了手持物体追踪的场景,但对桌面上的教具、展台上的展品这类应用足够了。
代码片段
Room Tracking 基础使用
// 配置房间追踪
let roomProvider = RoomTrackingProvider()
let session = ARKitSession()
try await session.run([roomProvider])
for await update in roomProvider.anchorUpdates {
let room = update.anchor
if room.isCurrentRoom {
// 当前房间的墙壁和地板几何体
let walls = room.geometry
// 判断用户是否在房间内
let isInRoom = room.contains(userPosition)
// 获取关联的平面和 mesh ID,优化计算范围
let relatedPlaneIDs = room.planeAnchorIDs
}
}
场景:根据用户所在房间切换虚拟内容展示。坑:RoomTrackingProvider 需要 World Sensing 授权,首次使用会弹权限弹窗。
Object Tracking 追踪真实物体
// 加载预训练的 ReferenceObject
let globeRef = try await ReferenceObject(from: url)
// 配置追踪
let objectProvider = ObjectTrackingProvider(referenceObjects: [globeRef])
let session = ARKitSession()
try await session.run([objectProvider])
for await update in objectProvider.anchorUpdates {
let anchor = update.anchor
// 获取物体位置,放置虚拟内容
let transform = anchor.originFromAnchorTransform
let boundingBox = anchor.axisAlignedBoundingBox
placeVirtualContent(at: transform, size: boundingBox.max)
}
场景:教育 App 在地球仪上方展示 3D 地球信息可视化。坑:物体必须静态放置,光线变化太大会影响追踪稳定性。
斜面检测
// 之前的水平 + 垂直,今年新增斜面
let planeProvider = PlaneDetectionProvider(alignments: [.horizontal, .vertical, .slanted])
let session = ARKitSession()
try await session.run([planeProvider])
场景:检测楼梯扶手、斜坡桌面等倾斜平面。坑:斜面检测会增加计算量,如果不需要就别加。
最佳实践
已有项目迁移:如果你已经用了 ARKit 的 PlaneDetection 或 MeshProvider,迁移成本很低——Room Tracking 和 Slanted 平面检测只是新增了 DataProvider 类型,不改动现有逻辑。Object Tracking 是独立能力,按需引入。
新项目起步:Room Tracking 应该作为任何”房间内”体验的基础 DataProvider,它提供的信息比 mesh 和 plane 更高层。Object Tracking 适合工业和教育场景,但需要投入时间做 ReferenceObject 的训练和测试。Plane Detection 加上 Slanted 后基本覆盖了所有平面类型,不需要特殊处理。
还有什么值得关注
- World Tracking 在低光和强光环境下的稳定性提升了,不用再为极端光照条件做特殊处理。
- Hand Tracking 的精度也有改进,对手势识别的准确性有帮助。
- RoomAnchor 可以输出按墙面拆分的独立几何体,适合做”虚拟门户”这种整面墙的增强效果。