如何旋转SCNBox

时间:2016-08-08 16:18:50

标签: ios swift rotation scenekit

我正在尝试轮播使用SCNBox创建的swipe gestures。例如,当我向右滑动时,当我向左滑动时,框应该在Y-axis和-90degs中旋转90度。为了实现这一点,我一直在使用节点的SCNAction.rotateByX方法来执行旋转动画。现在我遇到的问题是在X-axis中旋转后沿Z-axisY-axis旋转,反之亦然,轴的位置会发生变化。

我注意到,在X,Y,Z轴上的任何一个旋转都会改变其他轴指向的方向。

示例:默认位置

enter image description here

然后在Z-axis

中轮换后

enter image description here

当然这会造成问题,因为现在当我swipe left or right我不再获得欲望效果时,因为X-axisY-axis现在已经交换了位置。我想知道的是为什么会发生这种情况?无论如何都要执行旋转动画而不影响其他轴吗?

我为这个主题缺乏理解而道歉,因为这是我第一次使用3D图形。

解决方案:

func swipeRight(recognizer: UITapGestureRecognizer) {
  // rotation animation
  let action = SCNAction.rotateByX(0, y: CGFloat(GLKMathDegreesToRadians(90)), z: 0, duration: 0.5)
  boxNode.runAction(action)

  //repositoning of the x,y,z axes after the rotation has been applied
  let currentPivot = boxNode.pivot
  let changePivot = SCNMatrix4Invert(boxNode.transform)
  boxNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
  boxNode.transform = SCNMatrix4Identity
}

我还没遇到任何问题,但使用完成处理程序来确保在重新定位之前完成对X,Y,Z轴的任何更改都会更安全。

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,这是我用来表达所需行为的问题:

func panGesture(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)

    let pan_x = Float(translation.x)
    let pan_y = Float(-translation.y)
    let anglePan = sqrt(pow(pan_x,2)+pow(pan_y,2))*(Float)(M_PI)/180.0
    var rotVector = SCNVector4()

    rotVector.x = -pan_y
    rotVector.y = pan_x
    rotVector.z = 0
    rotVector.w = anglePan

    // apply to your model container node
    boxNode.rotation = rotVector

    if(sender.state == UIGestureRecognizerState.Ended) {
        let currentPivot = boxNode.pivot
        let changePivot = SCNMatrix4Invert(boxNode.transform)
        boxNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
        boxNode.transform = SCNMatrix4Identity
    }
}