#include #include #include float angle = 0.0, delta_ngle = 0.0, ratio, x = 0.0, y = 1.75, z = 5.0, lx = 0.0, ly = 0.0, lz = -1.0; int delta_move = 0; GLint scene_display_list; void change_size ( int w , int h ) { if ( h == 0 ) h = 1; ratio = 1.0 * w / h; glMatrixMode ( GL_PROJECTION ); glLoadIdentity ( ); glViewport ( 0 , 0 , w , h ); gluPerspective ( 45 , ratio , 1 , 1000 ); glMatrixMode ( GL_MODELVIEW ); glLoadIdentity ( ); gluLookAt ( x , y , z , x + lx , y + ly , z + lz , 0 , 1.0 , 0 ); } GLuint create_display_list ( void ) { GLuint snowman_display_list; // Create the id for the list snowman_display_list = glGenLists ( 1 ); // Start list glNewList ( snowman_display_list , GL_COMPILE ); // Call rendering function draw_snowman ( ); glEndList ( ); return ( snowman_display_list ); } void draw_snowman ( void ) { glColor3f ( 1.0 , 1.0 , 1.0 ); // Body glTranslatef ( 0 , 0.75 , 0 ); glutSolidSphere ( 0.75 , 20 , 20 ); // Head glTranslatef ( 0 , 1.0 , 0 ); glutSolidSphere ( 0.25 , 20 , 20 ); // Eyes glPushMatrix ( ); glColor3f ( 0 , 0 , 0 ); glTranslatef ( 0.05 , 0.10 , 0.18 ); glutSolidSphere ( 0.05 , 10 , 10 ); glTranslatef ( -0.1 , 0 , 0 ); glutSolidSphere ( 0.05 , 10 , 10 ); glPopMatrix ( ); // Nose glColor3f ( 1.0 , 0.5 , 0.5 ); glRotatef ( 0 , 1.0 , 0 , 0 ); glutSolidCone ( 0.08 , 0.5 , 10 , 2 ); } void init_scene ( void ) { glEnable ( GL_DEPTH_TEST ); scene_display_list = create_display_list ( ); } void move_camera_angle ( float angle ) { lx = sin ( angle ); lz = -cos ( angle ); glLoadIdentity ( ); gluLookAt ( x , y , z , x + lx , y + ly , z + lz , 0 , 1 , 0 ); } void move_camera_vertical ( int direction ) { x = x + direction * lx * 0.1; z = z + direction * lz * 0.1; glLoadIdentity ( ); gluLookAt ( x , y , z , x + lx , y + ly , z + lz , 0 , 1 , 0 ); } void process_normal_keys ( unsigned char key , int x , int y ) { switch ( key ) { case 27 : exit ( 0 ); break; } } void process_special_keys ( int key , int x , int y ) { switch ( key ) { case GLUT_KEY_LEFT : angle -= 0.01; move_camera_angle ( angle ); break; case GLUT_KEY_RIGHT : angle -= 0.01; move_camera_angle ( angle ); break; case GLUT_KEY_UP : move_camera_vertical ( 1 ); break; case GLUT_KEY_DOWN : move_camera_vertical ( -1 ); break; } } void render_scene ( void ) { int i, j; glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Draw ground glColor3f ( 0.9 , 0.9 , 0.9 ); glBegin ( GL_QUADS ); glVertex3f ( -100.0 , 0 , -100.0 ); glVertex3f ( -100.0 , 0 , 100.0 ); glVertex3f ( 100.0 , 0 , 100.0 ); glVertex3f ( 100.0 , 0 , -100.0 ); glEnd ( ); // Draw 36 snowmen for ( i = -3; i < 3; i++ ) for ( j = -3; j < 3; j++ ) { glPushMatrix ( ); glTranslatef ( i * 10.0 , 0 , j * 10.0 ); glCallList ( scene_display_list ); glPopMatrix ( ); } glutSwapBuffers ( ); } int main ( int argc , char **argv ) { glutInit ( &argc , argv ); glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowPosition ( 100 , 100 ); glutInitWindowSize ( 640 , 480 ); glutCreateWindow ( "Camera" ); init_scene ( ); glutDisplayFunc ( render_scene ); glutIdleFunc ( render_scene ); glutReshapeFunc ( change_size ); glutKeyboardFunc ( process_normal_keys ); glutSpecialFunc ( process_special_keys ); glutMainLoop ( ); return 0; }