【问题标题】:SceneKit: pan gesture not storing previous rotationSceneKit:平移手势不存储先前的旋转
【发布时间】:2018-07-17 19:34:57
【问题描述】:

我正在使用平移手势来旋转我的 SceneKit 场景中的一个节点。我目前拥有的代码完美地旋转了节点。这是我用来旋转节点的代码:

var previousRotation:Float = 0

@objc func panGestureRecognized(gesture: UIPanGestureRecognizer) {
    if gesture.numberOfTouches == 2 {
        let view = self.view as! SCNView
        let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
        let translation = gesture.translation(in: view)

        var newAngle = Float(translation.x) * Float(Double.pi) / 180.0
        newAngle += previousRotation

        switch gesture.state {
        case .began:
            newAngle += previousRotation
            break
        case .changed:
            node!.rotation = SCNVector4(x: 0, y: Float(translation.y), z: 0, w: newAngle)
            break
        case .ended:
            newAngle += previousRotation
            break
        default: break
        }
    }
}

问题是,当您抬起手指并再次开始旋转时,旋转会“重置”。我需要它来“保持”它的旋转,所以当您再次开始平移时,它只会从上次旋转停止的位置继续。

【问题讨论】:

  • 此代码从不设置 previousRotation 变量。在.ended 的情况下不应该是previousRotation = newAngle 吗?
  • 我想通了,但现在它有另一个问题。当您旋转时,然后停止并旋转另一个方向,当您到达某个点(旋转该方向)时,旋转将停止然后反转并开始向另一个方向旋转,即使您仍在旋转同一方向。跨度>

标签: ios swift rotation scenekit


【解决方案1】:

我们开始吧,经过一些重大更改、来自其他 SO 问题的信息以及不同的方法,我想通了。使用此代码,您可以完美地在任何轴(在我的情况下为 y)上旋转节点,然后“存储”其旋转以在之后继续使用另一个平移旋转。

var previousRotation = SCNVector4(x: 0, y: 0, z: 0, w: 0)

@objc func pan(gesture: UIPanGestureRecognizer) {
    if gesture.numberOfTouches == 2 {
        let view = self.view as! SCNView
        let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
        let translate = gesture.translation(in: view)

        var newAngle = Float(translate.x) * Float(Double.pi) / 180.0

        var rotationVector = SCNVector4()
        rotationVector = SCNVector4(x: 0, y: previousRotation.y + Float(translate.y), z: 0, w: previousRotation.w - newAngle)

        switch gesture.state {
        case .began:
            previousRotation = node!.rotation
            break
        case .changed:
            node!.rotation = rotationVector
            break
        default: break
        }
    }
} 

希望这对将来的其他人有所帮助。

【讨论】:

  • 当我同时对 X 和 Y 使用相同的逻辑时,当对象向一侧旋转 180 度时,例如沿 X,Y 旋转方向发生变化,如 +Y 导致 -Y 旋转.关于如何管理这个的想法?
猜你喜欢
  • 2017-11-30
  • 2018-03-15
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2016-11-14
  • 2018-10-30
相关资源
最近更新 更多