将 ARKit 应用演进为空间体验
Evolve your ARKit app for spatial experiences
2023年6月5日
一句话判断
iOS ARKit 应用的空间计算迁移路线图——ARKit 和 RealityKit 从应用级框架升级为系统级服务,World Map 自动持久化、摄像头穿透和手部遮挡内置,RealityView 取代 ARView 成为新的 SwiftUI-RealityKit 桥接。
这场 Session 讲了什么
ARKit 团队的 Omid Khalili 和 Oliver 介绍了如何将 iOS ARKit 应用迁移到空间计算平台。
系统服务化:ARKit 的世界追踪和场景理解从应用级服务变成了操作系统级服务,支撑从窗口放置到空间音频的一切功能。摄像头穿透(camera pass-through)和手部遮挡现在是内置能力,应用免费获得。World Map 持久化也由系统自动处理。
三种展示模式:Shared Space(应用并列运行,类似 Mac 桌面)、Volume(3D 内容在有限边界内展示)、Full Space(应用独占空间,获得更多 ARKit 能力)。在 Full Space 中,应用可以使用锚定实体(AnchorEntity)将内容固定到桌子、地板等表面,并获取 ARKit 提供的详细场景数据。
RealityView:新的 SwiftUI 视图,是连接 SwiftUI 和 RealityKit 的桥梁。替代了 iOS 上的 ARView。RealityView 可以同时包含 2D 和 3D 元素,在同一个界面中无缝融合。
内容迁移:USD 是 3D 内容的核心格式。iOS 上使用 CustomMaterials 的内容需要用 Reality Composer Pro 的 Shader Graph 重建。Reality Composer Pro 项目可以直接导入 Xcode。
ARKit 数据访问:在 Full Space 中,应用可以获得 ARKit 提供的平面检测、场景几何和手部骨骼追踪数据。这些能力需要用户授权。
值得深挖的点
Shared Space vs Full Space 的能力差异:Shared Space 中,ARKit 数据对应用不可用,锚定实体工作但不需要权限。Full Space 中,应用获得完整的 ARKit 能力,包括手部追踪(需要权限)。这个设计将隐私控制放在了最重要的位置。
RealityView 的混合界面能力:一个 RealityView 可以同时包含 SwiftUI 的 2D 控件和 RealityKit 的 3D 内容。这比 iOS 上 ARView + SwiftUI 的桥接方式自然得多。
CustomMaterials 到 Shader Graph 的迁移:iOS 上的 CustomMaterials 无法直接迁移。Reality Composer Pro 的 Shader Graph 基于 MaterialX 标准,提供 PBR、Unlit、Geometry Modifier 等节点。这不是简单的 API 替换,而是创作流程的变更。
World Map 自动持久化的意义:iOS 上应用需要自己管理 ARWorldMap 的保存和恢复。空间计算中系统持续自动处理,应用启动时 3D 内容自然出现在之前放置的位置。
代码片段
// RealityView - 连接 SwiftUI 和 RealityKit
RealityView { content in
// 加载 USD 内容
let entity = try await Entity(named: "MyARObject",
in: realityKitContentBundle)
content.add(entity)
} update: { content in
// 响应 SwiftUI 状态变化
}
.attachments {
// 在 3D 空间中放置 SwiftUI 视图
Attachment(id: "info-panel") {
InfoPanelView()
}
}
// Full Space 中的锚定实体
// 将 3D 内容固定到桌面等表面
let anchor = AnchorEntity(.plane(.horizontal, classification: .table))
let model = try await Entity(named: "ChessBoard")
anchor.addChild(model)
content.add(anchor)
// ARKit 手部追踪(需要 Full Space + 用户授权)
// ARKit 提供骨骼级别的手部追踪数据
// 可以实现手部与 3D 内容的直接交互
// Raycasting - 在空间中放置内容
// 结合 ARKit 数据和 RealityKit
let raycastQuery = RaycastHitQuery(
origin: handLocation,
direction: .forward,
length: 5.0
)
if let result = entity.raycast(from: raycastQuery.origin,
to: raycastQuery.direction) {
// 在射线命中点放置内容
placedEntity.position = result.position
}
最佳实践
- 从 Shared Space 开始设计:大多数应用不需要 Full Space。先在 Shared Space 中做好核心体验,再考虑是否需要 Full Space 的高级能力。
- 用 USD 格式准备 3D 内容:USD 是平台的标准格式,Reality Composer Pro 直接支持。
- 用 Shader Graph 重建 CustomMaterials:不要尝试直接迁移 iOS 的 CustomMaterials,用 Reality Composer Pro 重新创建。
- RealityView 替代 ARView:新的 SwiftUI 集成方式,不再需要 UIViewRepresentable 桥接。
- 尊重 ARKit 数据的隐私要求:在 Full Space 中访问 ARKit 数据需要用户授权,提供清晰的授权理由。
还有什么值得关注
- ARKit 从应用级框架升级为系统级服务,这是一个根本性的架构转变。
- 手部追踪在空间计算中是一等公民——不只是输入方式,还可以和 3D 内容做物理交互。
- Hello World 示例应用是学习空间计算 ARKit 集成的最佳起点。
- Session 建议同时观看 “Meet SwiftUI for spatial computing” 和 “Build spatial experiences with RealityKit” 获取完整知识。