场景工具包Swift节点多重旋转

场景工具包Swift节点多重旋转,swift,scenekit,Swift,Scenekit,在斯威夫特的SceneKit中,我只能旋转一次 每次用户点击屏幕时,我都要在z轴上旋转相机 func handleTap(){ println("start") SCNTransaction.begin() SCNTransaction.setAnimationDuration(1.0) SCNTransaction.setCompletionBlock(){ println("done") } _cameraNode.rota

在斯威夫特的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()

}
然而,我希望每次触摸都能保持旋转。我想我需要一个
scinvector4
乘法器,但我找不到那个方法


如何乘以2
scinvector4
s,或者还有什么方法可以保持z轴旋转?

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

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)

当我多次直接修改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)
}

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


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

对于最后一行,我建议:node.pivot=scnMatrix=scnMatrix,node.transform)Hi@rickster,如果您首先在X轴上旋转,然后在Y轴上旋转,您将如何处理这个问题?