OpenGL first person camera orientation issues

I have a “camera” in my opengl program that I recently finished. However, I’ve noticed that whenever I rotate and then move again, the x, y, and z angles change. For example, when I press the “w” key, I move forward along the “z” axis. If I then rotate the camera 90 degrees, when I push the “W” key, I will actually be moving right, seemingly along the “x” axis. It makes sense why this happens, I’m just wondering why its happening. Here’s the rotation function:

private void camera() {
		glRotatef(xrot, 1.0f, 0.0f, 0.0f);
		glRotatef(yrot, 0.0f, 1.0f, 0.0f);
	}

The keyboard function:

 if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
			xpos -= 0.035 * delta;
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
			xpos += 0.035 * delta;
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
			zpos += 0.03f * delta;
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
			zpos -= 0.035 * delta;
		}
    if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
			xrot += 0.035;
			if (xrot > 360) {
				xrot -= 360;
			}
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
			xrot -= 0.035;
			if (xrot > 360) {
				xrot += 360;
			}
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
			yrot += 0.035;
			if (xrot > 360) {
				xrot -= 360;
			}
		}

		if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
			yrot -= 0.035;
			if (xrot > 360) {
				xrot += 360;
			}

		}

And my translate function:

glTranslated(xpos, ypos, zpos - 30);

any ideas on how to solve this? I would be very grateful.

You are moving it along the axes, not along the view direction. Increment the position by the view direction vector. You can get it using the x and y angles, or you can extract it from the view matrix.The 3rd row is the negated view direction. So you can do:


float matrix[16];glGetFloatv(GL_MODELVIEW_MATRIX, matrix)


Vector3 viewVec = Vector3(-matrix[2], -matrix[6], -matrix[10]);

or:


Vector3 RotationToVector(float xRotRads, float yRotRads)
{
    Vector3 dir;
    float cosY = cosf(yRotRads);


    dir.x = sinf(xRotRads) * cosY;
    dir.y = -sinf(yRotRads);
    dir.z = cosf(xRotRads) * cosY;


    return dir;
}

Well thats makes sense. But what is sinf? Is that the inverse of sin? Also, is the above method just for the y direction?

It’s just the 32-bit float version of sin(). Check your man pages or standard C library docs:


       double sin(double x);
       float sinf(float x);
       long double sinl(long double x);