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

GIS编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6. /* Some <math.h> files do not define M_PI... */
  7. #ifndef M_PI
  8. #define M_PI 3.14159265358979323846
  9. #endif
  10. #ifndef __sgi
  11. #define trunc(x) ((double)((int)(x)))
  12. #endif
  13. #ifdef _WIN32
  14. #define random() ((long)rand() + (rand() << 15) + (rand() << 30))
  15. #endif
  16. GLUquadricObj *cone, *base, *qsphere;
  17. void create_stipple_pattern(GLuint *pat, GLfloat opacity)
  18. {
  19.   int x, y;
  20.   long threshold = (float)0x7fffffff * (1. - opacity);
  21.   for (y = 0; y < 32; y++) {
  22.     pat[y] = 0;
  23.     for (x = 0; x < 32; x++) {
  24.       if (random() > threshold) pat[y] |= (1 << x);
  25.     }
  26.   }
  27. }
  28. void init(void)
  29. {
  30.   static GLfloat lightpos[] = {.5, .75, 1.5, 1};
  31.   GLuint spherePattern[32];
  32.   glEnable(GL_DEPTH_TEST); 
  33.   glEnable(GL_LIGHTING);
  34.   glEnable(GL_LIGHT0);
  35.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  36.   cone = gluNewQuadric();
  37.   base = gluNewQuadric();
  38.   qsphere = gluNewQuadric();
  39.   gluQuadricOrientation(base, GLU_INSIDE);
  40.   create_stipple_pattern(spherePattern, .5);
  41.   glPolygonStipple((GLubyte *)spherePattern);
  42. }
  43. void reshape(GLsizei w, GLsizei h) 
  44. {
  45.   glViewport(0, 0, w, h);
  46.   
  47.   glMatrixMode(GL_PROJECTION);
  48.   glLoadIdentity();
  49.   gluPerspective(60, 1, .01, 10);
  50.   gluLookAt(0, 0, 2.577, 0, 0, -5, 0, 1, 0);
  51.   
  52.   glMatrixMode(GL_MODELVIEW);
  53.   glLoadIdentity();
  54. }
  55. void draw_room(void)
  56. {
  57.   /* material for the walls, floor, ceiling */
  58.   static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
  59.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  60.   glBegin(GL_QUADS);
  61.   
  62.   /* floor */
  63.   glNormal3f(0, 1, 0);
  64.   glVertex3f(-1, -1, 1);
  65.   glVertex3f(1, -1, 1);
  66.   glVertex3f(1, -1, -1);
  67.   glVertex3f(-1, -1, -1);
  68.   /* ceiling */
  69.   glNormal3f(0, -1, 0);
  70.   glVertex3f(-1, 1, -1);
  71.   glVertex3f(1, 1, -1);
  72.   glVertex3f(1, 1, 1);
  73.   glVertex3f(-1, 1, 1);  
  74.   /* left wall */
  75.   glNormal3f(1, 0, 0);
  76.   glVertex3f(-1, -1, -1);
  77.   glVertex3f(-1, -1, 1);
  78.   glVertex3f(-1, 1, 1);
  79.   glVertex3f(-1, 1, -1);
  80.   /* right wall */
  81.   glNormal3f(-1, 0, 0);
  82.   glVertex3f(1, 1, -1);
  83.   glVertex3f(1, 1, 1);
  84.   glVertex3f(1, -1, 1);
  85.   glVertex3f(1, -1, -1);
  86.   /* far wall */
  87.   glNormal3f(0, 0, 1);
  88.   glVertex3f(-1, -1, -1);
  89.   glVertex3f(1, -1, -1);
  90.   glVertex3f(1, 1, -1);
  91.   glVertex3f(-1, 1, -1);
  92.   glEnd();
  93. }
  94. void draw_cone(void)
  95. {
  96.   static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  97.   glPushMatrix();
  98.   glTranslatef(0, -1, 0);
  99.   glRotatef(-90, 1, 0, 0);
  100.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  101.   gluCylinder(cone, .3, 0, 1.25, 20, 1);
  102.   gluDisk(base, 0., .3, 20, 1); 
  103.   glPopMatrix();
  104. }
  105. void draw_sphere(GLdouble angle)
  106. {
  107.   static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
  108.   glPushMatrix();
  109.   glTranslatef(0, -.3, 0);
  110.   glRotatef(angle, 0, 1, 0);
  111.   glTranslatef(0, 0, .6);
  112.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  113.   gluSphere(qsphere, .3, 20, 20);
  114.   glPopMatrix();
  115. }
  116. GLdouble get_secs(void)
  117. {
  118.   return glutGet(GLUT_ELAPSED_TIME) / 1000.0;
  119. }
  120. void draw(void)
  121. {
  122.     GLenum err;
  123.     GLdouble secs;
  124.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  125.     draw_room();
  126.     draw_cone();
  127.     secs = get_secs();
  128.     /* draw the transparent object... */
  129.     glEnable(GL_POLYGON_STIPPLE);
  130.     draw_sphere(secs * 360. / 10.);
  131.     glDisable(GL_POLYGON_STIPPLE);
  132.     err = glGetError();
  133.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  134.     glutSwapBuffers();
  135. }
  136. /* ARGSUSED1 */
  137. void key(unsigned char key, int x, int y)
  138. {
  139.   if (key == 27) exit(0);
  140. }
  141. main(int argc, char *argv[])
  142. {
  143.     glutInit(&argc, argv);
  144.     glutInitWindowSize(256, 256);
  145.     glutInitWindowPosition(0, 0);
  146.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  147.     glutCreateWindow(argv[0]);
  148.     glutDisplayFunc(draw);
  149.     glutIdleFunc(draw);
  150.     glutKeyboardFunc(key);
  151.     glutReshapeFunc(reshape);
  152.     init();
  153.     glutMainLoop();
  154.     return 0;
  155. }