Explore enhancements to RoomPlan
System & Services 进阶 20m

RoomPlan 全面升级:自定义 ARSession、多房间合并与 VoiceOver

Explore enhancements to RoomPlan

2023年6月5日

在 Apple 官方观看视频

一句话判断

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:) 参数是向后兼容的
WWDC 2023