Create parametric 3D room scans with RoomPlan
Spatial Computing 进阶 20m

使用 RoomPlan 创建参数化 3D 房间扫描

Create parametric 3D room scans with RoomPlan

2022年6月6日

在 Apple 官方观看视频

一句话判断

RoomPlan 是今年最令人兴奋的新框架之一——用带 LiDAR 的 iPhone 或 iPad 扫描房间,几分钟后就能得到包含墙壁、门窗和家具的参数化 3D 模型,无需任何机器学习知识。

这场 Session 讲了什么

Apple 原型设计团队的 Praveen 和视频工程团队的 Kai 联合介绍了全新的 RoomPlan 框架。RoomPlan 使用 ARKit 和机器学习算法,在配备 LiDAR 的设备上扫描房间,自动检测墙壁、窗户、开口、门以及房间内的重要物体(壁炉、沙发、桌子、柜子等)。

Session 介绍了两种使用方式:开箱即用的扫描体验(RoomCaptureView)和底层数据 API(RoomCaptureSession),以及从扫描到处理再到导出的完整工作流。

RoomPlan 适用的应用场景包括:室内设计预览(换墙壁颜色、计算油漆用量)、建筑布局编辑、房地产平面图生成、电商产品空间可视化。

值得深挖的点

RoomCaptureView 的开箱即用体验。 这是一个 UIView 子类,处理了扫描反馈的展示、实时 3D 模型生成、用户引导提示等所有细节。集成到应用中只需要四步:创建视图引用、创建配置对象、启动扫描、停止扫描。扫描完成后可以导出 USDZ 文件。

RoomCaptureSession 的完全自定义能力。 如果你需要自定义扫描界面,使用 RoomCaptureSession API 获取底层的参数化数据。它通过代理模式提供实时更新:检测到的房间模型变化和扫描引导指令(距离、速度、光照调整建议等)。

RoomBuilder 的后处理。 扫描结束后,使用 RoomBuilder 异步处理捕获的数据,生成最终的 3D 模型。这个过程会优化和修正扫描中的不精确之处。

输出格式和导出。 最终模型可以导出为 USDZ 格式,也可以直接使用 CapturedRoom 数据结构中的参数化信息(墙壁尺寸、门窗位置、家具类别等)在你的应用中做进一步处理。

代码片段

import RoomPlan

// 方式一:开箱即用的扫描体验
class RoomScanViewController: UIViewController {
    var roomCaptureView: RoomCaptureView!
    var sessionConfig: RoomCaptureSession.Configuration!
    
    func startScanning() {
        roomCaptureView = RoomCaptureView(frame: view.bounds)
        view.addSubview(roomCaptureView)
        
        sessionConfig = RoomCaptureSession.Configuration()
        roomCaptureView.captureSession.run(configuration: sessionConfig)
    }
    
    func stopScanning() {
        roomCaptureView.captureSession.stop()
    }
}

// 可选:处理扫描结果
extension RoomScanViewController: RoomCaptureViewDelegate {
    func captureView(
        _ view: RoomCaptureView,
        didPresent processedResult: CapturedRoom,
        error: Error?
    ) {
        // 导出 USDZ 文件
        try? processedResult.export(to: exportURL)
    }
}

// 方式二:自定义扫描体验
class CustomScanViewController: UIViewController, RoomCaptureSessionDelegate {
    var captureSession: RoomCaptureSession!
    var roomBuilder: RoomBuilder!
    
    func startCustomScan() {
        captureSession = RoomCaptureSession()
        captureSession.delegate = self
        roomBuilder = RoomBuilder()
        
        let config = RoomCaptureSession.Configuration()
        captureSession.run(configuration: config)
    }
    
    // 实时更新房间模型
    func captureSession(_ session: RoomCaptureSession,
                       didUpdate room: CapturedRoom) {
        // 使用 room 数据更新自定义 3D 视图
        updateCustomVisualization(with: room)
    }
    
    // 实时扫描指导
    func captureSession(_ session: RoomCaptureSession,
                       didProvide instruction: RoomCaptureSession.Instruction) {
        // 向用户展示扫描建议(距离、速度、光照等)
    }
    
    // 扫描完成,处理最终数据
    func captureSession(_ session: RoomCaptureSession,
                       didEndWith data: CapturedRoomData,
                       error: Error?) {
        Task {
            let finalRoom = try await roomBuilder.roomModel(from: data)
            // 使用最终模型
        }
    }
}

最佳实践

  • RoomPlan 需要配备 LiDAR 的 iPhone 或 iPad(iPhone 12 Pro 及以后、iPad Pro 系列)
  • 使用 RoomCaptureView 获得最快的集成体验,适合大多数场景
  • 需要自定义扫描界面时使用 RoomCaptureSession API
  • 扫描时保持缓慢匀速移动,确保对房间的每个区域都有充分覆盖
  • 注意 RoomCaptureSession 提供的扫描指导指令,它们能显著提升扫描质量
  • 导出 USDZ 用于通用 3D 工作流,直接使用 CapturedRoom 结构体用于应用内处理
  • 扫描环境的光照条件会影响质量,尽量在均匀光线下扫描

还有什么值得关注

  • RoomPlan 输出的是参数化模型而非纯网格,这意味着你知道哪面是墙、哪里是门、家具是什么类型
  • 检测到的物体类别包括壁炉、沙发、桌子、柜子、床等常见家具
  • 与去年发布的 Object Capture 互补:RoomPlan 扫描房间结构,Object Capture 扫描具体物体
  • 房地产、室内设计和电商是最直接的应用场景
WWDC 2022