/* * Draw a sun and a planet in orbit around the sun. */ #include #include static int day = 0, year = 0, month = 0; void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); // Draw sun glPushMatrix(); glRotatef(90.0, 1.0, 0.0, 0.0); // Put both poles on Y axis. glutWireSphere(1.0, 20, 16); glPopMatrix(); // Move to planet1 origin glPushMatrix(); glRotatef((GLfloat) year, 0.0, 1.0, 0.0); glTranslatef(5.0, 0.0, 0.0); // Draw planet glPushMatrix(); glRotatef(20.0, 1.0, 0.0, 0.0); // Tilt glRotatef((GLfloat) day, 0.0, 1.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); // Put both poles on Y axis. glutWireSphere(0.2, 10, 8); glPopMatrix(); // Move to moon1 origin and draw it. glPushMatrix(); glRotatef((GLfloat) month, 0.0, 1.0, 0.0); glTranslatef(1.0, 0.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); // Put poles on Y axis. glutWireSphere(0.1, 10, 8); glPopMatrix(); // Move to moon2 origin and draw it. glPushMatrix(); glRotatef((GLfloat) month*2, 0.0, 1.0, 0.0); glTranslatef(0.6, 0.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); // Put poles on Y axis. glutWireSphere(0.05, 10, 8); glPopMatrix(); glPopMatrix(); // Move to planet2 origin and draw it. glPushMatrix(); glRotatef((GLfloat) year * 2.0, 0.0, 1.0, 0.0); glTranslatef(2.5, 0.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); // Put both poles on Y axis. glutWireSphere(0.15, 10, 8); 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(8.0, 2.0, 8.0, // Eye 0.0, 0.0, 0.0, // Center 0.0, 1.0, 0.0); // Up } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'd': day = (day + 10) % 360; glutPostRedisplay(); break; case 'D': day = (day - 10) % 360; glutPostRedisplay(); break; case 'y': year = (year + 5) % 360; glutPostRedisplay(); break; case 'Y': year = (year - 5) % 360; glutPostRedisplay(); break; case 'm': month = (month + 5) % 360; glutPostRedisplay(); break; case 'M': month = (month - 5) % 360; glutPostRedisplay(); break; case 'a': day = (day + 10) % 360; year = (year + 5) % 360; month = (month + 5) % 360; glutPostRedisplay(); break; case 'A': day = (day - 10) % 360; year = (year - 5) % 360; month = (month - 5) % 360; glutPostRedisplay(); break; case 27: exit(0); default: break; } } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }