You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:01:19