math - 四元数的相机旋转

标签 math 3d camera

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

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

    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
    }

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

最佳答案

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

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

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

关于math - 四元数的相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069695/

相关文章:

algorithm - 对我网站排名算法选项的反馈

algorithm - 人工智能 : selecting immediate acceleration/rotation to get to a final point

C:根据给定条件查找序列的成员

php - 使用 bc_math 或 GMP 计算根

c++ - 在 OpenSceneGraph 中实现对象在平面上的搜索行为?

opengl - OpenGL中的轮廓效果

javascript - Threejs 基于相机旋转的指南针

android - 在 Android 中使用 Canvas 转换实现 'rubberbanding' 相机

xcode - Opencv相机姿态估计

iphone - 如何禁用 iPhone 相机的自动闪光功能?