ARKit:如何在中断后重置世界方向

9

我正尝试在 ARWorldTracking 会话中,在会话发生中断后重新定位北方。我已经多次查看了文档,但是发现它很难理解。

当前行为:

当我锁定设备并重新打开应用程序时,会触发sessionWasInterrupted,此时所有的 SCNNodes 在指南针上都逆时针移动了大约90度左右。

当您使用与会话当前配置不同的配置调用 run(_:options:) 方法时,会话总是重置跟踪

我理解这是说如果我生成了一个与 viewWillAppear 不同的新配置集,会话将会“重置”。但实际发生的事情我还没有弄清楚,中断后的定位出现了偏差。(并且 removeExistingAnchors 没有起到任何作用)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let configuration = ARWorldTrackingSessionConfiguration()
    configuration.planeDetection = .horizontal
    configuration.worldAlignment = .gravityAndHeading   
    sceneView.session.run(configuration)
}

func sessionWasInterrupted(_ session: ARSession) {
    let configuration = ARWorldTrackingSessionConfiguration()
    configuration.planeDetection = .horizontal
    configuration.worldAlignment = .gravityAndHeading
    self.sceneView.session.run(configuration, options: [ARSession.RunOptions.removeExistingAnchors, ARSession.RunOptions.resetTracking])
}

期望的行为:

当应用程序检测到会话中断时,希望它能重新定位回真正的北方。

1个回答

8

这个问题也一直困扰着我,你帮助我找到了其中一半的解决方案 - 添加“重置跟踪/删除现有锚点”标记对我来说是关键 - 我认为另一半的解决方案是来自这篇文章,在那里你需要暂停会话并从场景中删除所有节点,然后重新定位它们。这两者的组合让指南针在会话中断后重新回到真北。

func resetARSession() {
    // Called by sessionInterruptionDidEnd

    sceneView.session.pause()
    sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
        node.removeFromParentNode() }
    setupARSession()
    setupSceneView()
}

func setupARSession() {

    let configuration = ARWorldTrackingConfiguration()
    configuration.worldAlignment = .gravityAndHeading
    sceneView.session.run(configuration, options: [ARSession.RunOptions.resetTracking, ARSession.RunOptions.removeExistingAnchors])

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接