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

GIS编程

开发平台:

Visual C++

  1. #include <GL/glut.h>
  2. #include "stdlib.h"
  3. #include "math.h"
  4. typedef enum {
  5.   RESERVED, BODY_SIDE, BODY_EDGE, BODY_WHOLE, ARM_SIDE, ARM_EDGE, ARM_WHOLE,
  6.   LEG_SIDE, LEG_EDGE, LEG_WHOLE, EYE_SIDE, EYE_EDGE, EYE_WHOLE, DINOSAUR
  7. } displayLists;
  8. /* *INDENT-OFF* */
  9. GLfloat body[][2] = { {0, 3}, {1, 1}, {5, 1}, {8, 4}, {10, 4}, {11, 5},
  10.   {11, 11.5}, {13, 12}, {13, 13}, {10, 13.5}, {13, 14}, {13, 15}, {11, 16},
  11.   {8, 16}, {7, 15}, {7, 13}, {8, 12}, {7, 11}, {6, 6}, {4, 3}, {3, 2},
  12.   {1, 2} };
  13. GLfloat arm[][2] = { {8, 10}, {9, 9}, {10, 9}, {13, 8}, {14, 9}, {16, 9},
  14.   {15, 9.5}, {16, 10}, {15, 10}, {15.5, 11}, {14.5, 10}, {14, 11}, {14, 10},
  15.   {13, 9}, {11, 11}, {9, 11} };
  16. GLfloat leg[][2] = { {8, 6}, {8, 4}, {9, 3}, {9, 2}, {8, 1}, {8, 0.5}, {9, 0},
  17.   {12, 0}, {10, 1}, {10, 2}, {12, 4}, {11, 6}, {10, 7}, {9, 7} };
  18. GLfloat eye[][2] = { {8.75, 15}, {9, 14.7}, {9.6, 14.7}, {10.1, 15},
  19.   {9.6, 15.25}, {9, 15.25} };
  20. GLfloat lightZeroPosition[] = {10.0, 4.0, 10.0, 1.0};
  21. GLfloat lightZeroColor[] = {0.8, 1.0, 0.8, 1.0}; /* green-tinted */
  22. GLfloat lightOnePosition[] = {-1.0, -2.0, 1.0, 0.0};
  23. GLfloat lightOneColor[] = {0.6, 0.3, 0.2, 1.0}; /* red-tinted */
  24. GLfloat skinColor[] = {0.1, 1.0, 0.1, 1.0}, eyeColor[] = {1.0, 0.2, 0.2, 1.0};
  25. /* *INDENT-ON* */
  26. void
  27. extrudeSolidFromPolygon(GLfloat data[][2], unsigned int dataSize,
  28.   GLdouble thickness, GLuint side, GLuint edge, GLuint whole)
  29. {
  30.   static GLUtriangulatorObj *tobj = NULL;
  31.   GLdouble vertex[3], dx, dy, len;
  32.   int i;
  33.   int count = dataSize / (int) (2 * sizeof(GLfloat));
  34.   if (tobj == NULL) {
  35.     tobj = gluNewTess();  /* create and initialize a GLU
  36.                              polygon tesselation object */
  37.     gluTessCallback(tobj, GLU_BEGIN, glBegin);
  38.     gluTessCallback(tobj, GLU_VERTEX, glVertex2fv);  /* semi-tricky */
  39.     gluTessCallback(tobj, GLU_END, glEnd);
  40.   }
  41.   glNewList(side, GL_COMPILE);
  42.   glShadeModel(GL_SMOOTH);  /* smooth minimizes seeing
  43.                                tessellation */
  44.   gluBeginPolygon(tobj);
  45.   for (i = 0; i < count; i++) {
  46.     vertex[0] = data[i][0];
  47.     vertex[1] = data[i][1];
  48.     vertex[2] = 0;
  49.     gluTessVertex(tobj, vertex, data[i]);
  50.   }
  51.   gluEndPolygon(tobj);
  52.   glEndList();
  53.   glNewList(edge, GL_COMPILE);
  54.   glShadeModel(GL_FLAT);  /* flat shade keeps angular hands
  55.                              from being "smoothed" */
  56.   glBegin(GL_QUAD_STRIP);
  57.   for (i = 0; i <= count; i++) {
  58.     /* mod function handles closing the edge */
  59.     glVertex3f(data[i % count][0], data[i % count][1], 0.0);
  60.     glVertex3f(data[i % count][0], data[i % count][1], thickness);
  61.     /* Calculate a unit normal by dividing by Euclidean
  62.        distance. We * could be lazy and use
  63.        glEnable(GL_NORMALIZE) so we could pass in * arbitrary
  64.        normals for a very slight performance hit. */
  65.     dx = data[(i + 1) % count][1] - data[i % count][1];
  66.     dy = data[i % count][0] - data[(i + 1) % count][0];
  67.     len = sqrt(dx * dx + dy * dy);
  68.     glNormal3f(dx / len, dy / len, 0.0);
  69.   }
  70.   glEnd();
  71.   glEndList();
  72.   glNewList(whole, GL_COMPILE);
  73.   glFrontFace(GL_CW);
  74.   glCallList(edge);
  75.   glNormal3f(0.0, 0.0, -1.0);  /* constant normal for side */
  76.   glCallList(side);
  77.   glPushMatrix();
  78.   glTranslatef(0.0, 0.0, thickness);
  79.   glFrontFace(GL_CCW);
  80.   glNormal3f(0.0, 0.0, 1.0);  /* opposite normal for other side */
  81.   glCallList(side);
  82.   glPopMatrix();
  83.   glEndList();
  84. }
  85. void
  86. makeDinosaur(void)
  87. {
  88.   GLfloat bodyWidth = 3.0;
  89.   extrudeSolidFromPolygon(body, sizeof(body), bodyWidth,
  90.     BODY_SIDE, BODY_EDGE, BODY_WHOLE);
  91.   extrudeSolidFromPolygon(arm, sizeof(arm), bodyWidth / 4,
  92.     ARM_SIDE, ARM_EDGE, ARM_WHOLE);
  93.   extrudeSolidFromPolygon(leg, sizeof(leg), bodyWidth / 2,
  94.     LEG_SIDE, LEG_EDGE, LEG_WHOLE);
  95.   extrudeSolidFromPolygon(eye, sizeof(eye), bodyWidth + 0.2,
  96.     EYE_SIDE, EYE_EDGE, EYE_WHOLE);
  97.   glNewList(DINOSAUR, GL_COMPILE);
  98.   glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor);
  99.   glCallList(BODY_WHOLE);
  100.   glPushMatrix();
  101.   glTranslatef(0.0, 0.0, bodyWidth);
  102.   glCallList(ARM_WHOLE);
  103.   glCallList(LEG_WHOLE);
  104.   glTranslatef(0.0, 0.0, -bodyWidth - bodyWidth / 4);
  105.   glCallList(ARM_WHOLE);
  106.   glTranslatef(0.0, 0.0, -bodyWidth / 4);
  107.   glCallList(LEG_WHOLE);
  108.   glTranslatef(0.0, 0.0, bodyWidth / 2 - 0.1);
  109.   glMaterialfv(GL_FRONT, GL_DIFFUSE, eyeColor);
  110.   glCallList(EYE_WHOLE);
  111.   glPopMatrix();
  112.   glEndList();
  113. }
  114. void
  115. drawDinosaur(void) {
  116.     static int first = 1;
  117.     if (first) {
  118. makeDinosaur();
  119. first = 0;
  120.     }
  121.     glCallList(DINOSAUR);
  122. }