[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)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です