我有一个简单的问题。如果我想开始游戏并将棋盘放在我面前:
gameBoard!.position = SCNVector3(0, 0, -0.6)
这一直有效,直到我离开游戏并再次回来。我可以在相机前面或在我面前0.6m
显示相同位置的游戏板吗?我可能已经身体移动到另一个位置。
答案 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, ])
}
}
希望这会有所帮助。