能否结合ARWorldMap与roomCaptureView实现多房间扫描建模?
ARWorldMap 与 RoomPlan 的 RoomCaptureView 结合使用方案
核心结论
可以将ARWorldMap与RoomCaptureView结合使用,实现基于已有空间地图扩展扫描新房间的需求,但你的当前代码存在配置复用逻辑错误,需要调整配置传递方式。
问题分析与修正方案
你的思路是先启动RoomPlan捕获会话,再加载ARWorldMap更新空间跟踪,但loadWordMap方法里的关键错误在于:你复用了roomCaptureView.captureSession.arSession.configuration这个已有的配置,而非将带有initialWorldMap的自定义配置传入ARSession。
修正后的关键代码
1. ARWorldMap 保存逻辑(无需大幅修改,确认逻辑正确)
@IBAction func saveWorldMapAction(_ sender: Any) { roomCaptureView.captureSession.arSession.getCurrentWorldMap { worldMap, error in guard let map = worldMap else { self.worldMapLabel.text = "错误:\(error!.localizedDescription)" return } do { let data = try NSKeyedArchiver.archivedData(withRootObject: map, requiringSecureCoding: true) try data.write(to: self.mapSaveURL, options: [.atomic]) DispatchQueue.main.async { self.loadWordMapButton.isHidden = false self.loadWordMapButton.isEnabled = true self.worldMapLabel.text = "地图已保存" print("地图保存成功") } } catch { fatalError("无法保存地图:\(error.localizedDescription)") } } }
2. 加载ARWorldMap并启动会话的修正逻辑
核心是将带有初始ARWorldMap的配置注入RoomPlan会话配置,而非直接复用原有配置:
@IBAction func addNewRoomBtnPressed(_ sender: UIButton) { sceneViewFloorPlan.alpha = 0 stopSession() loadWorldMapAndStartSession() } private func loadWorldMapAndStartSession() { isScanning = true setActiveNavBar() guard let data = mapDataFromFile else { fatalError("加载按钮启用前应已确认地图数据存在") } do { guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data) else { fatalError("归档文件中不存在ARWorldMap") } // 获取RoomPlan会话配置,修改其内部的AR配置 let roomConfig = roomCaptureSessionConfig if let arConfig = roomConfig.configuration as? ARWorldTrackingConfiguration { arConfig.initialWorldMap = worldMap // 用更新后的配置启动RoomPlan捕获会话 roomCaptureView?.captureSession.run(configuration: roomConfig) } } catch { fatalError("无法从文件中恢复ARWorldMap:\(error)") } }
3. 基础会话启动方法(可保留)
private func startSession() { isScanning = true print("启动RoomCaptureView") roomCaptureView?.captureSession.run(configuration: roomCaptureSessionConfig) setActiveNavBar() }
关键注意事项
- RoomPlan的
RoomCaptureSession.Configuration内部包含ARSession的配置,必须将ARWorldMap注入到这个内部AR配置中,而非直接调用ARSession的run方法。 - 切换扫描任务前,确保
stopSession方法正确暂停或停止原有会话,避免冲突。 - 加载ARWorldMap后,RoomPlan会基于已有空间定位继续扫描新房间结构,实现平面图的扩展。
内容的提问来源于stack exchange,提问作者jobo92
相关产品推荐
相关产品推荐

