繁体   English   中英

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

[英]ARKit: How to reset world orientation after interruption

我试图让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])
}

期望的行为:

当应用程序检测到会话中断时,我希望它将自己重新定位回真北。

这个问题也让我感到害怕 - 你用一半的解决方案帮助了我 - 添加'重置跟踪/移除现有锚点'标志对我来说是一个神奇的关键 - 我认为另一半是这篇文章的指导,你必须暂停您的会话并从场景中删除所有节点,然后重新定位它们。 这两件事的组合让我在会话中断后重新回到True North。

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])

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM