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

コメントを残す

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