Swift ARKit对象不是从保存的文件创建的

Swift ARKit对象不是从保存的文件创建的,swift,arkit,Swift,Arkit,我正在为一个使用ARKit的项目工作。我需要保存一个物体的位置,例如在我的家里,我在房间里设置了一个椅子/物体中心,几个小时后回到房间,我希望在ARKit可能的地方看到那个椅子/物体 我放置了我的椅子/物体并保存在文件中,文件保存成功。但是当我检索保存的文件并重新加载对象时。但该对象在ARSession中不可见 let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.h

我正在为一个使用ARKit的项目工作。我需要保存一个物体的位置,例如在我的家里,我在房间里设置了一个椅子/物体中心,几个小时后回到房间,我希望在ARKit可能的地方看到那个椅子/物体

我放置了我的椅子/物体并保存在文件中,文件保存成功。但是当我检索保存的文件并重新加载对象时。但该对象在ARSession中不可见

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal]

    let options: ARSession.RunOptions = [.resetTracking, .removeExistingAnchors]
    if let worldMap = worldMap {
        configuration.initialWorldMap = worldMap
        print("Found saved world map.")
        self.showAlert("Found saved world map.", "")
    } else {
        print("Move camera around to map your surrounding space.")
    }
    sceneView.session.run(configuration, options: options)
    sceneView.delegate = self

放置椅子时,需要向场景添加锚定:

  let anchor = ARAnchor(name: "chair", transform: transform)
  session.add(anchor: anchor)
然后实现
ARSCNViewDelegate
,并将实际模型添加到锚定中

func session(_ session: ARSession, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard anchor.name == "chair" else { return }
    node.addChildNode(chairNode)
}
那么发生了什么?保存
ARWorldMap
时,它包含所有锚定,但不包含场景基特数据。 这就是为什么我们需要首先添加保存最晚的锚点,然后在代理中添加几何体。当您手动添加锚点时,以及当系统在您使用新的初始世界地图运行会话后添加锚点时,都会调用委托

从:

当您直接向会话添加锚点时,以及当会话从世界地图恢复锚点时,都会触发相同的ARSCNView委托方法渲染器(uux0:didAdd:for:)。要确定哪个保存的锚点表示虚拟对象,此应用程序使用ARAnchor name属性


它不是每次用户检索文件并重新加载对象时都调用的委托。我已经测试过了,我被卡住了,为什么它不是每次都重新加载。它被称为。重新定位真的有效吗?您可以检查
ARCamera
.trackingState
并查找原因。它的工作有时。。。实际上,用户每次都可以重新加载对象。。那个问题。。有时是表演。。当用户刷新sceneview并再次重新加载其不可见时,仅在场景重新定位后才会添加对象