OCLIP.C
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> // 函数声明 void   drawScene(void), setMatrix(void), animateClipPlane(void), animation(void),   resize(int w, int h), keyboard(unsigned char c, int x, int y); // 全局变量 float ax, ay, az;       // 动画角度 GLUquadricObj *quadObj;  GLdouble planeEqn[] = {0.707, 0.707, 0.0, 0.0};  // 初始化裁剪平面方程 int count = 0; int clip_count = 0; void menu(int choice) {
  2. switch (choice) 
  3. {
  4. case 1:
  5. count = 90;
  6. glutIdleFunc(animation);
  7. break;
  8. case 2:
  9. animateClipPlane();
  10. break;
  11. } } int main(int argc, char **argv) {
  12. glutInit(&argc, argv);
  13. quadObj = gluNewQuadric();  
  14. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  15. glutCreateWindow("Arbitrary clip plane");
  16. ax = 10.0;
  17. ay = -10.0;
  18. az = 0.0;
  19. glutDisplayFunc(drawScene);
  20. glutReshapeFunc(resize);
  21. glutKeyboardFunc(keyboard);
  22. glutCreateMenu(menu);
  23. glutAddMenuEntry("Rotate", 1);
  24. glutAddMenuEntry("Move clip plane", 2);
  25. glutAttachMenu(GLUT_RIGHT_BUTTON);
  26. glutMainLoop();
  27. return 0;            } void drawScene(void) {
  28. glClearColor(0.0, 0.0, 0.0, 0.0);
  29. glClear(GL_COLOR_BUFFER_BIT);
  30. glPushMatrix();
  31. gluQuadricDrawStyle(quadObj, GLU_LINE);
  32. glColor3f(1.0, 1.0, 0.0);
  33. glRotatef(ax, 1.0, 0.0, 0.0);
  34. glRotatef(-ay, 0.0, 1.0, 0.0);
  35. glClipPlane(GL_CLIP_PLANE0, planeEqn);  // 定义裁剪平面
  36. glEnable(GL_CLIP_PLANE0);  // 激活裁剪平面
  37. gluCylinder(quadObj, 4.0, 10.0, 10.0, 20, 8);  // 绘制圆锥体
  38. glDisable(GL_CLIP_PLANE0);
  39. glPopMatrix();
  40. glutSwapBuffers(); } void setMatrix(void) {
  41. glMatrixMode(GL_PROJECTION);
  42. glLoadIdentity();
  43. glOrtho(-15.0, 15.0, -15.0, 15.0, -10.0, 10.0);
  44. glMatrixMode(GL_MODELVIEW);
  45. glLoadIdentity(); } void animation(void)
  46. {
  47. if (count) 
  48. {
  49. ax += 5.0;
  50. ay -= 2.0;
  51. az += 5.0;
  52. if (ax >= 360)
  53. ax = 0.0;
  54. if (ay <= -360)
  55. ay = 0.0;
  56. if (az >= 360)
  57. az = 0.0;
  58. glutPostRedisplay();
  59. count--;
  60. }
  61. if (clip_count) 
  62. {
  63. static int sign = 1;
  64. planeEqn[3] += sign * 0.5;
  65. if (planeEqn[3] > 4.0)
  66. sign = -1;
  67. else if (planeEqn[3] < -4.0)
  68. sign = 1;
  69. glutPostRedisplay();
  70. clip_count--;
  71. }
  72. if (count <= 0 && clip_count <= 0)
  73. glutIdleFunc(NULL); } void animateClipPlane(void) {
  74. clip_count = 5;
  75. glutIdleFunc(animation); } void keyboard(unsigned char c, int x, int y) {
  76. switch (c) 
  77. {
  78. case 27:
  79. exit(0);
  80. break;
  81. default:
  82. break;
  83. } } void resize(int w, int h) {
  84. glViewport(0, 0, w, h);
  85. setMatrix(); }