Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简单地调用Pitch()和Yaw()怎么可能导致相机最终滚动()?_C++_Opengl_Camera_Glut - Fatal编程技术网

C++ 简单地调用Pitch()和Yaw()怎么可能导致相机最终滚动()?

C++ 简单地调用Pitch()和Yaw()怎么可能导致相机最终滚动()?,c++,opengl,camera,glut,C++,Opengl,Camera,Glut,我正在编写一个基本的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

我正在编写一个基本的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();

}
然而,环顾四周后,你会发现相机开始“滚动”(旋转)。因为我只调用俯仰和偏航,我不明白这是怎么可能的

以下是我在Camera类中使用的代码:

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


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

好吧,如果你开始水平向前看地平线,向上俯仰90度,然后向左偏航90度,然后向下俯仰90度,你会朝着与开始时相同的方向看,但地平线是垂直的(好像你向左滚动了90度)

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


编辑2:查看链接到的摄像头代码,您希望使用
旋转(浮动角度)
旋转(浮动角度)
功能。

俯仰/偏航/侧倾都与车辆方向有关。当你向上/向下俯仰时,你改变了你的偏航轴。同样,当你偏航时,你改变了你的俯仰轴。因此,只要结合俯仰和偏航动作,就有可能以类似于翻滚动作的方式改变你的方向。

我相信这种情况叫做——维基百科页面上有一个例子,上面有插图。

祝贺你——你发现了李群理论

是的,有可能。一系列转变的结果 取决于它们的执行顺序。投球 跟随偏航与跟随偏航不同 以一个音调。事实上,在无穷小雅司病的极限下 和音高,差异相当于一个纯滚动;将军 这个案子有点复杂

(物理学家称之为“对易关系 旋转组“)

如果你熟悉旋转矩阵,你可以算出它
很容易

如果您还没有这样做,您可能需要使用来合成旋转。这避免了通过绕3个轴旋转来定向摄影机时可能遇到的问题


从数学上讲,这是因为三维空间中的旋转不会相互影响。这意味着pitch()后跟yaw()与yaw()后跟pitch()不同,但这一事实的结果是,这三种旋转是密不可分的,如果没有第三种旋转,你无法执行其中任何两种旋转。换句话说,任何俯仰()和偏航()的序列都会随着时间的推移产生明显的滚动()效果,除非序列的后半部分与前半部分完全相反。(这涉及到很多相当复杂的数学运算,但细节并不是特别相关)

如果我开始在屏幕上以紧密的圆圈移动鼠标,你会看到一个明显而缓慢的滚动。它完全360度滚动。这并不是颠倒观点。+1击败了我。如果你在紧密的圆圈中移动鼠标,你会得到少量的滚动。这就是动作组合的工作原理。如果你把我答案中的90换成20,答案还是一样的。在圆圈中移动基本上就是我所描述的。内斯特,基普刚刚解释了如何结合俯仰和偏航来获得滚转的净效果。他的数字被夸大了,以使效果更容易看到——把你的手放在你面前,用它做那些动作。你的鼠标移动得更小,这就是为什么你必须在360度移动之前移动鼠标更多,但这仍然是一个问题。答案是使用四元数。嘿,看起来我们的想法完全一样;-)