I’m new to OpenGL and I have some 3d shapes and such drawn on my screen. Now this is great but I want to be able to move around. I know that there is no actual camera and such but that you have to move the whole scene.
I already have a fuction that sets the camera orientaion and rotation according to keypress and mouse movement. I currently sets some variables called x, y, z, rx and ry.
So how can I translate these values to change the camera? I was looking up on gluLookAt but was wondering if this is the right function to use and how it would fit in.
gluLookAt is exactly right (especially if your not using core profile).
First 3 parameters are the camera position in world space and the next 3 are where you want the camera to look at. The last 3 are the orientation of the camera which is usually 0 1 0.
If you are using the core profile you’ll have to build the camera (aka modelview matrix) yourself.
I have the camera looking up, down, left and right now using gluLookAt. But when i use WASD to move the camera it spins out of control. Now, I understand that this is because although the camera is moving it is still looking at the same point. How can I make my camera move normally (like in any 3d game)?
Here is my code:
Called once per frame:
gluLookAt(x, y, z, ry, -rx, 1.0f, 0.0f, 1.0f, 0.0f);
// Move forward
x -= sinf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
y -= sinf( -degToRad( rx ) );
z -= cosf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
// Move backward
x += sinf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
y += sinf( -degToRad( rx ) );
z += cosf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
// Strafe left
x += sinf( degToRad( ry - 90) );
z += cosf( degToRad( ry - 90 ) );
// Strafe right
x += sinf( degToRad( ry + 90 ) );
z += cosf( degToRad( ry + 90 ) );
Move move events:
void mouseMoveEvent( float dX, float dY )
// Look left/right
ry -= dX / 100 * 30;
// Look up/down but only in a limited range
rx += dY / 100 * 30;
if( rx > 90 ) rx = 90;
if( rx < -90 ) rx = -90;
void GLFWCALL mouseMoveListener( int x, int y )
if( !running )
mx0 = x; my0 = y;
mouseMoveEvent( (float)(x - mx0), (float)(my0 - y) );
mx0 = x; my0 = y;
DegToRad converts from degrees to radians. This code used to work when using Horde3D.