2017-01-21 44 views
1

我可以使用下面的代码在iOS中自动创建3D立方体。用两个手势在iOS中构建3D立方体

问题是:如何用两个手势构建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()子类,但我失败了。我不知道该怎么做。

var pinchGesture = UIPinchGestureRecognizer() 
var dragGesture = UIPanGestureRecognizer() 

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

    self.scnView.userInteractionEnabled = true 
    self.scnView.multipleTouchEnabled = true 

    self.pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecognized(_:))) 
    self.dragGesture = UIPanGestureRecognizer(target: self, action: #selector(panRecognized(_:))) 
    self.scnView.addGestureRecognizer(self.pinchGesture) 
    self.scnView.addGestureRecognizer(self.dragGesture) 
} 

@IBAction func pinchRecognized(pinch: UIPinchGestureRecognizer) { 
    ........ 
} 
@IBAction func panRecognized(pan: UIPanGestureRecognizer) { 
    ........ 
} 
+0

你尝试过什么吗?这听起来像是一个非常平凡的任务,如果你尝试自己实现它。 – luk2302

+0

因此发布您尝试的代码并解释它如何不起作用。 –

+0

你不能用你的宽度和长度标度设置到pinchgesture标度,并且每次调用pinchgesturescale时将其重置为1.0?这将实现增量增长。 – Emptyless

回答

3

您可以使用UIGestureRecognizers来完成您正在查找的内容。

ViewDidLoad()添加识别:在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 
} 

你必须引用您想以某种方式扩展几何体。例如具有可变referenceToGeometry : SCNNode?是在spawnGeometry()设置:

referenceToGeometry = geometryNode 

UIPanGestureRecognizer是一个比较棘手,因为你可以使用速度或翻译在Y方向上成比例。在您的viewDidLoad()添加手势识别:

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

而且在你的函数使用要么速度或译:

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

你将不得不从任一提取乘数自己的喜好。例如通过存储y [i-1]并检查两者之间的差异,而不是将差值添加到几何图形的高度并将newValue存储为y [i-1]值。

编辑:

要添加到后,您可以使用UIGestureRecognizer国的这种更先进/微调,版本。