旋转相机本身

时间:2018-01-22 17:46:48

标签: ios swift scenekit

我正在使用两个虚拟操纵杆将我的相机移动到场景中。左摇杆控制位置,右摇杆控制旋转。

使用右杆时,相机会旋转,但相机似乎会围绕模型的中心点旋转。

这是我的代码:

fileprivate func rotateCamera(_ x: Float, _ y: Float)
{
    if let cameraNode = self.cameraNode
    {
        let moveX = x / 50.0

        let rotated = SCNMatrix4Rotate(cameraNode.transform, moveX, 0, 1, 0)
        cameraNode.transform = rotated
    }
}

我也试过这段代码:

fileprivate func rotateCamera(_ x: Float, _ y: Float)
{
    if let cameraNode = self.cameraNode
    {
        let moveX = x / 50.0

        cameraNode.rotate(by: SCNQuaternion(moveX, 0, 1, 0), aroundTarget: cameraNode.transform)
    }
}

但相机只是跳了起来。我的错误是什么?

1 个答案:

答案 0 :(得分:1)

有许多方法可以处理旋转,有些方法非常适合给编码器带来麻烦。

听起来模型位于0,0,0,意味着它位于世界的中心,并且相机被转换到某个位置。在使用矩阵的第一个示例中,您基本上可以旋转该转换。所以你首先变换,然后旋转,这将导致它围绕原点(0,0,0)旋转。

相反,要在本地空间旋转相机,首先要在本地空间旋转相机,然后将其转换为世界空间中的位置。

平移x旋转矩阵导致在世界空间中旋转

旋转x平移矩阵导致在局部空间中旋转

因此,解决方案是首先从相机中移除平移(将其移回0,0,0),然后应用旋转矩阵,然后重新应用平移。这与从单位矩阵开始的结果相同。例如:

let rotated = SCNMatrix4Rotate(SCNMatrixIdentity, moveX, 0, 1, 0)
cameraNode.transform = SCNMatrix4Multiply(rotated, cameraNode.transform)