2017-08-21 2 views
5

Ich versuche, die ARWorldTracking Sitzung nach einer Sitzungsunterbrechung nach Norden zu orientieren. Ich bin ein paar Mal über die documentation gegangen, aber ich finde es verwirrend.ARKit: Wie Welt-Orientierung nach der Unterbrechung zurückgesetzt

Aktuelles Verhalten:

Wenn ich das Gerät zu sperren und die App wieder öffnen, die sessionWasInterrupted Auslösung, die SCNNodes aller Verschiebung gegen den Uhrzeigersinn auf dem Kompass von ~ 90 Grad oder so.

Wenn Sie rufen den Lauf (_: Optionen :) Methode mit einer Konfiguration eines anderen Typs als die aktuelle Konfiguration der Session, die Sitzung immer zurücksetzt Tracking

ich interpretierte, dass mit den Worten, Wenn ich einen neuen Satz von Konfigurationen erzeuge, der sich von dem viewWillAppear unterscheidet, wird die Sitzung "zurückgesetzt". Ich verstehe nicht, was tatsächlich passiert, aber die Ausrichtung nach der Unterbrechung ist aus. (Und removeExistingAnchors tut nichts)

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

Gewünschtes Verhalten:

Wenn die App eine Sitzung Unterbrechung erkennt, würde Ich mag es neu zu orientieren sich zurück zu wahren Norden.

Antwort

0

Dieses Problem hat mich auch getötet - Sie halfen mir mit der Hälfte der Lösung - Hinzufügen der 'Reset Tracking/Entfernen Sie vorhandene Anker' Flags war der magische Schlüssel für mich - ich denke, die andere Hälfte ist die Anleitung von This post wo Sie müssen Ihre Sitzung anhalten und alle Knoten aus der Szene entfernen und sie dann neu positionieren. Die Kombination dieser beiden Dinge hat den Kompass bekommen, um nach der Sitzungsunterbrechung für mich auf True North zurückgesetzt zu werden.

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

} 
Verwandte Themen