Create enhanced spatial computing experiences with ARKit
Spatial Computing 进阶 20m

ARKit 空间计算能力全面升级

Create enhanced spatial computing experiences with ARKit

2024年6月10日

在 Apple 官方观看视频

一句话判断

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 可以做区域触发);墙壁和地板可以按独立几何体获取(适合做整面墙的虚拟门户);planeAnchorIDsmeshAnchorIDs 可以帮助你过滤不需要的数据,避免在当前房间外做昂贵的计算。

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 可以输出按墙面拆分的独立几何体,适合做”虚拟门户”这种整面墙的增强效果。
WWDC 2024