[ARkit] didremove メソッドでも配置したSCNNodeを保持する方法
ARkitを実装するにはARkitのDelegateメソッドのdidaddメソッド時にSCNNodeを引数「node」にaddchildするが、画面遷移などでdidremoveメソッドが呼ばれるとベースノードが削除されるので、追加したSCNNodeが根こそぎ削除されてしまう。
didremove メソッドでも配置したSCNNodeを保持する方法は以下の通り
didAddメソッド時に引数nodeにaddNodeするのではなくsceneview.scene.rootNodeにaddする。
そうすることによってdidremove メソッドでベースノードが削除されても追加したノードは残る。
ただし、普通にanchor座標でsceneview.scene.rootNodeにaddするとy軸がずれるので、y軸だけanchor.transform.columns.3.yでworldからの絶対座標で指定しておくこと。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
let planeGeometry = SCNBox(width: 1,
height: 0.01,
length: 1,
chamferRadius: 0)
let planeNode = SCNNode(geometry: planeGeometry)
planeNode.position = SCNVector3Make(anchor.center.x, anchor.transform.columns.3.y, anchor.center.z)
planeNode.physicsBody = SCNPhysicsBody(type: .kinematic,
shape: SCNPhysicsShape(geometry: planeGeometry,
options: nil))
//node.addChildNode(planeNode) //これではない
sceneView.scene.rootNode.addChildNode(planeNode)
}
func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) {
//やることなし
}
ただ、これでも画面がAR画面に戻るとノードの位置がずれるので、床面検知の際に位置調整すること。