重置ARKit坐标

时间:2017-07-14 14:39:21

标签: swift scenekit augmented-reality arkit

我有一个简单的问题。如果我想开始游戏并将棋盘放在我面前:

gameBoard!.position = SCNVector3(0, 0, -0.6)

这一直有效,直到我离开游戏并再次回来。我可以在相机前面或在我面前0.6m显示相同位置的游戏板吗?我可能已经身体移动到另一个位置。

4 个答案:

答案 0 :(得分:7)

如果要重置ARSession,则必须暂停,删除所有节点,然后通过重置跟踪和删除锚点重新运行会话。

我做了一个重置​​按钮,只要我想重置它就会执行它:

@IBAction func reset(_ sender: Any) {

    sceneView.session.pause()
    sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
        node.removeFromParentNode()
    }
    sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}

或者把它放在你的会话中被中断的功能!

答案 1 :(得分:1)

当您再次在run上致电ARSession时,可以使用resetTracking选项进行此操作。

示例:

if let configuration = sceneView.session.configuration {
    sceneView.session.run(configuration,
                          options: .resetTracking)
}

答案 2 :(得分:0)

"这一直有效,直到我离开游戏并再次回来。"

您无法在后台跟踪摄像机位置。每当您的应用进入后台并关闭相机时,您就会失去位置,并会调用sessionWasInterrupted(_:)

  

会话在无法接收摄像机或动作时中断   传感数据。每当相机捕获时发生会话中断   不可用 - 例如,当您的应用在后台或那里时   是多个前台应用程序 - 或者当设备太忙而无法处理时   运动传感器数据。

答案 3 :(得分:0)

在ARKit框架中重置ARSession很容易:

class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {

    @IBOutlet var arView: ARSCNView!
    @IBOutlet weak var sessionInfoLabel: UILabel!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal, .vertical]
        arView.session.run(configuration)
        arView.session.delegate = self
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        arView.session.pause()
    }
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { 
            return 
        }
        let plane = Plane(anchor: planeAnchor, in: arView)
        node.addChildNode(plane)
    }
    func sessionInterruptionEnded(_ session: ARSession) {
        resetSessionTracking()
        sessionInfoLabel.text = "ARSession's interruption has ended" 
    }
    private func resetSessionTracking() {
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.vertical, .horizontal]
        arView.scene.rootNode.enumerateChildNodes { (childNode, _) in
            childNode.removeFromParentNode()
        }
        arView.session.run(config, options: [.removeExistingAnchors, 
                                             .resetTracking, ])
    }
}

希望这会有所帮助。