shape_test.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. #include <GL/glut.h>
  6. float w, h;
  7. GLfloat light_diffuse[] =
  8. {1.0, 1.0, 1.0, 1.0};
  9. GLfloat light_position[] =
  10. {1.0, 1.0, 1.0, 0.0};
  11. GLUquadricObj *qobj;
  12. void
  13. reshape(int nw, int nh)
  14. {
  15.   w = nw;
  16.   h = nh;
  17. }
  18. void
  19. render(int shape)
  20. {
  21.   switch (shape) {
  22.   case 1:
  23.     glPushMatrix();
  24.     glScalef(1.2, 1.2, 1.2);
  25.     glutWireSphere(1.0, 20, 20);
  26.     glPopMatrix();
  27.     break;
  28.   case 10:
  29.     glPushMatrix();
  30.     glScalef(1.2, 1.2, 1.2);
  31.     glEnable(GL_LIGHTING);
  32.     glutSolidSphere(1.0, 20, 20);
  33.     glDisable(GL_LIGHTING);
  34.     glPopMatrix();
  35.     break;
  36.   case 2:
  37.     glPushMatrix();
  38.     glRotatef(-90, 1.0, 0.0, 0.0);
  39.     glutWireCone(1.0, 1.3, 20, 20);
  40.     glPopMatrix();
  41.     break;
  42.   case 11:
  43.     glPushMatrix();
  44.     glRotatef(-90, 1.0, 0.0, 0.0);
  45.     glEnable(GL_LIGHTING);
  46.     glutSolidCone(1.0, 1.3, 20, 20);
  47.     glDisable(GL_LIGHTING);
  48.     glPopMatrix();
  49.     break;
  50.   case 3:
  51.     glPushMatrix();
  52.     glRotatef(-20, 0.0, 0.0, 1.0);
  53.     glScalef(1.8, 1.8, 1.8);
  54.     glutWireCube(1.0);
  55.     glPopMatrix();
  56.     break;
  57.   case 12:
  58.     glPushMatrix();
  59.     glRotatef(-20, 0.0, 0.0, 1.0);
  60.     glScalef(1.8, 1.8, 1.8);
  61.     glEnable(GL_LIGHTING);
  62.     glutSolidCube(1.0);
  63.     glDisable(GL_LIGHTING);
  64.     glPopMatrix();
  65.     break;
  66.   case 4:
  67.     glPushMatrix();
  68.     glScalef(0.9, 0.9, 0.9);
  69.     glutWireTorus(0.5, 1.0, 15, 15);
  70.     glPopMatrix();
  71.     break;
  72.   case 13:
  73.     glPushMatrix();
  74.     glScalef(0.9, 0.9, 0.9);
  75.     glEnable(GL_LIGHTING);
  76.     glutSolidTorus(0.5, 1.0, 15, 15);
  77.     glDisable(GL_LIGHTING);
  78.     glPopMatrix();
  79.     break;
  80.   case 5:
  81.     glPushMatrix();
  82.     glScalef(0.8, 0.8, 0.8);
  83.     glutWireDodecahedron();
  84.     glPopMatrix();
  85.     break;
  86.   case 14:
  87.     glPushMatrix();
  88.     glScalef(0.8, 0.8, 0.8);
  89.     glEnable(GL_LIGHTING);
  90.     glutSolidDodecahedron();
  91.     glDisable(GL_LIGHTING);
  92.     glPopMatrix();
  93.     break;
  94.   case 6:
  95.     glPushMatrix();
  96.     glScalef(0.9, 0.9, 0.9);
  97.     glutWireTeapot(1.0);
  98.     glPopMatrix();
  99.     break;
  100.   case 15:
  101.     glPushMatrix();
  102.     glScalef(0.9, 0.9, 0.9);
  103.     glEnable(GL_LIGHTING);
  104.     glutSolidTeapot(1.0);
  105.     glDisable(GL_LIGHTING);
  106.     glPopMatrix();
  107.     break;
  108.   case 7:
  109.     glutWireOctahedron();
  110.     break;
  111.   case 16:
  112.     glEnable(GL_LIGHTING);
  113.     glutSolidOctahedron();
  114.     glDisable(GL_LIGHTING);
  115.     break;
  116.   case 8:
  117.     glPushMatrix();
  118.     glScalef(1.2, 1.2, 1.2);
  119.     glutWireTetrahedron();
  120.     glPopMatrix();
  121.     break;
  122.   case 17:
  123.     glPushMatrix();
  124.     glScalef(1.2, 1.2, 1.2);
  125.     glEnable(GL_LIGHTING);
  126.     glutSolidTetrahedron();
  127.     glDisable(GL_LIGHTING);
  128.     glPopMatrix();
  129.     break;
  130.   case 9:
  131.     glutWireIcosahedron();
  132.     break;
  133.   case 18:
  134.     glEnable(GL_LIGHTING);
  135.     glutSolidIcosahedron();
  136.     glDisable(GL_LIGHTING);
  137.     break;
  138.   }
  139. }
  140. void
  141. display(void)
  142. {
  143.   int i, j;
  144.   glViewport(0, 0, w, h);
  145.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  146.   for (j = 0; j < 6; j++) {
  147.     for (i = 0; i < 3; i++) {
  148.       glViewport(w / 3 * i, h / 6 * j, w / 3, h / 6);
  149.       render(18 - (j * 3 + (2 - i)));
  150.     }
  151.   }
  152.   glFlush();
  153. }
  154. int
  155. main(int argc, char **argv)
  156. {
  157.   glutInitWindowSize(475, 950);
  158.   glutInit(&argc, argv);
  159.   glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);
  160.   glutCreateWindow("GLUT geometric shapes");
  161.   glutDisplayFunc(display);
  162.   glutReshapeFunc(reshape);
  163.   glClearColor(1.0, 1.0, 1.0, 1.0);
  164.   glColor3f(0.0, 0.0, 0.0);
  165.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  166.   glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  167.   glEnable(GL_LIGHT0);
  168.   glEnable(GL_DEPTH_TEST);
  169.   glMatrixMode(GL_PROJECTION);
  170.   gluPerspective( /* field of view in degree */ 22.0,
  171.   /* aspect ratio */ 1.0,
  172.     /* Z near */ 1.0, /* Z far */ 10.0);
  173.   glMatrixMode(GL_MODELVIEW);
  174.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  175.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  176.     0.0, 1.0, 0.);      /* up is in postivie Y direction */
  177.   glTranslatef(0.0, 0.0, -3.0);
  178.   glRotatef(25, 1.0, 0.0, 0.0);
  179.   glRotatef(5, 0.0, 1.0, 0.0);
  180.   glutMainLoop();
  181.   return 0;             /* ANSI C requires main to return int. */
  182. }