【问题标题】:Rotate camera around itself围绕自身旋转相机
【发布时间】:2018-01-23 22:13:31
【问题描述】:

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

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

这是我的代码:

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)
    }
}

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

【问题讨论】:

    标签: ios swift scenekit


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 2018-07-05
      • 1970-01-01
      • 2016-11-23
      • 2016-09-22
      • 2018-08-03
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多