PDA

View Full Version : Camera question

TheGecko
04-09-2000, 08:49 AM
Hey all....
Ok,suppose I have a camera in my OpenGL world.Now,I use the mouse to rotate the view so I am now looking in different directions.All that stuff works but how do I rotate the camera's translation vectors around?
(I might not be clear here.Suppose I rotate my camera 90degrees to the right.Now ,when I press the UPARROW key,my camera moves to the left instead of forward. How do I go about fixing this?)

dmy
04-09-2000, 09:30 AM
simple fix:
-retrieve the modelview matrix
-consider only the 3x3 rotation inside
-use the three vectors to translate

in code:

float mat[4][4];
glGetFloatv(GL_MODELVIEW_MATRIX,(float *)mat);

#define SPEED 10.0

if(keyright) glTranslatef( +SPEED*mat[0][0], +SPEED*mat[1][0], +SPEED*mat[2][0] );
if(keyleft) glTranslatef( -SPEED*mat[0][0], -SPEED*mat[1][0], -SPEED*mat[2][0] );

if(keyup) glTranslatef( +SPEED*mat[0][1], +SPEED*mat[1][1], +SPEED*mat[2][1] );
if(keydown) glTranslatef( -SPEED*mat[0][1], -SPEED*mat[1][1], -SPEED*mat[2][1] );

if(keyfw) glTranslatef( +SPEED*mat[0][3], +SPEED*mat[1][3], +SPEED*mat[2][3] );
if(keybw) glTranslatef( -SPEED*mat[0][3], -SPEED*mat[1][3], -SPEED*mat[2][3] );

<render>

with this method you consider what the modelview matrix unit vectors really are:
the coordinate frame of your world.
the first row of the matrix tells the X-axis direction, so you have
to translate across this to obtain a correct "strafe".
the same is valid for the other rows.

maybe would be necessary to reverse the order of row and column indexes into mat:
i don't remember wich comes first http://www.opengl.org/discussion_boards/ubb/smile.gif

Dolo/\/\ightY

04-12-2004, 02:04 PM
I know this one. Unfortunately I can get this to work, but not rotation! :)

Set two variables, the X current degree and the
Z current degree (initialize Z to 0, but X to 180)
Also, define a speed factor (I'll call it SF)
then...
You find the angle of rotation (glRotatef(ANGLE,0.0,1.0,0.0)). If you did this right when ANGLE=45 you have rotated 45 degrees from you current spot.(obviously)

Then, when VK_UP (up key) is called enter this tidbit of code:

glTranslatef(sin(X_Current_Degree*(M_PI/180))*SF,
0.0,cos(Z_Current_Degree*(M_PI/180))*SF);

And for VK_DOWN just do this:

glTranslatef(-sin(X_Current_Degree*(M_PI/180))*SF,
0.0,-cos(Z_Current_Degree*(M_PI/180))*SF);

HOPE IT WORKS!!!