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を移動させます。
@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を回転させます。
@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をズームイン/ズームアウトさせる。
@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実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
- 作者: 石川洋資,西山勇世
- 出版社/メーカー: 技術評論社
- 発売日: 2018/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応
- 作者: 大重美幸
- 出版社/メーカー: ソーテック社
- 発売日: 2018/11/03
- メディア: 単行本
- この商品を含むブログを見る