相机旋转四元数

时间:2011-11-09 18:25:43

标签: math 3d camera

我对相机旋转的数学有问题,更像是我对此主题缺乏了解并且无法在互联网上找到任何相关信息(阅读,很可能不知道正确的搜索关键字)< / p>

无论如何,这是我试图做的(伪代码):

    RotateCamera(angle,axis){
        Quaternion rotation = cam.getRotation();
        Quaternion rot = new Quaternion();
        rot.fromAngleNormalAxis(angle, axis);

        rotation.multLocal(rot);

        cam.setRotation(rotation);
    }

    update(float value){ // just to show what input I use the RotateCamera method for the directions
        RotateCamera(value,Vector3f(0,1,0)) // left
        RotateCamera(-value,Vector3f(0,1,0)) // right
        RotateCamera(value,Vector3f(1,0,0)) // up
        RotateCamera(-value,Vector3f(1,0,0)) // down
    }

现在这种方法效果很好,但有时候凸轮会翻滚而不是只有偏航/俯仰。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

只要给出一点代码,就很难肯定。但看起来你已经将旋转轴硬编码到更新方法中了。关于旋转(无论是由四元数还是矩阵表示)的事情是它们的乘法不是“可交换的”意味着进行相同的两次旋转但是以相反的顺序不会产生相同的结果。

看起来你假设相机朝向(0,0,1)方向,我们称之为z轴,y轴(0,1,0)从你的顶部出来头。只要这个假设成立,你的向上,向下,向左和向右的旋转轴将是(1,0,0),(1,0,0),(0,1,0)和(0 ,1,0)因为它们似乎在你的代码片段中。但是说你刚刚向左旋转了90度。这将摄像机的视图从(0,0,1)方向发送到(1,0,0)方向。现在说你进行“向上”旋转,它被编码为(1,0,0)轴周围。这是围绕你正在寻找的同一轴的旋转,效果将是一个滚动。

这是否解决了这个问题?如果是这样,你应该编码你的旋转轴w.r.t.相机当前的方向。