[ARkit] How to keep SCNNode on AR world even if “didremove” method called
How to put SCNNode on AR world is to add SCNNode on node from didadd method.
but when window would be moved other ViewContoller, didremove method would be called, then remove base AR node from sceneView.
thus all SCNNode on ARnode would be deleted.
How to keep SCNNode on AR world even if “didremove” method called, is below
Add SCNNode on sceneview.scene.rootNode, not ARnode.
by that, SCNNode would be retain on scneneView even if “didremoved” method called.
however, y axis based on anchor would be different than your image, you should set only y axis by anchor.transform.columns.3.y.
You may use “anchor.center.x” and “anchor.center.z” as x,z
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) //You don't need to use this sceneView.scene.rootNode.addChildNode(planeNode) } func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) { //Nothing to do }
However, when ViewContoller transfer to AR ViewController, SCNNode position is not original one.
You must adjust when ARkit detect floor.
ex : func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)