2017-08-21 31 views
5

Próbuję przekonać sesję ARWorldTracking do ponownego zorientowania się na północ po przerwaniu sesji. Kilka razy przeszedłem przez documentation, ale uważam, że jest to mylące.ARKit: Jak zresetować orientację światową po przerwie

Aktualny Zachowanie:

Kiedy zablokować urządzenie i ponownie otworzyć aplikację, wywołując sessionWasInterrupted, że SCNNodes wszystkie przesunięcie w lewo na kompasie przez ~ 90 stopni lub więcej.

Po wywołaniu run (_: opcje :) metodę z konfiguracji innego typu niż aktualnej konfiguracji sesji użytkownika, sesja zawsze resetuje śledzenia

I interpretować, że mówiąc, że kiedy generuję nowy zestaw konfiguracji, który różni się od viewWillAppear, sesja zostanie "zresetowana". Nie dostaję tego, co się dzieje, ale orientacja po przerwaniu jest wyłączona. (I removeExistingAnchors nic nie robi)

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

Pożądany Zachowanie:

Gdy aplikacja wykryje przerwanie sesji, chciałbym go ponownie nastawić się z powrotem do prawdziwej północy.

Odpowiedz

0

Ten problem też mnie zabijał - pomógł mi w rozwiązaniu połowy - dodawanie flag "Zresetuj śledzenie/Usuń istniejące kotwice" było dla mnie magicznym kluczem - myślę, że druga połowa to wskazówki od This post gdzie musisz przerwać sesję i usunąć wszystkie węzły ze sceny, a następnie zmienić ich położenie. Połączenie obu tych rzeczy spowodowało, że kompas powrócił do Prawdziwej Północy po przerwie w sesji dla mnie.

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

}