[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画面に戻るとノードの位置がずれるので、床面検知の際に位置調整すること。