使用 RoomPlan 创建参数化 3D 房间扫描
Create parametric 3D room scans with RoomPlan
2022年6月6日
一句话判断
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 扫描具体物体
- 房地产、室内设计和电商是最直接的应用场景