OpenG: 单模型旋转

1.绘制带有光照效果的场景;
2.场景包含3个茶壶,通过键盘1,2,3可以分别选中三个茶壶,然后用鼠标对每个茶壶进行分别的旋转;
3.使用点光源,点光源为白色,以白色的球体表示;
4.使用3个不同的点光源

           i.      光源1的坐标设置在世界坐标系中,并围绕着三个茶壶的中心进行圆周运动;

           ii.     光源2 的坐标 设置在观察坐标系,不发生变化;

           iii.    光源3的坐标设置在茶壶1的物体坐标系中,当茶壶1被选中进行旋转时,光源3要跟随茶壶1 做相同的旋转;

  1. #include <windows.h>
  2. #include <GL/glut.h>
  3. #include <GL/glext.h>
  4. #include <GL/SOIL.h>
  5. #include <cstdio>
  6. GLfloat r1 = 0.0f;
  7. GLfloat r2 = 0.0f;
  8. GLfloat r3 = 0.0f;
  9. GLfloat rlight1 = 0.0f;
  10. GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
  11. GLfloat low_shiniess[] = { 5.0}; // 镜面反射
  12. GLfloat material1[] = { 1.0f, 0.0f, 0.0f, 1.0f};
  13. GLfloat material2[] = { 0.0f, 1.0f, 0.0f, 1.0f};
  14. GLfloat material3[] = { 0.0f, 0.0f, 1.0f, 1.0f};
  15. GLfloat light_position1[] = { 0.0f, 0.0f, 4.0f, 1.0f};
  16. GLfloat light_diffuse1[] = { 1.0f, 1.0f, 1.0f, 1.0f}; //白光
  17. GLfloat light_position2[] = { 1.0f, -2.0f, 1.0f, 1.0f}; //红光
  18. GLfloat light_diffuse2[] = { 1.0f, 0.0f, 0.0f, 1.0f};
  19. GLfloat light_position3[] = { 0.0f, 0.0f, 2.0f, 1.0f};
  20. GLfloat light_diffuse3[] = { 0.0f, 0.0f, 1.0f, 1.0f}; // 蓝光
  21. GLfloat light_specular3[] = { 1.0f, 1.0f, 1.0f, 1.0f};
  22. //漫射光
  23. void init ()
  24. {
  25. glShadeModel(GL_SMOOTH);
  26. glClearColor( 0.0, 0.0, 0.0, 0.0);
  27. glClearDepth( 1.0);
  28. glEnable(GL_DEPTH_TEST);
  29. glDepthFunc(GL_LEQUAL);
  30. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  31. glEnable(GL_LIGHTING);
  32. //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
  33. //glMaterialfv(GL_FRONT,GL_SHININESS,low_shiniess);
  34. }
  35. void reshape(int w,int h)
  36. {
  37. glViewport( 0, 0,(GLsizei)w,(GLsizei)h);
  38. glMatrixMode(GL_PROJECTION);
  39. glLoadIdentity();
  40. gluPerspective( 45.0,(GLfloat)w/(GLfloat)h, 0.1, 100.0);
  41. glMatrixMode(GL_MODELVIEW);
  42. glLoadIdentity();
  43. gluLookAt( 0.0f, 0.0f, 10.0f,
  44. 0.0f, 0.0f, 0.0f,
  45. 0.0f, 1.0f, 0.0f);
  46. }
  47. void display()
  48. {
  49. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  50. glPushMatrix();
  51. glRotated(rlight1, 0.0f, 1.0f, 0.0f);
  52. glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
  53. glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1); //世界坐标系光源
  54. glPopMatrix();
  55. glPushMatrix();
  56. glDisable(GL_LIGHTING);
  57. glRotated(rlight1, 0.0f, 1.0f, 0.0f);
  58. glTranslatef( 0.0f, 0.0f, 4.0f);
  59. glColor3f( 1.0f, 1.0f, 1.0f); //光源1 白光 的小球
  60. glutSolidSphere( 0.05, 10, 10);
  61. glEnable(GL_LIGHTING);
  62. glPopMatrix();
  63. glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
  64. glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2); //观察坐标系光源
  65. glPushMatrix();
  66. glDisable(GL_LIGHTING);
  67. glTranslatef( 1.0f, -2.0f, 1.0f); //光源2 红光的小球
  68. glColor3f( 1.0f, 0.0f, 0.0f);
  69. glutSolidSphere( 0.05, 10, 10);
  70. glEnable(GL_LIGHTING);
  71. glPopMatrix();
  72. //teapot1
  73. glPushMatrix();
  74. glTranslatef( 0.0f, 2.0f, 0.0f);
  75. glRotatef(r1, 0.0f, 1.0f, 0.0f);
  76. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material1);
  77. glLightfv(GL_LIGHT2,GL_POSITION,light_position3);
  78. glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse3);
  79. glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular3); //
  80. glLightf(GL_LIGHT2,GL_SPOT_CUTOFF, 45.0f);
  81. glPushMatrix();
  82. glDisable(GL_LIGHTING);
  83. glTranslated( 0.0f, 0.0f, 2.0f);
  84. glRotatef(r1, 0.0f, 1.0f, 0.0f);
  85. glColor3f( 0.0f, 0.0f, 1.0f); //蓝色光源的小球
  86. glutSolidSphere( 0.05, 10, 10);
  87. glEnable(GL_LIGHTING);
  88. glPopMatrix();
  89. glutSolidTeapot( 1.0f);
  90. glPopMatrix();
  91. //teapot2
  92. glPushMatrix();
  93. glTranslatef( -2.5f, -1.0f, 0.0f);
  94. glRotatef(r2, 1.0f, 0.0f, 0.0f);
  95. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material2);
  96. //glColor3f(1.0f,0.0f,0.0f);
  97. glutSolidTeapot( 1.0f);
  98. glPopMatrix();
  99. //teapot3
  100. glPushMatrix();
  101. glTranslatef( 2.5f, -1.0f, 0.0f);
  102. glRotatef(r3, 0.0f, 0.0f, 1.0f);
  103. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material3);
  104. //glColor3f(1.0f,1.0f,0.0f);
  105. glutSolidTeapot( 1.0f);
  106. glPopMatrix();
  107. glFlush();
  108. }
  109. void mouse_move1(int x,int y)
  110. {
  111. r1+= 10.0f;
  112. glutPostRedisplay();
  113. }
  114. void mouse_move2(int x,int y)
  115. {
  116. r2+= 10.0f;
  117. glutPostRedisplay();
  118. }
  119. void mouse_move3(int x,int y)
  120. {
  121. r3+= 10.0f;
  122. glutPostRedisplay();
  123. }
  124. void rotate1()
  125. {
  126. rlight1+= 1.0f;
  127. if(rlight1> 360.0)
  128. rlight1 = rlight1 -360;
  129. glutPostRedisplay();
  130. }
  131. void keyboard(unsigned char key,int x,int y)
  132. {
  133. switch(key)
  134. {
  135. case '1':
  136. glutMotionFunc(mouse_move1);
  137. break;
  138. case '2':
  139. glutMotionFunc(mouse_move2);
  140. break;
  141. case '3':
  142. glutMotionFunc(mouse_move3);
  143. break;
  144. case 'r':
  145. glutIdleFunc(rotate1);
  146. break;
  147. case 's':
  148. glutIdleFunc( NULL);
  149. break;
  150. case 'a': // light1
  151. glDisable(GL_LIGHT1);
  152. glDisable(GL_LIGHT2);
  153. glEnable(GL_LIGHT0);
  154. glutPostRedisplay();
  155. break;
  156. case 'b': //light2
  157. glDisable(GL_LIGHT0);
  158. glDisable(GL_LIGHT2);
  159. glEnable(GL_LIGHT1);
  160. glutPostRedisplay();
  161. break;
  162. case 'c': //light2
  163. glDisable(GL_LIGHT1);
  164. glDisable(GL_LIGHT0);
  165. glEnable(GL_LIGHT2);
  166. glutPostRedisplay();
  167. break;
  168. }
  169. }
  170. /*void mouse(int button,int state,int x,int y)
  171. {
  172. switch(button){
  173. case GLUT_LEFT_BUTTON:
  174. if(state == GLUT_DOWN)
  175. break;
  176. case GLUT_RIGHT_BUTTON:
  177. if(state == GLUT_DOWN)
  178. break;
  179. }
  180. }*/
  181. int main(int argc,char **argv)
  182. {
  183. printf( "keyboard 1,2,3 choose the teapot mousemove control\n");
  184. printf( "keyboard r light1 rotated, s stop");
  185. glutInit(&argc,argv);
  186. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  187. glutInitWindowSize( 900, 600);
  188. glutInitWindowPosition( 400, 100);
  189. glutCreateWindow( "hello world");
  190. init();
  191. glutDisplayFunc(display);
  192. glutReshapeFunc(reshape);
  193. glutKeyboardFunc(keyboard);
  194. //glutMouseFunc(mouse);
  195. glutMainLoop();
  196. return 0;
  197. }


 

 

猜你喜欢

转载自blog.csdn.net/GUOXIAOHE0000/article/details/80894266