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.2 Copyright © 2015 vBulletin Solutions, Inc. All rights reserved.