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

GIS编程

开发平台:

Visual C++

  1. /* spin.c */
  2. /*
  3.  * Spinning box.  This program is in the public domain.
  4.  *
  5.  * Brian Paul
  6.  */
  7. /* Conversion to GLUT by Mark J. Kilgard */
  8. #include <math.h>
  9. #include <stdlib.h>
  10. #include <GL/glut.h>
  11. static GLfloat Xrot, Xstep;
  12. static GLfloat Yrot, Ystep;
  13. static GLfloat Zrot, Zstep;
  14. static GLfloat Step = 5.0;
  15. static GLfloat Scale = 1.0;
  16. static GLuint Object;
  17. static GLuint 
  18. make_object(void)
  19. {
  20.   GLuint list;
  21.   list = glGenLists(1);
  22.   glNewList(list, GL_COMPILE);
  23.   glBegin(GL_LINE_LOOP);
  24.   glVertex3f(1.0, 0.5, -0.4);
  25.   glVertex3f(1.0, -0.5, -0.4);
  26.   glVertex3f(-1.0, -0.5, -0.4);
  27.   glVertex3f(-1.0, 0.5, -0.4);
  28.   glEnd();
  29.   glBegin(GL_LINE_LOOP);
  30.   glVertex3f(1.0, 0.5, 0.4);
  31.   glVertex3f(1.0, -0.5, 0.4);
  32.   glVertex3f(-1.0, -0.5, 0.4);
  33.   glVertex3f(-1.0, 0.5, 0.4);
  34.   glEnd();
  35.   glBegin(GL_LINES);
  36.   glVertex3f(1.0, 0.5, -0.4);
  37.   glVertex3f(1.0, 0.5, 0.4);
  38.   glVertex3f(1.0, -0.5, -0.4);
  39.   glVertex3f(1.0, -0.5, 0.4);
  40.   glVertex3f(-1.0, -0.5, -0.4);
  41.   glVertex3f(-1.0, -0.5, 0.4);
  42.   glVertex3f(-1.0, 0.5, -0.4);
  43.   glVertex3f(-1.0, 0.5, 0.4);
  44.   glEnd();
  45.   glEndList();
  46.   return list;
  47. }
  48. static void 
  49. reshape(int width, int height)
  50. {
  51.   glViewport(0, 0, (GLint) width, (GLint) height);
  52.   glMatrixMode(GL_PROJECTION);
  53.   glLoadIdentity();
  54.   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
  55.   glMatrixMode(GL_MODELVIEW);
  56. }
  57. /* ARGSUSED1 */
  58. static void 
  59. key(unsigned char k, int x, int y)
  60. {
  61.   switch (k) {
  62.   case 27:
  63.     exit(0);
  64.   }
  65. }
  66. static void 
  67. draw(void)
  68. {
  69.   glClear(GL_COLOR_BUFFER_BIT);
  70.   glPushMatrix();
  71.   glTranslatef(0.0, 0.0, -10.0);
  72.   glScalef(Scale, Scale, Scale);
  73.   if (Xstep) {
  74.     glRotatef(Xrot, 1.0, 0.0, 0.0);
  75.   } else if (Ystep) {
  76.     glRotatef(Yrot, 0.0, 1.0, 0.0);
  77.   } else {
  78.     glRotatef(Zrot, 0.0, 0.0, 1.0);
  79.   }
  80.   glCallList(Object);
  81.   glPopMatrix();
  82.   glFlush();
  83.   glutSwapBuffers();
  84. }
  85. static void 
  86. idle(void)
  87. {
  88.   Xrot += Xstep;
  89.   Yrot += Ystep;
  90.   Zrot += Zstep;
  91.   if (Xrot >= 360.0) {
  92.     Xrot = Xstep = 0.0;
  93.     Ystep = Step;
  94.   } else if (Yrot >= 360.0) {
  95.     Yrot = Ystep = 0.0;
  96.     Zstep = Step;
  97.   } else if (Zrot >= 360.0) {
  98.     Zrot = Zstep = 0.0;
  99.     Xstep = Step;
  100.   }
  101.   glutPostRedisplay();
  102. }
  103. void 
  104. visible(int vis)
  105. {
  106.   if (vis == GLUT_VISIBLE)
  107.     glutIdleFunc(idle);
  108.   else
  109.     glutIdleFunc(NULL);
  110. }
  111. int
  112. main(int argc, char *argv[])
  113. {
  114.   glutInit(&argc, argv);
  115.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  116.   glutCreateWindow("Spin");
  117.   Object = make_object();
  118.   glCullFace(GL_BACK);
  119.   glDisable(GL_DITHER);
  120.   glShadeModel(GL_FLAT);
  121.   glColor3f(1.0, 1.0, 1.0);
  122.   Xrot = Yrot = Zrot = 0.0;
  123.   Xstep = Step;
  124.   Ystep = Zstep = 0.0;
  125.   glutReshapeFunc(reshape);
  126.   glutKeyboardFunc(key);
  127.   glutVisibilityFunc(visible);
  128.   glutDisplayFunc(draw);
  129.   glutMainLoop();
  130.   return 0;             /* ANSI C requires main to return int. */
  131. }