Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.03 KB | None | 0 0
  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3.  
  4. #pragma comment (lib,"opengl32.lib")
  5. #pragma comment (lib,"glu32.lib")
  6. #pragma comment (lib,"glaux.lib")
  7. #pragma comment (lib,"glut32.lib")
  8. /* параметры материала тора */
  9. float mat1_dif[] = { 0.8f,0.8f,0.0f };
  10. float mat1_amb[] = { 0.2f,0.2f,0.2f };
  11. float mat1_spec[] = { 0.6f,0.6f,0.6f };
  12. float mat1_shininess = 0.5f * 128;
  13.  
  14. /* параметры материала конуса */
  15. float mat2_dif[] = { 0.0f,0.0f,0.8f };
  16. float mat2_amb[] = { 0.2f,0.2f,0.2f };
  17. float mat2_spec[] = { 0.6f,0.6f,0.6f };
  18. float mat2_shininess = 0.7f * 128;
  19.  
  20. // Красный
  21. float mat3_dif[] = { 0.9f,0.2f,0.0f };
  22. float mat3_amb[] = { 0.2f,0.2f,0.2f };
  23. float mat3_spec[] = { 0.6f,0.6f,0.6f };
  24. float mat3_shininess = 0.1f * 128;
  25.  
  26. // Зеленый
  27. float mat4_dif[] = { 0.0f,0.8f,0.0f };
  28. float mat4_amb[] = { 0.2f,0.2f,0.2f };
  29. float mat4_spec[] = { 0.6f,0.6f,0.6f };
  30. float mat4_shininess = 0.1f * 128;
  31.  
  32. float rotor1 = 0; // текущий угол вращения планеты по орбите
  33.  
  34. int stop = 0;
  35. int stopcolor = 0;
  36. static int flag;
  37. static int mousex, mousey;
  38. float dd = 1.5;
  39. float dx, dy;
  40.  
  41.  
  42. /* Инициализируем параметры материалов и источника света */
  43. void init(void)
  44. {
  45.     GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
  46.     GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  47.     GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  48.     GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
  49.  
  50.     /* устанавливаем параметры источника света */
  51.     glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  52.     glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  53.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  54.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  55.  
  56.     /* включаем освещение и источник света */
  57.     glEnable(GL_LIGHTING);
  58.     glEnable(GL_LIGHT0);
  59.  
  60.     /* включаем z-буфер */
  61.     glEnable(GL_DEPTH_TEST);
  62.  
  63. }
  64.  
  65. /* Функция вызывается при необходимости
  66. * перерисовки изображения. В ней осуществляется
  67. * весь вывод геометрии.
  68. */
  69. void display(void)
  70. {
  71.     /* очищаем буфер кадра и буфер глубины */
  72.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  73.  
  74.     glPushMatrix();
  75.     glRotatef(dx, 0, 1, 0);
  76.     glRotatef(dy, -1, 0, 0);
  77.  
  78.     /* отображаем круг */
  79.  
  80.     glPushMatrix();
  81.     glRotatef(90.0, 1.0, 0.0, 0.0);
  82.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat1_amb);
  83.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat1_dif);
  84.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat1_spec);
  85.     glMaterialf(GL_FRONT, GL_SHININESS, mat1_shininess);
  86.     GLUquadricObj *obj = gluNewQuadric();
  87.     gluDisk(obj, 0, 1.6, 30, 30);
  88.     glPopMatrix();
  89.  
  90.     /* отображаем стрелку */
  91.     glPushMatrix();
  92.     glRotatef(rotor1, 0.0, 1.0, 0.0);
  93.     glTranslatef(0.0, 0.0, -2);
  94.     glRotatef(1.0, 1.0, 0.0, 0.0);
  95.     if (stop < 10000) {
  96.         glMaterialfv(GL_FRONT, GL_AMBIENT, mat2_amb);
  97.         glMaterialfv(GL_FRONT, GL_DIFFUSE, mat2_dif);
  98.         glMaterialfv(GL_FRONT, GL_SPECULAR, mat2_spec);
  99.         glMaterialf(GL_FRONT, GL_SHININESS, mat2_shininess);
  100.     }
  101.     else {
  102.  
  103.         if (stopcolor == 1) {
  104.             glMaterialfv(GL_FRONT, GL_AMBIENT, mat3_amb);
  105.             glMaterialfv(GL_FRONT, GL_DIFFUSE, mat3_dif);
  106.             glMaterialfv(GL_FRONT, GL_SPECULAR, mat3_spec);
  107.             glMaterialf(GL_FRONT, GL_SHININESS, mat3_shininess);
  108.         }
  109.         else {
  110.             glMaterialfv(GL_FRONT, GL_AMBIENT, mat4_amb);
  111.             glMaterialfv(GL_FRONT, GL_DIFFUSE, mat4_dif);
  112.             glMaterialfv(GL_FRONT, GL_SPECULAR, mat4_spec);
  113.             glMaterialf(GL_FRONT, GL_SHININESS, mat4_shininess);
  114.         }
  115.  
  116.     }
  117.     glutSolidCone(0.1, 1.0, 15, 15);
  118.     glPopMatrix();
  119.  
  120.     glPopMatrix();
  121.     /* выводим сцену на экран */
  122.     glFlush();
  123. }
  124.  
  125. void redraw(void) {
  126.     if (stop < 10000) { rotor1 += 0.1; if (rotor1>360.0) { rotor1 -= 360.0; } stop++; glutPostRedisplay();}
  127.     if (stop >= 10000 && stopcolor == 0) {
  128.         stopcolor = rand() % 2 + 1;
  129.     }
  130. }
  131.  
  132.  
  133. /* Вызывается при изменении пользователем размеров окна */
  134. void reshape(int w, int h)
  135. {
  136.     /* устанавливаем размер области вывода
  137.     * равным размеру окна
  138.     */
  139.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  140.  
  141.     /* задаем матрицу проекции с учетом размеров окна */
  142.     glMatrixMode(GL_PROJECTION);
  143.     glLoadIdentity();
  144.  
  145.     gluPerspective(
  146.         40.0, /* угол зрения в градусах */
  147.         (GLfloat)w / h, /* коэффициент сжатия окна */
  148.         1, 100.0);  /* расстояние до плоскостей отсечения */
  149.     glMatrixMode(GL_MODELVIEW);
  150.  
  151.     glLoadIdentity();
  152.     gluLookAt(
  153.         0.0f, 0.0f, 8.0f, /* положение камеры */
  154.         0.0f, 0.0f, 0.0f, /* центр сцены */
  155.         0.0f, 1.0f, 0.0f); /* положительное направление оси y */
  156. }
  157.  
  158. /* Вызывается при нажатии клавиши на клавиатуре */
  159. void keyboard(unsigned char key, int x, int y)
  160. {
  161.     switch (key) {
  162.     case 27: /* escape */
  163.         exit(0);
  164.         break;
  165.     }
  166. }
  167.  
  168. void mouse(int button, int state, int x, int y)
  169. {
  170.     if (state == GLUT_DOWN) {
  171.         switch (button) {
  172.         case GLUT_LEFT_BUTTON:
  173.             flag = 1;
  174.             break;
  175.         case GLUT_RIGHT_BUTTON:
  176.             break;
  177.         }
  178.     }
  179.     else if (state == GLUT_UP) {
  180.         flag = 0;
  181.     }
  182. }
  183.  
  184. void action(int x, int y)
  185. {
  186.     if (flag == 1) {
  187.         if (x - mousex > 0) { dx += dd; }
  188.         if (x - mousex < 0) { dx -= dd; }
  189.         if (y - mousey < 0) { dy += dd; }
  190.         if (y - mousey > 0) { dy -= dd; }
  191.     }
  192.     mousex = x; mousey = y;
  193.     glutPostRedisplay();
  194. }
  195.  
  196.  
  197. /* Главный цикл приложения */
  198. int main(int argc, char** argv)
  199. {
  200.     glutInit(&argc, argv);
  201.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB
  202.         | GLUT_DEPTH);
  203.     glutInitWindowSize(500, 500);
  204.     glutCreateWindow(argv[0]);
  205.     init();
  206.     glutReshapeFunc(reshape);
  207.     glutDisplayFunc(display);
  208.     glutKeyboardFunc(keyboard);
  209.     glutIdleFunc(redraw);
  210.     glutMouseFunc(mouse);
  211.     glutMotionFunc(action);
  212.     glutMainLoop();
  213.     return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement