Split
Split

Reputation: 299

Problems with my OpenGL Camera movement

I seem to be having problems with my OpenGl camera. When I first created it, everything worked fine. However since importing models and creating objects, I've noticed weird things happening.

Firstly, heres my code for movement:

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;

Secondly, heres my movement for calculating gluLookAt:

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;

Basically I've noticed that if the camera goes above 300 in the Y-Axis then the view starts rotating, the same thing happens if I move too far in the x/z axis.

Can anyone see whats wrong with my code? Am I working in deg when I should be working in rad?

Upvotes: 1

Views: 482

Answers (1)

Roger Rowland
Roger Rowland

Reputation: 26279

I haven't checked your code but this type of issue is notorious when using Euler angles for 3D rotations.

It's called gimbal lock (I see you have a comment in your code that shows you're aware of it) and the easiest solution to overcoming it is to switch to using quaternions to calculate your rotation matrices.

There's a really good OpenGL article on the Wiki here.

Upvotes: 2

Related Questions