使用两种手势在iOS中构建3D立方体

使用两种手势在iOS中构建3D立方体,3d,swift2,ios9,scenekit,gesture,3d,Swift2,Ios9,Scenekit,Gesture,我可以使用下面的代码在iOS中自动创建3D立方体 问题是:如何用两个手势构建一个3D立方体 使用夹出手势我想在XZ轴上建立一个立方体的基础 然后用拖动手势我想在Y轴上建立一个立方体的高度 怎么做 我试图实现uipinchgestrerecognizer()和uipangestrerecognizer()子类,但失败了。我不知道怎么做 var pinchGesture = UIPinchGestureRecognizer() var dragGesture = UIPanGestureRecog

我可以使用下面的代码在iOS中自动创建3D立方体

问题是:如何用两个手势构建一个3D立方体

使用夹出手势我想在XZ轴上建立一个立方体的基础

然后用拖动手势我想在Y轴上建立一个立方体的高度

怎么做

我试图实现
uipinchgestrerecognizer()
uipangestrerecognizer()
子类,但失败了。我不知道怎么做

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) {
    ........
}

您可以使用
UIgestureRecognitors
来完成所需的任务

ViewDidLoad()中添加识别器:

    // Add Gesture recognizers
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:)))
    scnView.addGestureRecognizer(pinch)
let pan = UIPanGestureRecognizer(target: self, action: #selector(scaleHeightOfGeometry(sender:)))
scnView.addGestureRecognizer(pan)
XZ方向上的增量缩放现在可以通过以下方式完成:

func scaleSizeOfGeometry(sender: UIPinchGestureRecognizer) {
    let scale = Float(sender.scale)
    referenceToGeometry?.scale.x *= scale
    referenceToGeometry?.scale.z *= scale
    sender.scale = 1.0
}
必须以某种方式参照要缩放的几何体。例如,使用在
spawnGeometry()中设置的变量
referenceToGeometry:SCNNode?

由于可以使用速度或平移在Y方向进行缩放,因此,
UIPangestureRecognitor
有点棘手。在
viewDidLoad()中添加手势识别器:

    // Add Gesture recognizers
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:)))
    scnView.addGestureRecognizer(pinch)
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]并检查两者之间的差异,而不是将差异添加到几何体的高度并将新值存储为y[i-1]第个值

编辑:


要添加到帖子中,您可以使用
uigesturecognizer
states来获得更高级/更精细的版本

你试过什么了吗?如果您试图自己实现它,这听起来是一项非常重要的任务。因此,请发布您尝试的代码,并解释它是如何不起作用的。您不能使用将宽度和长度比例设置为pinchgesture比例,并在每次调用pinchgesture比例时将其重置为1.0吗?这将实现与代码/实现无关的增量增长;关于用户体验的一个想法:几十年来,我使用了很多3D设计应用程序,包括iPad Pro的新iOS应用程序等。对于最初的飞机制作,我认为单点触摸和拖动操作会更好。用户可以从任何角开始,并沿创建基准面所需的方向拖动。完成后,让他们满意地添加第二个手指并向上或向下拖动以将平面挤出到三维立方体中,或者用一个手指释放并提交第二个拖动以执行相同的操作。