Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将相机绕自身旋转_Ios_Swift_Scenekit - Fatal编程技术网

Ios 将相机绕自身旋转

Ios 将相机绕自身旋转,ios,swift,scenekit,Ios,Swift,Scenekit,我使用两个虚拟操纵杆在场景中移动相机。左斗杆控制位置,右斗杆控制旋转 使用右斗杆时,摄影机会旋转,但摄影机似乎围绕模型的中心点旋转 这是我的代码: fileprivate func rotateCamera(_ x: Float, _ y: Float) { if let cameraNode = self.cameraNode { let moveX = x / 50.0 let rotated = SCNMatrix4Rotate(camer

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

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

这是我的代码:

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

但摄像机只是在四处跳跃。我这里的错误是什么?

处理旋转的方法有很多种,有些方法非常适合给编码器带来麻烦

这听起来像模型在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)