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

时间:2019-04-17 12:21:56

标签: swift arkit

我正在使用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

1 个答案:

答案 0 :(得分:0)

放置椅子时,需要在场景中添加锚点:

  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时,它包含所有锚点,但不包含SceneKit数据。 这就是为什么我们需要首先添加已保存最新信息的锚点,然后在委托中添加几何。当您手动添加锚点以及在使用新的初始世界地图运行会话后系统添加锚点时,都会调用该委托。

来自documentation

  

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