C++ 我的OpenGL相机运动有问题

C++ 我的OpenGL相机运动有问题,c++,opengl,camera,C++,Opengl,Camera,我的OpenGl相机似乎有问题。当我第一次创建它时,一切都很好。然而,自从导入模型和创建对象以来,我注意到奇怪的事情发生了 首先,这是我的运动代码: float xRot = (Pitch / 180 * 3.141592654f), yRot = (Yaw / 180 * 3.141592654f); float sinX = float(sin(xRot)) * myInput.Sensitivity, sinY = float(sin(yRot)) * myInp

我的OpenGl相机似乎有问题。当我第一次创建它时,一切都很好。然而,自从导入模型和创建对象以来,我注意到奇怪的事情发生了

首先,这是我的运动代码:

float xRot = (Pitch / 180 * 3.141592654f),
      yRot = (Yaw / 180 * 3.141592654f);

float sinX = float(sin(xRot)) * myInput.Sensitivity,
      sinY = float(sin(yRot)) * myInput.Sensitivity,
      cosY = float(cos(yRot)) * myInput.Sensitivity;

if(myInput.Keys['W']) //Forwards
{
    curPos.x += sinY;
    curPos.z -= cosY;
    curPos.y += sinX;
}
else if(myInput.Keys['S']) //Backwards
{
    curPos.x -= sinY;
    curPos.z += cosY;
    curPos.y -= sinX;
}

if(myInput.Keys['A']) //Left
{
    curPos.x -= cosY;
    curPos.z -= sinY;
}
else if(myInput.Keys['D']) //Right
{
    curPos.x += cosY;
    curPos.z += sinY;
}

//Move camera up and down
if(myInput.Keys['Q']) 
    curPos.y-= myInput.Sensitivity; //up
else if(myInput.Keys['E']) 
        curPos.y+= myInput.Sensitivity; //down

//Check col
if(curPos.y < 0)
    curPos.y = 0;
else if(curPos.y >= 300) //Gimbal lock encountered
    curPos.y = 299;
基本上我已经注意到,如果相机在Y轴上移动超过300,那么视图开始旋转,如果我在x/z轴上移动太远,同样的情况也会发生


有人能看出我的代码有什么问题吗?当我应该在rad工作时,我是否在deg工作

我没有检查您的代码,但是在使用Euler角度进行三维旋转时,这种问题是臭名昭著的

它被称为(我看到你的代码中有一条注释,表明你意识到了这一点),克服它的最简单方法是切换到使用来计算旋转矩阵


维基上有一篇非常好的OpenGL文章。

该死,我本来不希望这样做的。谢谢:)我明白;-)但是,做过一次之后,它真的会让未来变得很艰难。通过插值四元数(SLERP),您可以直接在保存的位置之间制作各种精美的动画。
double cosR, cosP, cosY;    //temp values for sin/cos from 
double sinR, sinP, sinY;    //the inputed roll/pitch/yaw

cosY = cosf(Yaw*3.1415/180);
cosP = cosf(Pitch*3.1415/180);
cosR = cosf(Roll*3.1415/180);
sinY = sinf(Yaw*3.1415/180);
sinP = sinf(Pitch*3.1415/180);
sinR = sinf(Roll*3.1415/180);

//forward position
forwardPos.x = sinY * cosP*360;
forwardPos.y = sinP * 360;
forwardPos.z = cosP * -cosY*360;

//up position
upPos.x = -cosY * sinR - sinY * sinP * cosR;
upPos.y = cosP * cosR;
upPos.z = -sinY * sinR - sinP * cosR * -cosY;