#include #define XAXIS (0) #define YAXIS (1) #define ZAXIS (2) static int xangle = 0; static int yangle = 0; static int zangle = 0; static int curaxis = ZAXIS; void drawaxes(void) { glBegin(GL_LINES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 1.0); glEnd(); } void drawBody () { glColor3f (0.6,0.2,0.0); glScalef (1.5,1.0,0.35); glutSolidCube (1.0); } void event_display (void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); switch (curaxis) { case XAXIS: glRotatef ((GLfloat)xangle, 1.0, 0.0, 0.0); break; case YAXIS: glRotatef ((GLfloat)yangle, 0.0, 1.0, 0.0); break; case ZAXIS: glRotatef ((GLfloat)zangle, 0.0, 0.0, 1.0); break; } glPushMatrix(); drawaxes(); drawBody (); glPopMatrix(); glFlush(); } void init (void) { GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0}; GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light_position[] = {-1.0, 1.0, 1.0, 0.0}; // directional source GLfloat mat_ambient[] = {0.2, 0.2, 0.2, 1.0}; // ka GLfloat mat_diffuse[] = {0.8, 0.8, 0.8, 1.0}; // kd GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; // ks GLfloat mat_shininess[] = {50.0}; // n reflection cylin1 = gluNewQuadric(); glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.0); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0); glEnable(GL_LIGHTING); // don't forget this to enable the lighting glEnable(GL_LIGHT0); // this enables the light source glEnable(GL_DEPTH_TEST); // this enables the hidden surface algo glEnable(GL_COLOR_MATERIAL); } void event_reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } void event_keyboard(unsigned char key, int x, int y) { switch (key) { case 'x': curaxis = XAXIS; xangle = 5; glutPostRedisplay(); break; case 'X': curaxis = XAXIS; xangle = -5; glutPostRedisplay(); break; case 'y': curaxis = YAXIS; yangle = 5; glutPostRedisplay(); break; case 'Y': curaxis = YAXIS; yangle = -5; glutPostRedisplay(); break; case 'z': curaxis = ZAXIS; zangle = 5; glutPostRedisplay(); break; case 'Z': curaxis = ZAXIS; zangle = -5; glutPostRedisplay(); break; } } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(275, 150); glutCreateWindow(argv[0]); init(); glutDisplayFunc(event_display); glutReshapeFunc(event_reshape); glutKeyboardFunc(event_keyboard); glutMainLoop(); }