View Full Version : OpenGL Camera
James Lovejoy
05-15-2011, 02:43 PM
Hi,
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.
Thanks,
James
BionicBytes
05-15-2011, 03:36 PM
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.
James Lovejoy
05-16-2011, 10:22 AM
Hi,
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:
keychecker();
gluLookAt(x, y, z, ry, -rx, 1.0f, 0.0f, 1.0f, 0.0f);
keychecker
void keychecker()
{
if (w_pressed)
{
// Move forward
x -= sinf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
y -= sinf( -degToRad( rx ) );
z -= cosf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
}
if(s_pressed)
{
// Move backward
x += sinf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
y += sinf( -degToRad( rx ) );
z += cosf( degToRad( ry ) ) * cosf( -degToRad( rx ) );
}
if(a_pressed)
{
// Strafe left
x += sinf( degToRad( ry - 90) );
z += cosf( degToRad( ry - 90 ) );
}
if(d_pressed)
{
// 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;
return;
}
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.
Thanks,
James
Powered by vBulletin® Version 4.2.0 Copyright © 2013 vBulletin Solutions, Inc. All rights reserved.