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

使用ARGeoAnchor显示指定位置USDZ 3D模型无渲染问题求助

ARGeoAnchor 不显示3D模型解决方案

一、核心代码逻辑修复

你当前代码存在两处会直接导致模型不显示的逻辑问题,优先修正:

  • 锚点匹配逻辑错误:session(_:didAdd:)回调返回的是系统已经完成本地化的有效锚点,你当前没有匹配回调返回的锚点,直接用全局变量判断,可能在锚点还未激活时提前执行加载逻辑,导致绑定失败。
  • 强制解包无错误提示:try!加载USDZ一旦失败会直接崩溃,没有任何错误日志,无法排查模型文件是否有效。

修正后的代码参考:

class ViewController: UIViewController, ARSessionDelegate {

    @IBOutlet var arView: ARView!
    // 给锚点加唯一标识方便匹配
    let targetAnchorName = "targetGeoAnchor"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.session.delegate = self
        // 开启调试选项,方便查看锚点是否正常加载
        arView.debugOptions.insert(.showSceneAnchors)
        let config = ARGeoTrackingConfiguration()
        arView.session.run(config)

        // 注意此处需传入WGS84坐标系的经纬度,不要使用偏移坐标系
        let coordinate = CLLocationCoordinate2DMake(0.0, -100.0)
        // 可显式传入海拔,避免默认海拔导致模型被地面遮挡或飘在高空
        let geoAnchor = ARGeoAnchor(name: targetAnchorName, coordinate: coordinate, altitude: 1.5)
        arView.session.add(anchor: geoAnchor)
    }

    func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        // 匹配系统返回的已激活目标地理锚点
        guard let geoAnchor = anchors.first(where: {
            $0.name == targetAnchorName && $0 is ARGeoAnchor
        }) as? ARGeoAnchor else { return }
        
        // 检查模型文件是否在包内
        guard let usdzPath = Bundle.main.url(forResource: "myModelFile", withExtension: "usdz") else {
            print("USDZ文件未找到,请检查是否加入Copy Bundle Resources列表")
            return
        }
        // 捕获加载错误,避免直接崩溃
        do {
            let modelEntity = try Entity.loadModel(contentsOf: usdzPath)
            // 调整模型缩放和位置,避免尺寸异常/被地面遮挡
            modelEntity.scale = SIMD3<Float>(repeating: 0.1) // 可根据实际模型尺寸调整
            modelEntity.position.y = 1 // 固定在锚点上方1米处,避免和地面重合
            let anchorEntity = AnchorEntity(anchor: geoAnchor)
            anchorEntity.addChild(modelEntity)
            arView.scene.addAnchor(anchorEntity)
            print("模型加载成功")
        } catch {
            print("模型加载失败:\(error.localizedDescription)")
        }
    }
}

二、配置项排查

  • 确认USDZ文件已加入项目的Build Phases > Copy Bundle Resources列表,仅拖拽到项目目录不会被打包进安装包,Bundle无法读取对应文件。
  • 确认经纬度使用WGS84标准坐标系,不要使用GCJ02、BD09等国内偏移坐标系,坐标偏差超过10米就会导致模型出现在视野外。

三、可见性调试

如果修正后调试日志打印「模型加载成功」但依然看不到模型:

  • 调整模型缩放参数:ARKit中1单位对应1米,很多建模工具导出的模型默认尺寸过大/过小,可逐步调整缩放值测试。
  • 走到锚点坐标位置附近查看:如果锚点距离你当前位置过远,模型可能因为透视关系小到看不见,走到目标坐标10米范围内测试。
  • 临时关闭地面遮挡:如果你的ARView开启了平面检测和遮挡,可临时移除arView.environment.sceneUnderstanding.options.insert(.occlusion)配置测试,避免模型被系统识别的地面平面遮挡。

内容的提问来源于stack exchange,提问作者Eman Harout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:06:03