rotating object

I am trying to rotate a space ship like in asteroids here is the code I am working on.

``````
void DrawShip(GLfloat position_X,GLfloat position_Y, GLfloat position_Z, GLfloat rotation,GLfloat color)
{
glPushMatrix();
glTranslatef(position_X, position_Y, position_Z);
glRotatef(rotation,0.0f,0.0f,1.0f);
glColor3f(color,0.0f,0.0f);
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f,-0.25f,0.0f);
glVertex3f(-0.25f,-0.5f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glVertex3f(-0.0f,0.5f,0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glVertex3f(0.25f,-0.5f,0.0f);
glVertex3f(0.0f,-0.25f,0.0f);
glEnd();
glPopMatrix();
}

``````

I am able to get the ship to move up and down but I want it to follow its nose after rotation.

You should rotate before you translate.

Phil, I recognize that ship…funny. I have the current and full code listing that you posted on gameDev, I’ll be taking a look at it right away. I’m pretty sure what I’ve already posted will do the trick but it still has to be put into the appropriate place. There is now a third page on that thread. I’ve made a slight change in how color is being handled.

Doing that will offset the ship from it’s pivot point, when you rotate it, the ship will orbit as if it’s on a swing arm.

If you want to move the ship (or fire bullets) in the direction it’s facing, you need your own polar-to-cartesian conversion:

``````
x = magnitude * cos(angle)
y = magnitude * sin(angle)

``````

This assumes that angle is counter-clockwise with zero at the positive X axis. Bear in mind that the trigonometry functions in the standard C library use radians while glRotate() uses degrees.

While it’s possible to abuse OpenGL functions to do this for you (using glRotate() and glGet(GL_MODELVIEW_MATRIX)), doing it yourself is trivial and far more efficient (glGet() is expensive).

FWIW, the inverse conversion is:

``````
magnitude = sqrt(x*x+y*y)
angle = atan2(y, x)

``````

Conversion between polar and cartesian coordinates is probably the only trigonometry you’ll ever need for graphics; everything else is normally done using vectors.

cool thanks marc again.

well I have tried several things but I am still stuck. Here is the code I am working on.

``````
void DrawShip(GLfloat position_X,GLfloat position_Y, GLfloat position_Z, GLfloat rotation,GLfloat color)
{
glPushMatrix();
glRotatef(rotation,0.0f,0.0f,1.0f);
glTranslatef(position_X, position_Y, position_Z);
glColor3f(color,0.0f,0.0f);
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f*cos(angle)+0.25f*sin(angle),0.0f*sin(angle)-0.25f*cos(angle),0.0f);
glVertex3f(-0.25f*cos(angle)+0.5f*sin(angle),-0.25f*sin(angle)-0.5f*cos(angle),0.0f);
glVertex3f(-0.5f*cos(angle)+0.5f*sin(angle),-0.5f*sin(angle)-0.5f*cos(angle),0.0f);
glVertex3f(0.0f*cos(angle)-0.5f*sin(angle),0.0f*sin(angle)+0.5f*cos(angle),0.0f);
glVertex3f(0.5f*cos(angle)+0.5f*sin(angle),0.5f*sin(angle)-0.5f*cos(angle),0.0f);
glVertex3f(0.25f*cos(angle)+0.5f*sin(angle),0.25f*sin(angle)-0.5f*cos(angle),0.0f);
glVertex3f(0.0f*cos(angle)+0.25f*sin(angle),0.0f*sin(angle)-0.25f*cos(angle),0.0f);
glEnd();
glPopMatrix();
}

``````

There was nothing wrong with your original code. You just need to set position_X and position_Y correctly.

For an asteroids clone, the update function should look something like:

``````
double angle = (90 - rotation) * M_PI / 180;
speed_X += acceleration * cos(angle);
speed_Y += acceleration * sin(angle);
position_X += speed_X;
position_Y += speed_Y;

``````

[QUOTE=GClements;1252505]If you want to move the ship (or fire bullets) in the direction it’s facing, you need your own polar-to-cartesian conversion:

``````
x = magnitude * cos(angle)
y = magnitude * sin(angle)

``````

This assumes that angle is counter-clockwise with zero at the positive X axis. Bear in mind that the trigonometry functions in the standard C library use radians while glRotate() uses degrees.

While it’s possible to abuse OpenGL functions to do this for you (using glRotate() and glGet(GL_MODELVIEW_MATRIX)), doing it yourself is trivial and far more efficient (glGet() is expensive).

FWIW, the inverse conversion is:

``````
magnitude = sqrt(x*x+y*y)
angle = atan2(y, x)

``````

Conversion between polar and cartesian coordinates is probably the only trigonometry you’ll ever need for graphics; everything else is normally done using vectors.[/QUOTE]

here is my new code

``````
void update(int value)
{
double magnitude = sqrt(ship_01_POSITION_X * ship_01_POSITION_X + ship_01_POSITION_Y * ship_01_POSITION_Y);
double angle = atan2(ship_01_POSITION_Y,ship_01_POSITION_X);
ship_01_POSITION_X = magnitude * cos(angle);
ship_01_POSITION_Y = magnitude * sin(angle);
glutPostRedisplay();
glutTimerFunc(25,update,0);
}

``````

it moves up and down but does not rotate.

This is wrong. The angle should be the direction the ship is facing.

so how do I adjust the angle variable.

Have keys for “rotate right” and “rotate left”. Pressing one causes the angle to increase at a fixed rate, pressing the other causes it to decrease at a fixed rate.

here is the code I am using

``````
void ship_left_two()
{
angle+=2.5f;
}

void ship_right_two()
{
angle-=2.5f;
}

``````

here is the drawing code

``````
void DrawShip(GLfloat position_X,GLfloat position_Y, GLfloat position_Z, GLfloat rotation,GLfloat color)
{
glPushMatrix();
double magnitude = sqrt(position_X * position_X + position_Y * position_Y);
double angle = atan2(position_Y,position_X);
position_X = magnitude * cos(angle);
position_Y = magnitude * sin(angle);
//	double acceleration = sqrt(position_X * position_X + position_Y * position_Y);
//	double angle = atan2(position_Y,position_X);
//	position_X = acceleration * cos(angle);
//	position_Y = acceleration * sin(angle);
//	position_X = speed_X;
//	position_Y = speed_Y;
//	glRotatef(rotation,0.0f,0.0f,1.0f);
glTranslatef(position_X, position_Y, position_Z);
glColor3f(color,0.0f,0.0f);
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f,-0.25f,0.0f);
glVertex3f(-0.25f,-0.5f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glVertex3f(0.0f,0.5f,0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glVertex3f(0.25f,-0.5f,0.0f);
glVertex3f(0.0f,-0.25f,0.0f);
glEnd();
glPopMatrix();
}

``````

I am still a little confused

This doesn’t belong here. The drawing code in your first post was fine.

The issue is how you obtain the position which you pass to the drawing function.