Hi All,
I met a very odd problem. I using glRotatef() to rotate a cube. My problem is the cube rotates according to one axis, after a while, it rotates according to another axis. I do not change anything at this time. Ater a while, it changes back. Does someone know how to deal with this problem? Many thanks!
This is my code:
#include <iostream.h>
#include <stdio.h>
#include <GL/glut.h>
GLfloat vertices[][3]={
{-1.0,-1.0,1.0},{-1.0,1.0,1.0},{1.0,1.0,1.0},
{1.0,-1.0,1.0},{-1.0,-1.0,-1.0},{-1.0,1.0,-1.0},
{1.0,1.0,-1.0},{1.0,-1.0,-1.0}};
GLfloat colors[][3]={
{1.0,0.0,0.0},{0.0,1.0,1.0},{1.0,1.0,0.0},
{0.0,1.0,0.0},{0.0,0.0,1.0},{1.0,0.0,1.0}};
char key;
bool RotateSign=false, EyeSign=true;
GLfloat Theta=0.0,dx=0.0,dy=0.0,dz=1.0,Eye_x=0.0,Eye_y=0.0,Eye_z=1.0;
void polygon(int a, int b, int c, int d)
{
glColor3fv(colors[a]);
glBegin(GL_POLYGON);
glVertex3fv(vertices[a]);
glVertex3fv(vertices[b]);
glVertex3fv(vertices[c]);
glVertex3fv(vertices[d]);
glEnd();
}
void cube()
{
polygon(0,3,2,1);
polygon(2,3,7,6);
polygon(3,0,4,7);
polygon(1,2,6,5);
polygon(4,5,6,7);
polygon(5,4,0,1);
}
void idle()
{
}
void myidle()
{
Theta=Theta+2.0;
if(Theta>=360) Theta=Theta-360;
glutPostRedisplay();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(Eye_x,Eye_y,Eye_z,0.0,0.0,0.0,0.0,1.0,0.0);
glRotatef(Theta,dx,dy,dz);
cube();
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-4.0,4.0,-4.0,4.0,-4.0,4.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mymouse(int button,int state, int x, int y)
{
if(state==GLUT_DOWN && button==GLUT_LEFT_BUTTON)
{
RotateSign=!RotateSign;
if(RotateSign==true)
glutIdleFunc(myidle);
else glutIdleFunc(idle);
}
if(state==GLUT_DOWN && button==GLUT_RIGHT_BUTTON)
{
EyeSign=!EyeSign;
if(EyeSign==true)
{
Eye_x=0.0;
Eye_y=0.0;
Eye_z=1.0;
}
else
{
Eye_x=1.0;
Eye_y=1.0;
Eye_z=1.0;
}
myidle();
}
}
void mykey(unsigned char key, int x, int y)
{
if(key==‘x’| |key==‘X’)
{
dx=1.0;
dy=0.0;
dz=0.0;
}
if(key=='y'| |key=='Y')
{
dx=0.0;
dy=1.0;
dz=0.0;
}
if(key=='z'| | key=='Z')
{
dx=0.0;
dy=0.0;
dz=1.0;
}
myidle();
}
int main(int argc, char** argv)
{
//intro();
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutCreateWindow(“Assignment6”);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(mykey);
glutMouseFunc(mymouse);
glutMainLoop();
return 0;
}