1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

タップされるたびにnodeを置き換える方法

Last updated at Posted at 2020-08-30

##はじめに
タップされるたびにnodeを新しく配置するのではなく、二回目以降のタップでnodeを置き換える方法を共有します。replaceChildNodeなどの方法があるようですが、理解できなかったため他のやり方で代替しています。
アドバイス等があれば是非コメントください。
Instead of placing a new node on every tap, I'll share how to replace the node on the second and subsequent taps. replaceChildNode and other methods seem to be available, but I didn't understand them, so I'm using other methods to replace them.
If you have any advice, please comment.

##大まかな前提・流れ

  • nodeには名前をつけることが可能で、その名前を持つnodeがsceneにあるかどうか判定することができる
  • nodeを削除するメソッド -> nodeを作成するメソッドを一つの関数に入れることで、置き換えを表現することができる。

###nodeに名前をつける方法

let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)

let boxNode = SCNNode(geometry: box)
        boxNode.name = "box" //"box"という名前をつけた
        print(boxNode.name ?? "") //box
        self.sceneView.scene.rootNode.addChildNode(boxNode)

boxというgeometryを作成し、boxNodeに入れています。
boxNode.name = "box"で名前をつけています。
一応テストとして名前を標準出力させています。

###sceneにboxという名前のnodeがある場合のみ行われる処理

if (self.sceneView.scene.rootNode.childNode(withName: "box", recursively: true) != nil) {
            self.sceneView.scene.rootNode.enumerateChildNodes{ ( node,stop )in
                node.removeFromParentNode()
                }
            //2回目以降呼ばれる
        }

childNode(withName: )につけた名前を設定することで、sceneにnodeがあるかどうか判定してくれます。
そしてそのifの中に、nodeを消去する処理を書いています。

####上記を一つの関数として記述する

 func createBox(hitTestResult: ARHitTestResult){
       
        if (self.sceneView.scene.rootNode.childNode(withName: "box", recursively: true) != nil) {
            self.sceneView.scene.rootNode.enumerateChildNodes{ ( node,stop )in
                node.removeFromParentNode()
                }
            //2回目なら呼ばれる
        }
        
        let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
        
        let boxNode = SCNNode(geometry: box)
        boxNode.name = "box"
        print(boxNode.name ?? "")
        self.sceneView.scene.rootNode.addChildNode(boxNode)
    }
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?