PDA

View Full Version : Moving problem?



anhyeuem2004
03-31-2004, 09:43 AM
Hi folks,

I am very newbie in OpenGL programming. Currently, I am trying to make a moving cube (forward/backward along z axis and rotate left/right around y axis). My code in display functions as follows:

void display()
{
glLoadIdentity();
glRotatef(spin_y, 0, 1, 0);
glTranslatef(0, 0, dist_z);
glutWireCube(1.0);
glFlush();
}

where spin_y and dist_z can be changed according to key presses. The problem is that If I move the cube forward ot backward then rotate it, then it seems that the cube will not rotate around itself. Rather, it rotates around the "original" origin which is not I expect.

Can anyone have a solution for this problem please?

Thank you very much.

DND

PS: I would like to know how to put 2D texture on 1 surface of my cube created using glutWireCube(). There is no command to specify vertex here, thus I do not know how to put texture coordinate.

nexusone
03-31-2004, 10:10 AM
That is one of the first problems new people have in understanding how the matrix operations work.

OpenGL translate/rotate operations work in reverse.
The order in which you call translate/rotate makes a big diffrence.
All rotations are done around 0,0,0 so they must adjust for this.

void display()
{
glLoadIdentity();
glTranslatef(0, 0, dist_z); // translate along the Z axis.
glRotatef(spin_y, 0, 1, 0); // Rotate around the Cubes axis
glutWireCube(1.0);
glFlush();
}

In my above example the operations work in reverse order.

First the Cube is rotated around 0,0,0; Note just happens on the predrawn glut objects 0,0,0 is there center.

Second the cube is translated on the z-axis.

You can not apply a texture to a glut object, because it does not have texture coordinates and there is no way to add them.

Use glu object instead, see my example of a textured glu object at my website. www.angelfire.com/linux/nexusone. (http://www.angelfire.com/linux/nexusone.)

Or on nehe.gamedev.net has a texture cube demo.

anhyeuem2004
03-31-2004, 05:44 PM
Thank for your answer.

However, I still do not get expected result as if I put glTranslate before glRotate, then, the cube will always move in the same direction (i.e., the "original" z axis here). I want my cube can change forward/backward direction according to rotation transformation so I can move my cube freely any position on (x,z) plane.

Could you give any suggestion on this please?

nexusone
04-01-2004, 02:09 AM
Add a second glRotate.

glRotate //Direction of travel from 0,0,0
glTranslate //Distance from 0,0,0
glRotate //Cube rotation own it axis
Draw_cube();

Note you will want to have one glRotate for each axis.

glRotatef( x_angle, 1,0,0);
glRotatef( y_angle, 0,1,0);
glRotatef( z_angle, 0,0,1);

the other option and a better one is to use vector math a find the point in which to draw it as it movies in some angle out. Lot's of tutors on 3D math on the web.


Originally posted by anhyeuem2004:
Thank for your answer.

However, I still do not get expected result as if I put glTranslate before glRotate, then, the cube will always move in the same direction (i.e., the "original" z axis here). I want my cube can change forward/backward direction according to rotation transformation so I can move my cube freely any position on (x,z) plane.

Could you give any suggestion on this please?