怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

【Swift】ARKitで色々操作してみる

SceneViewに対してpan、rotation、pinchのそれぞれのGestureRecognizerを設定する。

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(doPan))
let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(doRotation))
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(doPinch))
self.sceneView.addGestureRecognizer(panGesture)
self.sceneView.addGestureRecognizer(rotationGesture)
self.sceneView.addGestureRecognizer(pinchGesture)

Pan

画像のようにsceneを移動させます。

f:id:ka0in:20190212221632g:plain

 @objc
    private func doPan(sender: UIPanGestureRecognizer) {
        let point = sender.location(in: self.sceneView)
        let results = sceneView.hitTest(point, types: .existingPlaneUsingExtent)
        if let hitPoint = results.first {
            guard let node = self.objNode else { return }
            let vector = SCNVector3(
                x: hitPoint.worldTransform.columns.3.x,
                y: hitPoint.worldTransform.columns.3.y,
                z: hitPoint.worldTransform.columns.3.z
            )
            node.position = vector
        }
    }

Rotation

画像のようにsceneを回転させます。

f:id:ka0in:20190212220225g:plain

    @objc
    private func doRotation(sender: UIRotationGestureRecognizer) {
        guard let node = self.objNode else { return }
        node.runAction(SCNAction.rotateBy(x: 0, y: sender.rotation-0.03, z: 0, duration: 0.1))
    }

Pinch

画像のようにsceneをズームイン/ズームアウトさせる。

f:id:ka0in:20190212221316g:plain

    @objc
    private func doPinch(gesture: UIPinchGestureRecognizer) {
        let scale = Float(gesture.scale)
        guard let node = self.objNode else { return }
        
        switch gesture.state {
        case .changed:
            //ノードのスケールを拡大・縮小
            if scale > 1.000000000 {
                let action = SCNAction.scale(by: CGFloat(1.02), duration: 0.1)
                node.runAction(action)
            } else {
                let action = SCNAction.scale(by: CGFloat(0.98), duration: 0.1)
                node.runAction(action)
            }
            
        default:
            NSLog("not action")
        }
    }

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応