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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Main.c
  3.  *
  4.  * This file is part of the openGL-logo demo.
  5.  * (c) Henk Kok (kok@wins.uva.nl)
  6.  *
  7.  * Copying, redistributing, etc is permitted as long as this copyright
  8.  * notice and the Dutch variable names :) stay in tact.
  9.  */
  10. #include <GL/glut.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <math.h>
  14. GLfloat lightpos[4] = { 1.0, 1.0, 1.0, 0.0 };
  15. GLfloat lightamb[4] = { 0.3, 0.3, 0.3, 1.0 };
  16. GLfloat lightdif[4] = { 0.8, 0.8, 0.8, 1.0 };
  17. float speed=0, progress = 1;
  18. void SetCamera(void);
  19. extern void randomize(void);
  20. extern void def_logo(void);
  21. extern void draw_logo(void);
  22. void do_display (void)
  23. {
  24. SetCamera();
  25. draw_logo();
  26. glFlush();
  27. glutSwapBuffers();
  28. }
  29. void display(void)
  30. {
  31. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  32. do_display();
  33. }
  34. void myinit (void)
  35. {
  36. glShadeModel (GL_SMOOTH);
  37. glEnable(GL_DEPTH_TEST);
  38. glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  39. glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
  40. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
  41. glEnable(GL_LIGHTING);
  42. glEnable(GL_LIGHT0);
  43. glColor3f(1.0, 1.0, 1.0);
  44. glClearColor(0.0, 0.0, 0.0, 1.0);
  45. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  46. glEnable(GL_NORMALIZE);
  47. def_logo();
  48. glCullFace(GL_BACK);
  49. glEnable(GL_CULL_FACE);
  50. }
  51. /* ARGSUSED1 */
  52. void parsekey(unsigned char key, int x, int y)
  53. {
  54. switch (key)
  55. {
  56. case 27: exit(0); break;
  57. case 13: break;
  58. case ' ': progress = 1; randomize(); break;
  59. }
  60. }
  61. /* ARGSUSED1 */
  62. void parsekey_special(int key, int x, int y)
  63. {
  64. switch (key)
  65. {
  66. case GLUT_KEY_UP: break;
  67. case GLUT_KEY_DOWN: break;
  68. case GLUT_KEY_RIGHT: break;
  69. case GLUT_KEY_LEFT: break;
  70. }
  71. }
  72. void Animate(void)
  73. {
  74. speed = -0.95*speed + progress*0.05;
  75. if (progress > 0.0 && speed < 0.0003)
  76. speed = 0.0003;
  77. if (speed > 0.01)
  78. speed = 0.01;
  79. progress = progress - speed;
  80. if (progress < 0.0)
  81. {
  82. progress = 0.0;
  83. speed = 0;
  84. }
  85. glutPostRedisplay();
  86. }
  87. void myReshape(int w, int h)
  88. {
  89. glMatrixMode (GL_MODELVIEW);
  90. glViewport (0, 0, w, h);
  91. glLoadIdentity();
  92. SetCamera();
  93. }
  94. void SetCamera(void)
  95. {
  96. glMatrixMode (GL_PROJECTION);
  97. glLoadIdentity ();
  98. glFrustum (-0.1333, 0.1333, -0.1, 0.1, 0.2, 150.0);
  99. glMatrixMode(GL_MODELVIEW);
  100. glLoadIdentity();
  101. gluLookAt(0,1.5,2, 0,1.5,0, 0,1,0);
  102. glTranslatef(0.0, -8.0, -45.0);
  103. glRotatef(-progress*720, 0.0, 1.0, 0.0);
  104. }
  105. int main(int argc, char *argv[])
  106. {
  107. glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE);
  108. glutInitWindowPosition(200, 0);
  109. glutInitWindowSize(640, 480);
  110. glutCreateWindow("Rotating OpenGL Logo");
  111. glutDisplayFunc(display);
  112. glutKeyboardFunc(parsekey);
  113. glutSpecialFunc(parsekey_special);
  114. glutReshapeFunc(myReshape);
  115. glutIdleFunc(Animate);
  116. randomize();
  117. myinit();
  118. glutSwapBuffers();
  119. glutMainLoop();
  120. return 0;             /* ANSI C requires main to return int. */
  121. }