/* * planet.c * This program shows how to composite modeling transformations * to draw translated and rotated models. * Interaction: pressing the d and y keys (day and year) * alters the rotation of the planet around the sun. */ #include #include static int year = 0, day = 0; void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glColor3f (1.0, 1.0, 0.0); glutSolidSphere(1.0, 20, 16); /* draw sun */ glPushMatrix(); glRotatef ((GLfloat)(year%360), 0.0, 1.0, 0.0); glTranslatef (2.0, 0.0, 0.0); glRotatef ((GLfloat)(day%360), 0.0, 1.0, 0.0); glColor3f (0.0, 0.0, 1.0); glutSolidSphere(0.2, 10, 8); /* draw blue planet */ glPopMatrix(); glPushMatrix(); glRotatef ((GLfloat)((year/2)%360), 0.0, 1.0, 0.0); glTranslatef (2.5, 0.0, 0.0); glRotatef ((GLfloat)((day/2)%360), 0.0, 1.0, 0.0); glColor3f (1.0, 0.0, 0.0); glutSolidSphere(0.15, 10, 8); /* draw red planet */ glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glEnable(GL_DEPTH_TEST); } void keyboard (unsigned char key, int x, int y) { switch (key) { case 'd': day = (day + 10); glutPostRedisplay(); break; case 'D': day = (day - 10); glutPostRedisplay(); break; case 'y': year = (year + 5); glutPostRedisplay(); break; case 'Y': year = (year - 5); glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (600, 400); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }