[Swift][ARKit] UIPinchGestureRecognizer で SCNNodeを拡大・縮小する

2019年4月3日ITARKit, Swift

UIPinchGestureRecognizer を使って SCNNodeを拡大・縮小します。

例:名前が “robo” のSCNNode全てを拡大・縮小する

@objc func pinched(recognizer: UIPinchGestureRecognizer) {
    if recognizer.state == .changed {
        
        self.sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
            if node.name == "robo" {
                let pinchScaleX = Float(recognizer.scale) * node.scale.x
                let pinchScaleY = Float(recognizer.scale) * node.scale.y
                let pinchScaleZ = Float(recognizer.scale) * node.scale.z
                
                node.scale = SCNVector3(pinchScaleX,pinchScaleY,pinchScaleZ)
                recognizer.scale = 1
            }
        }
    }
}

enumerateChildNodes メソッドを使って、SceneView にある全てのSCNNodeを対象とし、その中で名前が “robo” のSCNNodeに対して、拡大縮小の処理を実行します。

UIPinchGestureRecognizer の状態が変わる毎に GestureRecognizer のスケールをSCNNodeのスケールx, y, z にそれぞれ掛けます。

それをSCNNodeのスケールに当て直してやります。

GestureRecognizer のスケールを都度 1 に初期化してやると、スケールを塩梅良く制御できます。

1に初期化しないと、大きくなり過ぎたり、小さくなり過ぎたりします。

これでピンチイン、ピンチアウトすることでSCNNodeを拡大・縮小することができます。

Githubにサンプルプロジェクトをアップロードしてますので、よければご参考ください。
https://github.com/nobuhiroharada/ARKit-beginner/tree/master/ARKit-beginner/3-Gesture

スポンサーリンク

Posted by nobuhiro harada