认识空间计算平台的 ARKit:全新 API、世界追踪与手部追踪
Meet ARKit for spatial computing
2023年6月5日
一句话判断
ARKit 在空间计算平台上从框架升级为系统服务,全新 API 提供 a la carte 式的功能选择和隐私优先的数据访问设计。
这场 Session 讲了什么
Ryan 和 Conner 介绍了 ARKit 在空间计算平台上的完全重写:
三大构建块。Anchor(锚点)表示真实世界中的位置和朝向;Data Provider(数据提供者)代表单个 ARKit 功能(如世界追踪、手部追踪),支持轮询或异步观察数据更新;Session(会话)组合一组 Data Provider,启动后开始接收数据。
世界追踪。WorldTrackingProvider 提供六自由度的设备运动追踪。核心能力是 WorldAnchor——你指定一个变换矩阵,ARKit 确保虚拟内容固定在真实空间中。WorldAnchor 自动持久化,跨 App 启动和设备重启后依然存在。
场景理解。提供关于周围环境的信息,包括平面检测、场景几何等。让虚拟内容能正确地与真实世界交互——比如放在桌子上而不是穿过桌面。
手部追踪。全新的 Data Provider,提供每只手的骨骼关节位置和朝向。可以用来放置相对于手部的虚拟内容,或构建自定义手势交互。
隐私优先架构。传感器数据(如摄像头画面)永远不离开 ARKit 守护进程。只有算法产出的结果(如锚点位置、手部关节)才会传递给 App。部分数据类型需要用户授权。
值得深挖的点
锚定 vs 非锚定的区别。非锚定的内容相对于 App 原点放置。当用户按下数码表冠重新定位时,App 原点会移动到当前位置,非锚定内容跟着移动。锚定内容则始终固定在真实空间中。如果你在做 Metal 自定义渲染,理解这个区别至关重要。
WorldAnchor 的自动持久化。ARKit 构建周围环境的地图,锚点与这个地图关联。App 重启或设备重启后,只要 ARKit 能重新定位到相同环境,锚点就会恢复。这是开箱即用的——不需要你手动管理持久化。
ARKit 只在 Full Space 中可用。Shared Space 中的 App 无法获取 ARKit 数据。这是隐私设计的一部分——防止后台 App 获取环境信息。
代码片段
// ARKit 基本使用:创建会话并请求授权
let session = ARKitSession()
// 请求手部追踪授权
let authorizationResult = await session.requestAuthorization(
for: [.handTracking]
)
for (type, status) in authorizationResult {
if status != .allowed {
print("未获得 \(type) 授权")
}
}
// 创建世界追踪数据提供者
let worldTracking = WorldTrackingProvider()
// 启动会话
try await session.run([worldTracking])
// 添加世界锚点
let anchor = WorldAnchor(
transform: matrix_identity_float4x4,
position: SIMD3(0, 0, -1) // 前方 1 米处
)
try await worldTracking.addAnchor(anchor)
最佳实践
- 只选择你需要的 Data Provider,不要启动用不到的功能。
- Trackable Anchor 不被追踪时,隐藏关联的虚拟内容。
- 在运行会话前请求授权,给用户明确的解释。
- WorldAnchor 会自动持久化,不需要的锚点记得删除。
- 测试时关注重新定位场景——按数码表冠后锚点是否正确恢复。
还有什么值得关注
- “Build spatial experiences with RealityKit” 讲了 RealityKit 与 ARKit 的配合
- “Discover Metal for immersive apps” 用 ARKit 获取设备位姿做自定义渲染
- ARKit 的新 API 同时提供 Swift 和 C 两种接口
- Freeform App 在后台使用了 ARKit 的能力