PDA

View Full Version : OpenGL first person camera orientation issues



opiop65
12-28-2012, 06:59 PM
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.

cireneikual
12-28-2012, 08:47 PM
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;
}

opiop65
12-29-2012, 05:30 AM
Well thats makes sense. But what is sinf? Is that the inverse of sin? Also, is the above method just for the y direction?

Dark Photon
12-29-2012, 06:42 AM
Well thats makes sense. But what is sinf? Is that the inverse of sin?

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);