我正在编写一个基本的OpenGL游戏,并且有一些代码可以在移动相机方面处理鼠标。

我正在使用以下方法:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

但是,在环顾四周后,您会发现相机开始“滚动”(旋转)。由于我只给Pitch和Yaw打电话,所以我不知道这怎么可能。

这是我用于Camera类的代码:http://pastebin.com/m20d2b01e

据我所知,我的相机不会“滚动”。它应该简单地上下倾斜或左右偏航。不滚。

是什么原因造成的?

最佳答案

祝贺您-您已经发现了李群理论!

是的,有可能。一系列转型的结果
取决于执行顺序。推销
跟偏航和偏航是不一样的
间距。实际上,在无限偏航的范围内
和间距,差异等于纯滚动;一般
情况要复杂一些。

(物理学家称此为“
轮换组”。)

如果您熟悉旋转矩阵,则可以解决
很容易

10-04 21:33
查看更多