View Full Version : Movement with OpenGL?
Hi!
I have a problem:
To run arround in my Q3-Viewer I do the following calc if the up-key was pressed to move forward in the world:
xpos-= sin(yrot*piover180) * speed;
zpos-= cos(yrot*piover180) * speed;
//yrot is the value I passed into OpenGl
//this way: glRotatef(yrot,0,1,0)
It works perfectly. However if I want to strafe left\right I have to swap sin and cos(at least I calculated this with pencil&paper) but this doesn´t work.
Why?
P.s.:Perhaps I did something wrong ´cause I cannot find a precise definition of the angle
-part of glrotatef(....);
Thanx in advance,XBTC!
Rob The Bloke
09-20-2000, 11:11 AM
A quick thought...
from what I gather, you've split the vector of your motion into:
xpos-= sin(yrot*piover180) * speed;
zpos-= cos(yrot*piover180) * speed;
(I might be wrong here, I'm just scribbling on some paper)
to strafe right try using:
xpos+= sin(yrot*piover180) * speed;
zpos-= cos(yrot*piover180) * speed;
And left:
xpos-= sin(yrot*piover180) * speed;
zpos+= cos(yrot*piover180) * speed;
Thats what my paper reckons......Hope it works http://www.opengl.org/discussion_boards/ubb/smile.gif
pavlos
09-20-2000, 11:17 AM
I think you must also swap the sin-cos :
to strafe right try using:
xpos+= cos(yrot*piover180) * speed;
zpos-= sin(yrot*piover180) * speed;
update:
And perhaps you must clean your code.
If your code works, then you probably using something like that :
glRotate(360-yrot,0,1,0);
I found that because in my code I use glRotate(yrotation,0,1,0); and I walk with :
void walk(float a)
{
position[0] -= (float)sin(yrotation*0.0174532925f) * a*dt;
position[2] += (float)cos(yrotation*0.0174532925f) * a*dt;
}
//speed=a*dt
[This message has been edited by pavlos (edited 09-20-2000).]
Hi!
Thanx guys, I´ll again ask my paper http://www.opengl.org/discussion_boards/ubb/wink.gif to check where I made the fault and try your ideas.
P.s.:I use glRotate(360-yrot,0,1,0) which is the same as glRotate(-yrot,0,1,0).
Greets, XBTC!
I looked at the problem and your solutions are both right:One needs to swap cos\sin and negate one of them to strafe.I just ignored the signs in my drawing.
Thanx for your help!
Greets, XBTC!
[This message has been edited by XBCT (edited 09-23-2000).]
hermes
09-22-2000, 09:12 AM
I walk through a maze in one of my programs and this is what I use to do the strafe:
case '0': //sidestep left
incrementX = sin(Theta*(pi/180)-pi/2) * 0.2;
incrementY = cos(Theta*(pi/180)-pi/2) * 0.2;
tempX = transX - (2*incrementX) + int((gridsize-1)/2);
tempY = transY - (2*incrementY) + int((gridsize-1)/2);
if (maze.showcolor(int((gridsize-1) - tempX),int((gridsize-1) - tempY))>0)
{
transX = transX - incrementX;
transY = transY - incrementY;
}
break;
case '.': //sidestep right
incrementX = sin(Theta*(pi/180)-pi/2) * 0.2;
incrementY = cos(Theta*(pi/180)-pi/2) * 0.2;
tempX = transX + (2*incrementX) + int((gridsize-1)/2);
tempY = transY + (2*incrementY) + int((gridsize-1)/2);
if (maze.showcolor(int((gridsize-1) - tempX),int((gridsize-1) - tempY))>0)
{
transX = transX + incrementX;
transY = transY + incrementY;
}
break;
and it works. I know it's been resolved but it is helpful to see it again sometimes.
CitiZen X
09-22-2000, 02:06 PM
If it makes it easier to under stand, you could simply add 90 degrees and subtract 90 degrees and use the same equation. It adds a little to the computation, but if its easier/faster to get something done versus sitting down a calculating, then you could optimize later.
Thanx guys but hey as I already said it works now, I just dropped a sign in my calculations on paper.
Greets, XBTC!
Powered by vBulletin® Version 4.2.0 Copyright © 2013 vBulletin Solutions, Inc. All rights reserved.