2017-01-21 8 views
1

Я могу автоматически создать 3D-куб в iOS, используя приведенный ниже код.Создание 3D-куба в iOS с помощью двух жестов

Вопрос в следующем: как построить 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 Чтобы выполнить то, что вы ищете, вы можете использовать UIGestureRecognizers.

в вашем ViewDidLoad() добавить распознаватель:

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

инкрементного масштабирования в направлениях XZ теперь может быть достигнуто с помощью:

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].

EDIT:

Чтобы добавить к сообщению, вы можете использовать UIGestureRecognizer состояния для более продвинутых/отладили версий этого.

Смежные вопросы