繁体   English   中英

如何旋转SCNBox

[英]How to rotate an SCNBox

我正在尝试旋转使用swipe gestures创建的SCNBox 例如,当我向右滑动时,该框应沿Y-axis旋转90度,向左滑动时应旋转-90度。 为此,我一直使用节点的SCNAction.rotateByX方法执行旋转动画。 现在我遇到的问题是沿任旋转时X-axisZ-axis的一个转动后Y-axis和反之亦然的是,轴的位置而改变。

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

示例:默认位置

在此处输入图片说明

然后在Z-axis

在此处输入图片说明

当然,这带来了一个问题,因为现在当我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轴之前进行任何更改可能更安全。

我遇到了同样的问题,这是我用来提供所需行为的原因:

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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM