【问题标题】:Scene Kit Swift Node Multiple RotationScene Kit Swift 节点多次旋转
【发布时间】:2014-10-08 16:37:39
【问题描述】:

在带有 Swift 的 SceneKit 中,我只能旋转一次。

我想在每次用户点击屏幕时沿 z 轴旋转相机。

func handleTap(){
    println("start")
    SCNTransaction.begin()
    SCNTransaction.setAnimationDuration(1.0)

    SCNTransaction.setCompletionBlock(){
        println("done")
    }

    _cameraNode.rotation = SCNVector4Make(0, 0, 1, CFloat( -M_PI_4 ) * 0.5 )

    SCNTransaction.commit()

}

但是,我想在每次触摸时继续旋转它。我想我需要一个scnvector4 乘数,但我找不到那个方法。

我怎样才能将 2 scnvector4s 相乘,或者还有什么方法可以保持 z 轴旋转?

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    当我直接多次修改 node.rotation 时,我遇到了一些奇怪的行为,

    相反,似乎更可靠的是一些代码,例如:

    let xAngle = SCNMatrix4MakeRotation(degToRad(90), 1, 0, 0)
    let yAngle = SCNMatrix4MakeRotation(degToRad(180), 0, 1, 0)
    let zAngle = SCNMatrix4MakeRotation(degToRad(0), 0, 0, 1)
    
    var rotationMatrix = SCNMatrix4Mult(SCNMatrix4Mult(xAngle, yAngle), zAngle)
    
    node.transform = SCNMatrix4Mult(rotationMatrix, node.Transform)
    

    ...有点笨重,但它有效。顺便说一句,degToRad 类似于:

    func degToRad(deg: Float) {
        return deg / 180 * Float(M_PI)
    }
    

    【讨论】:

    • 对于最后一行我推荐:node.pivot = SCNMatrix4Mult(rotationMatrix, node.transform)
    【解决方案2】:

    如果您只使用相同的轴旋转该节点,只需按分量添加向量:

    let cur = _cameraNode.rotation
    _cameraNode.rotation = SCNVector4Make(cur.x, cur.y, cur.z, cur.w - CGFloat(M_PI_4 * 0.5))
    

    或者,使用一个不错的 Swift 技巧 - 可以使用点表示法直接改变属性的成员,并且 Swift 在调用属性 setter/getter 时会做正确的事情:

    _cameraNode.rotation.w -= CGFloat(M_PI_4 * 0.5)
    

    【讨论】:

    • 嗨@rickster,如果您先在 X 轴上旋转,然后在 Y 轴上旋转,您将如何处理?
    【解决方案3】:

    您只需要每次更改角度并将该线更改为:

    _cameraNode.rotation = SCNVector4Make(0, 0, 1, _cameraNode.rotation.w + ( -M_PI_4 ) * 0.5 )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多