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

GIS编程

开发平台:

Visual C++

  1. /* This is an OpenGL/GLUT implementation of the "plane" stereo  
  2.    demonstration program found in Appendix 1 of "The CrystalEyes  Handbook"
  3.    by Lenny Lipton, 1991, StereoGraphics Corp.   */
  4. /* Ported to OpenGL/GLUT by Mike Blackwell, mkb@cs.cmu.edu, Oct. 1995.  */
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <GL/glu.h>
  8. #include <GL/glut.h>
  9. #include "fullscreen_stereo.h"
  10. #define SPEED 100      /* How often to update rotation - milliseconds */
  11. #define STEP 1.0       /* How much to rotate - degrees */
  12. double position = 0;    /* Rotation of plane */
  13. /* Clean up and quit */
  14. void
  15. all_done(void)
  16. {
  17.   stop_fullscreen_stereo();
  18.   exit(0);
  19. }
  20. /* ARGSUSED */
  21. void
  22. timer(int value)
  23. {
  24.   position -= STEP;
  25.   if (position < 0.0)
  26.     position = 360.0 - STEP;
  27.   glutPostRedisplay();
  28.   glutTimerFunc(SPEED, timer, 0);
  29. }
  30. /* ARGSUSED1 */
  31. void
  32. keyboard(unsigned char key, int x, int y)
  33. {
  34.   switch (key) {
  35.   case '33':
  36.     all_done();
  37.     break;
  38.   default:
  39.     putchar('07');
  40.     fflush(stdout);
  41.     break;
  42.   }
  43. }
  44. /* This routine performs the perspective projection for one eye's subfield.
  45.    The projection is in the direction of the negative z axis.
  46.    xmin, ymax, ymin, ymax = the coordinate range, in the plane of zero
  47.    parallax setting, that will be displayed on the screen. The ratio between
  48.    (xmax-xmin) and (ymax-ymin) should equal the aspect ration of the display.
  49.    znear, zfar = the z-coordinate values of the clipping planes.
  50.    zzps = the z-coordinate of the plane of zero parallax setting.
  51.    dist = the distance from the center of projection to the plane of zero
  52.    parallax.
  53.    eye = half the eye separation; positive for the right eye subfield,
  54.    negative for the left eye subfield. */
  55. void
  56. stereoproj(float xmin, float xmax, float ymin, float ymax,
  57.   float znear, float zfar, float zzps, float dist, float eye)
  58. {
  59.   float xmid, ymid, clip_near, clip_far, top, bottom, left, right, dx, dy, n_over_d;
  60.   dx = xmax - xmin;
  61.   dy = ymax - ymin;
  62.   xmid = (xmax + xmin) / 2.0;
  63.   ymid = (ymax + ymin) / 2.0;
  64.   clip_near = dist + zzps - znear;
  65.   clip_far = dist + zzps - zfar;
  66.   n_over_d = clip_near / dist;
  67.   top = n_over_d * dy / 2.0;
  68.   bottom = -top;
  69.   right = n_over_d * (dx / 2.0 - eye);
  70.   left = n_over_d * (-dx / 2.0 - eye);
  71.   glMatrixMode(GL_PROJECTION);
  72.   glLoadIdentity();
  73.   glFrustum(left, right, bottom, top, clip_near, clip_far);
  74.   glTranslatef(-xmid - eye, -ymid, -zzps - dist);
  75. }
  76. void
  77. draw_airplane(void)
  78. {
  79.   static float airplane[9][3] =
  80.   {
  81.     {0.0, 0.5, -4.5},
  82.     {3.0, 0.5, -4.5},
  83.     {3.0, 0.5, -3.5},
  84.     {0.0, 0.5, 0.0},
  85.     {0.0, 0.5, 3.25},
  86.     {0.0, -0.5, 5.5},
  87.     {-3.0, 0.5, -3.5},
  88.     {-3.0, 0.5, -4.5},
  89.     {0.0, -0.5, -4.5}
  90.   };
  91.   glColor3ub(0xb0, 0x30, 0xff);  /* Purple color */
  92.   glBegin(GL_LINE_LOOP);
  93.   glVertex3fv(airplane[6]);
  94.   glVertex3fv(airplane[7]);
  95.   glVertex3fv(airplane[1]);
  96.   glVertex3fv(airplane[2]);
  97.   glVertex3fv(airplane[4]);
  98.   glEnd();
  99.   glBegin(GL_LINE_LOOP);
  100.   glVertex3fv(airplane[0]);
  101.   glVertex3fv(airplane[4]);
  102.   glVertex3fv(airplane[5]);
  103.   glVertex3fv(airplane[8]);
  104.   glEnd();
  105.   glBegin(GL_LINE_STRIP);
  106.   glVertex3fv(airplane[6]);
  107.   glVertex3fv(airplane[3]);
  108.   glVertex3fv(airplane[2]);
  109.   glEnd();
  110. }
  111. /* This routine puts a stereo image of a paper airplane onto the screen */
  112. void
  113. redraw(void)
  114. {
  115.   /* Draw left subfield */
  116.   stereo_left_buffer();
  117.   glClearColor(0.07, 0.07, 0.07, 0.00);
  118.   glClear(GL_COLOR_BUFFER_BIT);
  119.   /* Z-coordinate of plane of zero parallax is 0.0. In that plane, the coord
  120.      range drawn to the screen will be
  121.      (-6.0 to 6.0, -4.8 to 4.8).
  122.      Z-coordinate clipping planes are -6.0 and 6.0. The eyes are set at world
  123.      coord distance 14.5 from the plane of zero parallax, and the eye
  124.      separation is 0.62 in world coords. These two values were calculated
  125.      using equations 11 to 15, and 17 to 19 in chapter 5. */
  126.   stereoproj(-6.0, 6.0, -4.8, 4.8, 6.0, -6.0, 0.0, 14.5, -0.31);
  127.   glMatrixMode(GL_MODELVIEW);
  128.   glLoadIdentity();
  129.   glRotatef((float) position, 0.0, 1.0, 0.0);
  130.   glRotatef(-10.0, 1.0, 0.0, 0.0);
  131.   draw_airplane();
  132.   glFlush();
  133.   /* Draw right subfield */
  134.   stereo_right_buffer();
  135.   glClearColor(0.07, 0.07, 0.07, 0.00);
  136.   glClear(GL_COLOR_BUFFER_BIT);
  137.   /* Same as above stereoproj() call, except that eye arg is positive */
  138.   stereoproj(-6.0, 6.0, -4.8, 4.8, 6.0, -6.0, 0.0, 14.5, 0.31);
  139.   glMatrixMode(GL_MODELVIEW);
  140.   glLoadIdentity();
  141.   glRotatef((float) position, 0.0, 1.0, 0.0);
  142.   glRotatef(-10.0, 1.0, 0.0, 0.0);
  143.   draw_airplane();
  144.   glFlush();
  145.   glutSwapBuffers();    /* Update screen */
  146. }
  147. int
  148. main(int argc, char *argv[])
  149. {
  150.   glutInit(&argc, argv);
  151.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  152.   glutCreateWindow("GLUT-based SGI hack stereo demo");
  153.   glutFullScreen();
  154.   glutSetCursor(GLUT_CURSOR_NONE);
  155.   start_fullscreen_stereo();
  156.   glutDisplayFunc(redraw);
  157.   glutKeyboardFunc(keyboard);
  158.   glutTimerFunc(SPEED, timer, 0);
  159.   glEnable(GL_LINE_SMOOTH);
  160.   glEnable(GL_BLEND);
  161.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  162.   glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
  163.   glLineWidth(1.5);
  164.   glutMainLoop();
  165.   return 0;             /* ANSI C requires main to return int. */
  166. }