multiscreendoor.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. #ifdef _WIN32
  11. #define trunc(x) ((double)((int)(x)))
  12. #define random() ((long)rand() + (rand() << 15) + (rand() << 30))
  13. #endif
  14. GLUquadricObj *cone, *base, *qsphere;
  15. GLuint conePattern[32], spherePattern[32];
  16. void create_stipple_pattern(GLuint *pat, GLfloat opacity)
  17. {
  18.   int x, y;
  19.   long threshold = (float)0x7fffffff * (1. - opacity);
  20.   for (y = 0; y < 32; y++) {
  21.     pat[y] = 0;
  22.     for (x = 0; x < 32; x++) {
  23.       if (random() > threshold) pat[y] |= (1 << x);
  24.     }
  25.   }
  26. }
  27. void init(void)
  28. {
  29.   static GLfloat lightpos[] = {.5, .75, 1.5, 1};
  30.   glEnable(GL_DEPTH_TEST); 
  31.   glEnable(GL_LIGHTING);
  32.   glEnable(GL_LIGHT0);
  33.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  34.   cone = gluNewQuadric();
  35.   base = gluNewQuadric();
  36.   qsphere = gluNewQuadric();
  37.   gluQuadricOrientation(base, GLU_INSIDE);
  38.   create_stipple_pattern(spherePattern, .5);
  39.   create_stipple_pattern(conePattern, .5);
  40. }
  41. void reshape(GLsizei w, GLsizei h) 
  42. {
  43.   glViewport(0, 0, w, h);
  44.   
  45.   glMatrixMode(GL_PROJECTION);
  46.   glLoadIdentity();
  47.   gluPerspective(60, 1, .01, 10);
  48.   gluLookAt(0, 0, 2.577, 0, 0, -5, 0, 1, 0);
  49.   
  50.   glMatrixMode(GL_MODELVIEW);
  51.   glLoadIdentity();
  52. }
  53. void draw_room(void)
  54. {
  55.   /* material for the walls, floor, ceiling */
  56.   static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
  57.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  58.   glBegin(GL_QUADS);
  59.   
  60.   /* floor */
  61.   glNormal3f(0, 1, 0);
  62.   glVertex3f(-1, -1, 1);
  63.   glVertex3f(1, -1, 1);
  64.   glVertex3f(1, -1, -1);
  65.   glVertex3f(-1, -1, -1);
  66.   /* ceiling */
  67.   glNormal3f(0, -1, 0);
  68.   glVertex3f(-1, 1, -1);
  69.   glVertex3f(1, 1, -1);
  70.   glVertex3f(1, 1, 1);
  71.   glVertex3f(-1, 1, 1);  
  72.   /* left wall */
  73.   glNormal3f(1, 0, 0);
  74.   glVertex3f(-1, -1, -1);
  75.   glVertex3f(-1, -1, 1);
  76.   glVertex3f(-1, 1, 1);
  77.   glVertex3f(-1, 1, -1);
  78.   /* right wall */
  79.   glNormal3f(-1, 0, 0);
  80.   glVertex3f(1, 1, -1);
  81.   glVertex3f(1, 1, 1);
  82.   glVertex3f(1, -1, 1);
  83.   glVertex3f(1, -1, -1);
  84.   /* far wall */
  85.   glNormal3f(0, 0, 1);
  86.   glVertex3f(-1, -1, -1);
  87.   glVertex3f(1, -1, -1);
  88.   glVertex3f(1, 1, -1);
  89.   glVertex3f(-1, 1, -1);
  90.   glEnd();
  91. }
  92. void draw_cone(void)
  93. {
  94.   static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  95.   glPushMatrix();
  96.   glTranslatef(0, -1, 0);
  97.   glRotatef(-90, 1, 0, 0);
  98.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  99.   gluCylinder(cone, .3, 0, 1.25, 20, 1);
  100.   gluDisk(base, 0., .3, 20, 1); 
  101.   glPopMatrix();
  102. }
  103. void draw_sphere(GLdouble angle)
  104. {
  105.   static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
  106.   glPushMatrix();
  107.   glTranslatef(0, -.3, 0);
  108.   glRotatef(angle, 0, 1, 0);
  109.   glTranslatef(0, 0, .6);
  110.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  111.   gluSphere(qsphere, .3, 20, 20);
  112.   glPopMatrix();
  113. }
  114. GLdouble get_secs(void)
  115. {
  116.   return glutGet(GLUT_ELAPSED_TIME) / 1000.0;
  117. }
  118. void draw(void)
  119. {
  120.     GLenum err;
  121.     GLdouble secs;
  122.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  123.     draw_room();
  124.     /* draw the transparent objects... */
  125.     glEnable(GL_POLYGON_STIPPLE);
  126.     glPolygonStipple((GLubyte *)conePattern);
  127.     draw_cone();
  128.     glPolygonStipple((GLubyte *)spherePattern);
  129.     secs = get_secs();
  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. }