2

在带有 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 轴的另一种方法是什么?

4

3 回答 3

7

当我直接多次修改 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)
}
于 2014-08-30T21:37:45.087 回答
3

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

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)
于 2014-08-14T22:26:25.840 回答
0

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

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

于 2014-09-02T04:51:31.693 回答