空间计算应用开发入门
Get started with building apps for spatial computing
2023年6月5日
一句话判断
这是 visionOS 开发的入门必修课——Shared Space、Windows、Volumes、Full Space 四个概念的差异,RealityKit + ARKit + SwiftUI 三层架构的分工,以及从现有 iOS App 迁移的三种路径。
这场 Session 讲了什么
Session 从基础概念开始,逐步介绍了 visionOS App 的开发方式。
基础概念。默认情况下 App 启动到 Shared Space——多个 App 并排存在,类似 Mac 桌面。每个 App 可以有一个或多个窗口(Window),这些是 SwiftUI 的 Scene,支持调整大小和重排布局,可以混合 2D 和 3D 内容。Volumes 是在 Shared Space 中展示 3D 内容的固定边界容器(比如棋盘),用户可以从不同角度查看。Full Space 模式下,App 独占整个空间,适合沉浸式体验。
技术栈。SwiftUI 构建 UI 窗口和控件。RealityKit 渲染 3D 内容、处理空间音频和物理模拟。ARKit 提供空间感知能力(平面检测、图像追踪、世界映射)。三层协同工作,SDK 提供了统一的 API 接口。
三种起步方式。最简单的是让现有 iPad/iOS App 以兼容模式运行——无需修改代码,获得类似 iPad 的窗口体验。进一步是用 visionOS SDK 重新编译现有 App,获得原生渲染和交互。最完整的是创建全新的 visionOS App,充分利用 3D 和空间能力。
值得深挖的点
Shared Space vs Full Space 的选择:大多数日常应用适合 Shared Space——用户可以同时看到你的 App 和其他 App。Full Space 适合游戏、冥想、沉浸式媒体等需要完全占据用户注意力的体验。你的 App 可以在不同模式之间切换。
Volumes 的定位:Volumes 是 3D 内容在 Shared Space 中的”容器”。它们有明确的边界,不与其他 App 的内容重叠。如果你的 App 只需要展示一个 3D 模型(比如商品预览),Volumes 是最佳选择。
RealityView:这是 SwiftUI 中嵌入 RealityKit 内容的关键组件。它在 SwiftUI 视图层级中创建一个 3D 渲染区域,你可以向其中添加实体、设置材质和光照。
代码片段
创建一个包含 3D 内容的 visionOS 窗口:
import SwiftUI
import RealityKit
struct ContentView: View {
var body: some View {
// RealityView 是 SwiftUI 和 RealityKit 的桥梁
RealityView { content in
// 创建一个 3D 模型实体
let model = ModelEntity(
mesh: .generateSphere(radius: 0.1),
materials: [SimpleMaterial(color: .blue, isMetallic: true)]
)
// 添加手势支持
model.generateCollisionShapes(recursive: true)
content.add(model)
}
.gesture(
SpatialTapGesture()
.targetedToAnyEntity()
.onEnded { value in
// 用户点击了 3D 对象
let entity = value.entity
// 添加动画效果
}
)
}
}
App 入口配置:
@main
struct MyApp: App {
var body: some Scene {
// 窗口场景 — 在 Shared Space 中展示
WindowGroup {
ContentView()
}
// 或者使用 Volume 展示 3D 内容
// Volume {
// Model3DView()
// }
}
}
最佳实践
- 先以兼容模式运行现有 iOS App 验证基本功能,再逐步原生化
- 日常应用用 Shared Space + Window 模式,游戏和沉浸内容用 Full Space
- 用 RealityView 在 SwiftUI 中嵌入 3D 内容,保持声明式 UI 的编程模型
- 为 3D 对象添加碰撞形状(collision shapes)才能接收手势事件
- 窗口内容不要过于拥挤——空间环境需要留白
还有什么值得关注
- ARKit 的空间感知能力在 visionOS 上的具体 API
- 从 Full Space 退回 Shared Space 的用户交互设计
- 3D 手势(DragGesture、RotateGesture)在空间环境中的使用
- visionOS App 的性能预算和渲染限制