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

OpenGL

开发平台:

Visual C++

  1. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <GL/glut.h> //  函数说明 void  drawScene(void), setMatrix(void), initLightAndMaterial(void),
  2.   animation(void), resize(int w, int h), menu(int choice), 
  3.   keyboard(unsigned char c, int x, int y);
  4. // 全局变量 float ax, ay, az;       // 动画角度 GLUquadricObj *quadObj; // 二次曲面对象 static float lmodel_twoside[] = {GL_TRUE}; static float lmodel_oneside[] = {GL_FALSE}; int main(int argc, char **argv) {
  5. glutInit(&argc, argv);
  6. quadObj = gluNewQuadric();  
  7. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  8. glutCreateWindow("双面光照");
  9. ax = 10.0;
  10. ay = -10.0;
  11. az = 0.0;
  12. initLightAndMaterial();
  13. glutDisplayFunc(drawScene);
  14. glutReshapeFunc(resize);
  15. glutCreateMenu(menu);
  16. glutAddMenuEntry("动画", 3);
  17. glutAddMenuEntry("双面光照", 1);
  18. glutAddMenuEntry("单面光照", 2);
  19. glutAttachMenu(GLUT_RIGHT_BUTTON);
  20. glutKeyboardFunc(keyboard);
  21. glutMainLoop();
  22. return 0;              } void drawScene(void) {
  23. glClearColor(0.0, 0.0, 0.0, 0.0);
  24. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  25. glPushMatrix();
  26. gluQuadricDrawStyle(quadObj, GLU_FILL);
  27. glColor3f(1.0, 1.0, 0.0);
  28. glRotatef(ax, 1.0, 0.0, 0.0);
  29. glRotatef(-ay, 0.0, 1.0, 0.0);
  30. gluCylinder(quadObj, 2.0, 5.0, 10.0, 20, 8);  // 绘制一个圆锥
  31. glPopMatrix();
  32. glutSwapBuffers(); } void setMatrix(void) {
  33. glMatrixMode(GL_PROJECTION);
  34. glLoadIdentity();
  35. glOrtho(-15.0, 15.0, -15.0, 15.0, -10.0, 10.0);
  36. glMatrixMode(GL_MODELVIEW);
  37. glLoadIdentity(); } int count = 0; void animation(void) {
  38. ax += 5.0;
  39. ay -= 2.0;
  40. az += 5.0;
  41. if (ax >= 360)
  42. ax = 0.0;
  43. if (ay <= -360)
  44. ay = 0.0;
  45. if (az >= 360)
  46. az = 0.0;
  47. drawScene();
  48. count++;
  49. if (count >= 60)
  50. glutIdleFunc(NULL); } void keyboard(unsigned char c, int x, int y) {
  51. switch (c) 
  52. {
  53. case 27:
  54. exit(0);
  55. break;
  56. default:
  57. break;
  58. } } void menu(int choice) {
  59. switch (choice) 
  60. {
  61. case 3:
  62. count = 0;
  63. glutIdleFunc(animation);
  64. break;
  65. case 2:
  66. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_oneside);
  67. glutSetWindowTitle("单面光照");
  68. glutPostRedisplay();
  69. break;
  70. case 1:
  71. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  72. glutSetWindowTitle("双面光照");
  73. glutPostRedisplay();
  74. break;
  75. } } void resize(int w, int h) {
  76. glViewport(0, 0, w, h);
  77. setMatrix(); } void initLightAndMaterial(void) {
  78. //  光照于材质参数的数值
  79. static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  80. static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  81. static float position[] = {90.0, 90.0, 150.0, 0.0};
  82. static float front_mat_shininess[] = {60.0};
  83. static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  84. static float front_mat_diffuse[] = {0.5, 0.5, 0.28, 1.0};
  85. static float back_mat_shininess[] = {60.0};
  86. static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  87. static float back_mat_diffuse[] = {1.0, 0.9, 0.2, 1.0};
  88. static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  89. setMatrix();
  90. glEnable(GL_DEPTH_TEST);
  91. glDepthFunc(GL_LEQUAL);
  92. //  设置光照
  93. glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  94. glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  95. glLightfv(GL_LIGHT0, GL_POSITION, position);
  96. //  设置材质
  97. glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  98. glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  99. glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  100. glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  101. glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  102. glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  103. //  设置光照模型
  104. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  105. //  设置双面光照
  106. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  107. //  启动光照
  108. glEnable(GL_LIGHTING);
  109. glEnable(GL_LIGHT0);
  110. glShadeModel(GL_SMOOTH); }