在使用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 scnvector4
或者我可以保持旋转z轴的另一种方式?
答案 0 :(得分: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)
}
答案 1 :(得分: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)
答案 2 :(得分:0)
您只需每次都更改角度并将该行更改为:
_cameraNode.rotation = SCNVector4Make(0,0,1,_cameraNode.rotation.w +( - M_PI_4)* 0.5)