【问题标题】:Camera rotation with a quaternion带四元数的相机旋转
【发布时间】:2011-11-09 18:25:43
【问题描述】:

我对相机旋转的数学有疑问,更像是我缺乏这方面的知识,并且在互联网上找不到任何相关信息(阅读,很可能不知道正确的搜索关键字)

无论如何,这就是我正在尝试做的事情(伪代码):

    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
    }

现在这工作得很好,但有时凸轮会滚动,而不仅仅是偏航/俯仰。这样做的正确方法是什么?

【问题讨论】:

    标签: math 3d camera


    【解决方案1】:

    仅给出一小段代码,很难确定。但看起来您已将旋转轴硬编码到更新方法中。关于旋转(无论是由四元数还是矩阵表示)的问题在于它们的乘法不是“可交换的”,这意味着进行相同的两次旋转但以相反的顺序进行不会得到相同的结果。

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

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

    【讨论】:

    • 基本上我应该创建一个 getLeft() 和 getUp() 方法并使用它们而不是静态值?
    • 是的。 getLeft() 将只是确定从相机头顶出来的轴。然后 getUp() 将获取 getLeft() 的结果并形成它的“叉积”(你见过这个吗?)与相机朝向的方向。应该这样做!
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多