🎉 Celebrating 25 Years of GameDev.net! 🎉
Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!
Rotation/Translation....help, please
Hi, im pretty new to openGL. Ive just started on a little project on the Nintendo DS, and right now im just trying to create a program that will navigate a 3D environment.
I am following the methods of navigation found in Tutorial 10 on the NeHe site. I have no Trouble Strafing the 'camera' forwards and backwards, or rotating it left and right, the problems arise when i try to strafe left and right, it seems to move diagonally, ive tried editing the code for hours, and searched the internet but i cant find whats wrong.
Here is my (pseudo)code:
//Rotate Left
if L is pressed then
{
y_rotate += 1;
}
//Rotate Right
if R is pressed then
{
y_rotate += 1;
}
//Move/Strafe forwards
if UP is pressed then
{
xposition += SIN[y_rotate && LUT_MASK] >> 4;
zposition -= COS[y_rotate && LUT_MASK] >> 4;
}
//Move/Strafe Backwards
if DOWN is pressed then
{
xposition -= SIN[y_rotate && LUT_MASK] >> 4;
zposition += COS[y_rotate && LUT_MASK] >> 4;
}
//Move/Strafe Right
if RIGHT is pressed then
{
xposition -= SIN[(y_rotate-90) && LUT_MASK] >> 4;
zposition += COS[(y_rotate-90) && LUT_MASK] >> 4;
}
//Move/Strafe Right
if LEFT is pressed then
{
xposition -= SIN[(y_rotate+90) && LUT_MASK] >> 4;
zposition += COS[(y_rotate+90) && LUT_MASK] >> 4;
}
//Then in my DrawGLScene
glRotatef32i((int)(LUT_SIZE - y_rotate),0,(1<<12),0);
glTranslate3f32( (int32)(-xposition/),
0.5f,
(int32)(-zposition)
);
I use this method as opposed to the method in the NeHe example (multiplying by piOver180) as i keep getting error messages when compiling.
By "this method" do you mean all the shifts you're doing?
I haven't looked into what NeHe suggests but I did the following to get a FPS style camera
Vectors: position, left, forward.
Flots: pitch, yaw.
The camera is created by specifying position, pitch, and yaw. An UpdateVectors function computes the correct left and forward vectors (assuming a right-handed system (which OpenGL is)). With UpdateVectors, you only need to use cos & sin when you change pitch and yaw. UpdateVectors calculates the left and forward vectors like this
Then when it comes time to position the camera you rotate pitch degrees around the x direction, then yaw degrees around the y direction, then you translate to the camera position. Hoepfully this helps. My source for those vector calculations was Wolfram's Mathworld: Spherical Coordinates
I haven't looked into what NeHe suggests but I did the following to get a FPS style camera
Vectors: position, left, forward.
Flots: pitch, yaw.
The camera is created by specifying position, pitch, and yaw. An UpdateVectors function computes the correct left and forward vectors (assuming a right-handed system (which OpenGL is)). With UpdateVectors, you only need to use cos & sin when you change pitch and yaw. UpdateVectors calculates the left and forward vectors like this
forward = Vec3(cos(rad_pitch)*sin(rad_yaw), sin(rad_pitch), -cos(rad_yaw)*cos(rad_pitch)); left = Vec3(sin(rad_yaw - pi_over_2), 0, -cos(rad_yaw - pi_over_2));
Then when it comes time to position the camera you rotate pitch degrees around the x direction, then yaw degrees around the y direction, then you translate to the camera position. Hoepfully this helps. My source for those vector calculations was Wolfram's Mathworld: Spherical Coordinates
do that or take a look at this which is from my current (and old)camera class
void FPS_move_add(float forward, float up, float strafe)
{ ca.x+=((float)sin(-ca.h/(180/3.1415f))*forward)-((float)sin(+(ca.h+90)/(180/3.1415f))*strafe);
ca.y+=((float)sin(ca.p/(180/3.1415f))*forward)+up;
ca.z+=(-((float)cos(-ca.h/(180/3.1415f))*forward))-((float)cos(+(ca.h+90)/(180/3.1415f))*strafe);
}
And by the way, you don't really need all those shifts, jeff put in *0.05 so things wouldn't move that fast, but you shouldn't really do it that way, you should use the deltatime*movespeed value, which varies for every frame.
void FPS_move_add(float forward, float up, float strafe)
{ ca.x+=((float)sin(-ca.h/(180/3.1415f))*forward)-((float)sin(+(ca.h+90)/(180/3.1415f))*strafe);
ca.y+=((float)sin(ca.p/(180/3.1415f))*forward)+up;
ca.z+=(-((float)cos(-ca.h/(180/3.1415f))*forward))-((float)cos(+(ca.h+90)/(180/3.1415f))*strafe);
}
And by the way, you don't really need all those shifts, jeff put in *0.05 so things wouldn't move that fast, but you shouldn't really do it that way, you should use the deltatime*movespeed value, which varies for every frame.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement