#include #include #include #include #define TRUE 1 #define FALSE 0 typedef struct vec3 { float x; float y; float z; } vec3; float ball_1_radius = 5.0f; float ball_2_radius = 4.0f; float ball_time = 0; vec3 ball_pos; void init(void) { glShadeModel(GL_SMOOTH); glClearColor(0.2f, 0.2f, 0.4f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat lightPos[4] = {-1.0,1.0,0.5,0.0}; glLightfv(GL_LIGHT0,GL_POSITION,(GLfloat *) &lightPos); glEnable(GL_LIGHT1); GLfloat lightAmbient1[4] = {0.0,0.0,0.0,0.0}; GLfloat lightPos1[4] = {1.0,0.0,-0.2,0.0}; GLfloat lightDiffuse1[4] = {0.5,0.5,0.3,0.0}; glLightfv(GL_LIGHT1,GL_POSITION,(GLfloat *) &lightPos1); glLightfv(GL_LIGHT1,GL_AMBIENT,(GLfloat *) &lightAmbient1); glLightfv(GL_LIGHT1,GL_DIFFUSE,(GLfloat *) &lightDiffuse1); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); } void display(void) { ball_time++; ball_pos.x = cos(ball_time / 50.0) * 5.0f; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glDisable(GL_LIGHTING); glBegin(GL_POLYGON); glColor3f (0.8f, 0.8f, 1.0f); glVertex3f (-200.0f, -100.0f, -100.0f); glVertex3f (200.0f, -100.0f, -100.0f); glColor3f (0.4f, 0.4f, 0.8f); glVertex3f (200.0f, 100.0f, -100.0f); glVertex3f (-200.0f, 100.0f, -100.0f); glEnd(); glEnable (GL_LIGHTING); glTranslatef (0.0f, 6.0f, -25.0f); glPushMatrix(); glTranslatef (ball_pos.x, ball_pos.y, ball_pos.z); glColor3f (1.0f, 1.0f, 0.0f); glutSolidSphere (ball_1_radius, 50, 50); glPopMatrix(); glPushMatrix(); glTranslatef (7.0f, -8.0f, 0.0f); glColor3f (1.0f, 1.0f, 0.0f); glutSolidSphere (ball_2_radius, 50, 50); glPopMatrix(); glutSwapBuffers(); glutPostRedisplay(); } void reshape(int w, int h) { glViewport (0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (h == 0) { gluPerspective (80, (float) w, 1.0, 5000.0); } else { gluPerspective (80, (float)w / (float)h, 1.0, 5000.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard( unsigned char key, int x, int y ) { switch (key) { case 27: exit (0); break; default: break; } } void arrow_keys( int a_keys, int x, int y ) { switch(a_keys) { case GLUT_KEY_UP: glutFullScreen(); break; case GLUT_KEY_DOWN: break; default: break; } } int main (int argc, char *argv[]) { ball_pos.x = 5.0f; ball_pos.y = -8.0f; ball_pos.z = 0.0f; glutInit (&argc, argv); glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize (1280, 720 ); glutCreateWindow ("Marching cubes" ); init(); glutDisplayFunc (display); glutReshapeFunc (reshape); glutKeyboardFunc (keyboard); glutSpecialFunc (arrow_keys); glutMainLoop(); }