# FPS rotation problem

I’m working on a first-person perspective game engine,and I’ve run into a stupid problem.I use glTranslate and glRotate to move my scene around.And it works great.But,when the rotation begins,it is always in relation to the camera’s starting position.The farther away I get from that initial position,the wider my turning circle.I’m pretty sure that I need to track the position of the view and rotate from that new position,but I have no idea how to do it.Any suggestions would be greatly appreciated…

Chris

Here is the code I use; may not do everything you want for example its not flight sim type of movement but it does allow you to move around on a horizontal plane, you change elevation with pageup/pagedown keys - sort works like an elevator.
The first part is the function itself, the second part is the code that is in my rendering thread. This stuff comes from OpenGL Superbible. Have fun!

void UpdatePosition(struct CAMERA *pCamera)
{
float fLinearVelocity = 0.0f;
float fAngularVelocityY = 0.0f;
float fAngularVelocityX = 0.0f;
float fAngularVelocityZ = 0.0f;
float fTime=0;
float fXDelta=0;
float fAngle=0;
float fZDelta= 0;
double fSeconds=0;
float elevation = 0.0f;

``````LARGE_INTEGER currentTime;

// Keyboard Input
// Check for forward or backwards Motion
if(GetAsyncKeyState(VK_UP))
fLinearVelocity = 6.0f;

if(GetAsyncKeyState(VK_DOWN))
fLinearVelocity = -6.0f;
``````

// check for elevation
if(GetAsyncKeyState(VK_NEXT))
elevation = 0.25f;

``````if(GetAsyncKeyState(VK_PRIOR))
elevation = -0.25f;

// Check for spin left/right (Y Axis rotation)
if(GetAsyncKeyState(VK_LEFT))
fAngularVelocityY = -45.0f;

if(GetAsyncKeyState(VK_RIGHT))
fAngularVelocityY = 45.0f;

// Check for looking up and down
if(GetAsyncKeyState(0x41))		// A key
fAngularVelocityX = -9.50f;

if(GetAsyncKeyState(0x5a))		// Z key
fAngularVelocityX = 9.50f;

// Adjust position and orientation. Get the time since the last
// check. If the velocity = 0 (no keypress or mouse movement)
// then the motion will be nil...
// D = vt
QueryPerformanceCounter(&currentTime);
lastTime = currentTime;

``````

// Update Rotation angles (clamp the X rotation)
fAngle = fTime * fAngularVelocityX;
fAngle += pCamera->orientation[0];
if((fAngle < 90.0f) && (fAngle > -90.0f))
pCamera->orientation[0] = fAngle;
pCamera->orientation[1] += fTime * fAngularVelocityY;
// Update linear position
fTime = fTime * fLinearVelocity;
fXDelta += pCamera->position[0];
fZDelta += pCamera->position[2];

``````pCamera-&gt;position[1] += elevation;

pCamera-&gt;position[0] = fXDelta;
pCamera-&gt;position[2] = fZDelta;

// Halt the camera at the boundaries of the Virtual World.

if(pCamera-&gt;position[1] &gt; 40.0f)
pCamera-&gt;position[1] = 40.0f;

if(pCamera-&gt;position[0] &gt; 100.0f)
pCamera-&gt;position[0] = 100.0f;

if(pCamera-&gt;position[0] &lt; -100.0f)
pCamera-&gt;position[0] = -100.0f;

if(pCamera-&gt;position[2] &gt; 100.0f)
pCamera-&gt;position[2] = 100.0f;

if(pCamera-&gt;position[2] &lt; -100.0f)
pCamera-&gt;position[2] = -100.0f;
}
``````

// end of updatecamerpostition

glMatrixMode(GL_MODELVIEW);

glRotatef(cameraData.orientation[0], 1.0f, 0.0f, 0.0f); // look up, down
glRotatef(cameraData.orientation[1], 0.0f, 1.0f, 0.0f); // turn

RenderScene();

Cool! Thanks a lot.I’ll give this a try tonight.

Chris

Make sure you rotate the camera BEFORE you translate the camera.

The rotation is always done with respect to the origin (0, 0, 0), so if you rotate first, then translate, you’ll get the correct result.

Hope that helps (matrix calculations can be such a bitch when you’re first learning them)

I looked back at my original code,and it turns out that I forgot a glLoadIdentity() before I did my translation and rotation.STOOOPPPIDDD!
That fixed my problem.Thanks for the other suggestions,though…