首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单地调用Pitch()和Yaw()怎么会导致相机最终滚动()呢?

简单地调用Pitch()和Yaw()怎么会导致相机最终滚动()呢?
EN

Stack Overflow用户
提问于 2009-04-24 03:50:56
回答 6查看 4.5K关注 0票数 2

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

我使用以下方法:

代码语言:javascript
复制
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

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

这可能是什么原因造成的?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-24 04:09:05

恭喜你--你发现了李群理论!

是的,这是可能的。一系列转换的结果取决于它们的执行顺序。先做一个俯仰,然后做一个偏航,这与做一个偏航,然后再做一个俯仰是不同的。事实上,在无限小的偏航和俯仰的极限下,差异相当于纯滚动;一般情况要复杂一点。

(物理学家称之为“旋转群的对易关系”。)

如果你熟悉旋转矩阵,你可以很容易地计算出来。

票数 11
EN

Stack Overflow用户

发布于 2009-04-24 04:10:28

您可能需要使用quaternions来合成旋转,如果还没有这样做的话。这避免了围绕3个轴旋转来确定摄影机方向时可能出现的gimbal lock问题。

Here is how to convert between them.

票数 7
EN

Stack Overflow用户

发布于 2009-04-24 03:57:58

嗯,如果你一开始向地平线看,向上倾斜90度,然后向左偏航90度,然后向下倾斜90度,你看起来与开始时相同,但地平线将是垂直的(就像你向左滚动了90度)。

编辑:我认为问题在于,如果相机被当作飞机对待,偏航/俯仰/滚转将是合适的。您可能要做的是将其视为球体中的一个点,跟踪您在球体上指向摄影机的位置。而不是偏航/俯仰,使用球面坐标跟踪theta (纬度)和phi (经度)。它们可能听起来很相似,但考虑一下相机直接指向上方的极端情况。使用偏航/俯仰,您仍然可以从该直线方向自由调整偏航和俯仰。有了theta/phi,你只能向下调整theta,无论你调整了多少phi,减少theta仍然会得到一个平行于地平线的相机。这就是FPS相机的工作原理(你不能往下看太远而看后面)。

编辑2:查看您链接到的相机代码,您希望使用rotLati(float angle)rotLongi(float angle)函数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/784445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档