# 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 dir;
float cosY = cosf(yRotRads);

dir.x = sinf(xRotRads) * cosY;
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);

``````