RoomPlan 全面升级:自定义 ARSession、多房间合并与 VoiceOver
Explore enhancements to RoomPlan
2023年6月5日
一句话判断
RoomPlan 现在支持自定义 ARSession、多房间扫描合并和 VoiceOver——从单房间扫描工具变成了完整的空间建模方案。
这场 Session 讲了什么
Alex 和 Antoine 从视频工程团队出发,介绍了 RoomPlan 在 iOS 17 中的四项重大更新:
自定义 ARSession。之前 RoomPlan 使用内部管理的 ARSession,开发者无法控制。iOS 17 允许传入自定义的 ARWorldTrackingConfiguration ARSession。这打开了三个用例:将 RoomPlan 结果与 ARKit 场景几何和平面检测结合实现更沉浸的 AR 交互;利用 ARKit 的高质量图像采集创建更丰富的房产展示;在现有 AR 体验中集成 RoomPlan 而不干扰已有的 ARAnchor。
多房间(MultiRoom)支持。之前只能扫描单个房间。iOS 17 引入 StructureBuilder API,可以将多个 CapturedRoom 合并为一个 CapturedStructure。解决两个核心问题:统一坐标系(通过连续 ARSession 或 ARSession 重定位实现)和去除重复墙壁/物体(StructureBuilder 自动处理)。
VoiceOver 支持。RoomCaptureView 现在对 VoiceOver 用户可用,让视障用户也能使用空间扫描功能。
导出和表示增强。新的 CapturedStructure 类型包含合并后的房间列表、墙壁、门、窗户、开口和物体,支持直接导出为 USDZ 文件。导出的 USDZ 可以在 iOS/macOS 预览,也可以导入 Blender 等 3D 工具进一步美化。
值得深挖的点
两种多房间坐标系统一方案。连续 ARSession 方案适合一次扫描多个房间——停止扫描时设置 pauseARSession: false,ARSession 持续运行,所有房间共享同一坐标系。ARSession 重定位方案适合分时段扫描——保存 ARWorldMap,下次扫描前加载并触发重定位,新旧坐标系自动对齐。
StructureBuilder 的合并逻辑。它不只做坐标变换,还智能处理重复的墙壁和物体。两个相邻房间的共享墙壁会被合并为一个,重叠的物体会被去重。这意味着你不需要精确地控制扫描的衔接位置。
从扫描到可视化的一站式流程。扫描 -> RoomBuilder 生成 CapturedRoom -> StructureBuilder 合并为 CapturedStructure -> 导出 USDZ -> 在 iOS/macOS 预览或导入 Blender 美化。整个链路在设备上完成。
代码片段
// 自定义 ARSession 传入 RoomPlan
let customARSession = ARSession()
let config = ARWorldTrackingConfiguration()
customARSession.run(config)
// 传入自定义 ARSession
let roomCaptureSession = RoomCaptureSession(
arSession: customARSession, // 新参数
delegate: self
)
// 停止扫描时选择是否暂停 ARSession
roomCaptureSession.stop(pauseARSession: false) // 保持 ARSession 运行
// 多房间合并
// 1. 用连续 ARSession 扫描多个房间
// 2. 分别生成 CapturedRoom
// 3. 用 StructureBuilder 合并
let structureBuilder = StructureBuilder()
let rooms: [CapturedRoom] = [diningRoom, kitchen, livingRoom]
let capturedStructure = try await structureBuilder.capturedStructure(
from: rooms
)
// 导出合并后的 USDZ
let usdzURL = try capturedStructure.export(
to: exportDirectory,
exportOptions: .model
)
// 可以在 iOS/macOS 预览,或导入 Blender 美化
// ARSession 重定位(跨时段扫描)
// 保存第一个房间的 ARWorldMap
let worldMap = try await arSession.getCurrentWorldMap()
try NSKeyedArchiver.archivedObject(withRootObject: worldMap, toFile: path)
// 恢复时加载 ARWorldMap
let savedMap = try NSKeyedUnarchiver.unarchiveObject(fromFile: path) as! ARWorldMap
config.initialWorldMap = savedMap
arSession.run(config)
// 重定位完成后坐标系自动对齐,可以继续扫描
最佳实践
- 一次扫描多个房间用连续 ARSession 方案,跨时段扫描用重定位方案。
- StructureBuilder 会自动处理重复墙壁和物体,不需要手动去重。
- 导出的 USDZ 可以直接给客户预览,或导入专业工具进一步处理。
- 测试 VoiceOver 支持,确保扫描流程对视障用户友好。
- 自定义 ARSession 可以结合 ARKit 的高质量图像采集,创建更丰富的内容。
还有什么值得关注
- Apple 提供了 MultiRoom 示例 App,可以直接体验合并流程
- Blender 导入后的美化效果让 3D 模型从工程级变成展示级
CapturedStructure的数据结构包含 rooms 数组和合并后的所有建筑元素- 自定义 ARSession 的新
stop(pauseARSession:)参数是向后兼容的