2017-01-21 8 views
1

以下のコードを使用して、iOSで3Dキューブを自動的に作成することができます。iOSで2つのジェスチャーを使用して3Dキューブを構築する

質問は2つのジェスチャーで3Dキューブを構築する方法ですか?

ピンチアウトジェスチャ XZ軸に立方体のベースを作りたいと思います。

次に、ドラッグジェスチャ Y軸に立方体の高さを作りたいと思います。

どうすればよいですか?

enter image description here

import UIKit 
import SceneKit 

class GameViewController: UIViewController { 
    var scnView: SCNView! 
    var scnScene: SCNScene! 
    var cameraNode: SCNNode! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupView() 
     setupScene() 
     setupCamera() 
     spawnShape() 
    } 

    override func shouldAutorotate() -> Bool { 
     return true 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    func setupView() { 
     scnView = self.view as! SCNView 
     scnView.allowsCameraControl = true 
     scnView.autoenablesDefaultLighting = true 
    } 

    func setupScene() { 
     scnScene = SCNScene() 
     scnView.scene = scnScene 
     scnScene.background.contents = "BG.scnassets/BgTexture.png" 
    } 

    func setupCamera() { 
     cameraNode = SCNNode() 
     cameraNode.camera = SCNCamera() 
     cameraNode.position = SCNVector3(x: 0, y: 0, z: 12) 
     scnScene.rootNode.addChildNode(cameraNode) 
    }  

    func spawnShape() { 
     var geometry: SCNGeometry 

     switch ShapeType.random() { 
     case .Box: 
     geometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.1) 
     } 

     let geometryNode = SCNNode(geometry: geometry) 
     scnScene.rootNode.addChildNode(geometryNode) 
    } 
} 

私はUIPinchGestureRecognizer()UIPanGestureRecognizer()サブクラスを実装しようとしたが、私は失敗しました。私はそれを作る方法を知らない。

+0

まだ試しましたか?あなた自身で実装しようとすると、それは非常に重要ではないように思えます。 – luk2302

+0

あなたが試したコードを投稿し、それがうまくいかなかったか説明してください。 –

+0

あなたの幅と長さのスケールをピンチスケールに設定し、呼び出すたびにピンチスケールスケールを1.0にリセットすることはできませんか?これにより、段階的な成長が可能になります。 – Emptyless

答えて

3

あなたが探しているものを達成するためにUIGestureRecognizersを使用することができます。 XZ方向の

// Add Gesture recognizers 
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:))) 
    scnView.addGestureRecognizer(pinch) 

インクリメンタルスケーリングが今使用して達成することができます:

func scaleSizeOfGeometry(sender: UIPinchGestureRecognizer) { 
    let scale = Float(sender.scale) 
    referenceToGeometry?.scale.x *= scale 
    referenceToGeometry?.scale.z *= scale 
    sender.scale = 1.0 
} 

あなたが何らかの形でスケールするジオメトリを参照する必要があります。あなたのViewDidLoad()あなたの認識機能を追加で

あなたのspawnGeometry()に設定されている変数referenceToGeometry : SCNNode?とたとえば:あなたはY方向にスケールする速度または翻訳を使用することができますので、

referenceToGeometry = geometryNode 

UIPanGestureRecognizerは少しトリッキーです。速度または翻訳

let pan = UIPanGestureRecognizer(target: self, action: #selector(scaleHeightOfGeometry(sender:))) 
scnView.addGestureRecognizer(pan) 

そして、あなたの機能を使用して:あなたのviewDidLoad()追加ジェスチャー認識で

func scaleHeightOfGeometry(sender: UIPanGestureRecognizer) { 
    // y : sender.translation(in: self.scnView).y 
    // v : sender.velocity(in: self.scnView).y 
} 

あなたはこれらのいずれかから自分の好みに合わせて乗数を抽出する必要があります。たとえば、ジオメトリの高さに差を加え、newValueをy [i-1]番目の値として保存するよりも、y [i-1]を保存して2つの差を確認することで可能です。

EDIT:

ポストに追加するには、このの微調整さ/より高度なバージョンのUIGestureRecognizer状態を使用することができます。

関連する問題