Xom9ik

Lab_9/15var (IV semester) CG

May 26th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.26 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <iostream>
  4. #include "glut.h"
  5. float magic = 1.618033989f;
  6. float magic2 = 0.618033989f;
  7. float PI = 3.1415926535f;
  8. int faces[12][5] = {{ 0, 16, 2, 10, 8 },    { 0, 8, 4, 14, 12 },    { 16, 17, 1, 12, 0 },   { 1, 9, 11, 3, 17 },{ 1, 12, 14, 5, 9 },    { 2, 13, 15, 6, 10 },   { 13, 3, 17, 16, 2 },   { 3, 11, 7, 15, 13 },   { 4, 8, 10, 6, 18 },    { 14, 5, 19, 18, 4 },   { 5, 19, 7, 11, 9 },    { 15, 7, 19, 18, 6 }};
  9. double points[20][3] = {{ 1, 1, 1 },    { 1, 1, -1 },   { 1, -1, 1 },   { 1, -1, -1 }{ -1, 1, 1 },   { -1, 1, -1 }{ -1, -1, 1 }{ -1, -1, -1 }, { 0, magic2, magic },   { 0, magic2, -magic }{ 0, -magic2, magic }{ 0, -magic2, -magic }, { magic2, magic, 0 },   { magic2, -magic, 0 }{ -magic2, magic, 0 }{ -magic2, -magic, 0 }, { magic, 0, magic2 },   { magic, 0, -magic2 }{ -magic, 0, magic2 }{ -magic, 0, -magic2}};
  10. int angle = 0; // угол вращения
  11. bool flag = false; // флаг статуса отрисовки
  12.  
  13. void init() {
  14.     //rgb(248,227,220)
  15.     glClearColor(0.97, 0.89, 0.86, 1.0); // цвет очистки буферов
  16.     glEnable(GL_DEPTH_TEST); // включаем сортировку по глубине
  17.     glShadeModel(GL_SMOOTH); // режим закрашивания: интерполируемые значения
  18. }
  19.  
  20. void display() {
  21.     flag = true; // мы еще рисуем
  22.     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // очистка рабочих буферов
  23.     std::cout << light_sample << std::endl;
  24.     glPushMatrix(); // начинаем матричные преобразования
  25.     glRotatef(angle, 1, 1, 0); // матрица вращения
  26.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // changed
  27.     for (int i = 0; i < 12; i++) {
  28.         glBegin(GL_TRIANGLE_FAN);
  29.         for (int x = 0; x < 5; x++)
  30.             glVertex3dv(points[faces[i][x]]);
  31.         glEnd();
  32.         glBegin(GL_LINE_STRIP);                                 // changed
  33.         for (int x = 0; x < 5; x++)
  34.             glVertex3dv(points[faces[i][x]]);
  35.         glVertex3dv(points[faces[i][0]]);                       // added
  36.         glEnd();
  37.     }
  38.     glFlush();
  39.  
  40.         // прожектор
  41.         // убывание интенсивности с расстоянием
  42.         // отключено (по умолчанию)
  43.         // половина угла при вершине 30 градусов
  44.         // направление на центр плоскости
  45.         float light3_diffuse[] = { 1.0, 0.33, 0.34, 1 };
  46.         float light3_position[] = { 0.0, 0.0, 1.0, 1.0 };
  47.         float light3_spot_direction[] = { 0.0, 0.0, -1.0 };
  48.         float light3_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // колір дзеркального відображення
  49.         glEnable(GL_LIGHT3);
  50.         glLightfv(GL_LIGHT3, GL_DIFFUSE, light3_diffuse);
  51.         glLightfv(GL_LIGHT3, GL_POSITION, light3_position);
  52.         glLightfv(GL_LIGHT0, GL_SPECULAR, light3_specular);
  53.         glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 30);
  54.         glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, light3_spot_direction);
  55.         glEnable(GL_LIGHT5); // включаем источник света
  56.         glEnable(GL_LIGHTING); // включаем освещение
  57.  
  58.  
  59.     glPushMatrix(); // начинаем матричные преобразования
  60.     glRotatef(angle, 1, 1, 0); // матрица вращения
  61.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  62.     for (int i = 0; i < 12; i++) {
  63.         glBegin(GL_TRIANGLE_FAN);
  64.         for (int x = 0; x < 5; x++)
  65.             glVertex3dv(points[faces[i][x]]);
  66.         glEnd();
  67.         glBegin(GL_LINE_STRIP);
  68.         for (int x = 0; x < 5; x++)
  69.             glVertex3dv(points[faces[i][x]]);
  70.         glVertex3dv(points[faces[i][0]]);
  71.         glEnd();
  72.     }
  73.     glFlush();
  74.     glPopMatrix();          // завершаем матричные преобразования
  75.     glDisable(GL_LIGHT0);   glDisable(GL_LIGHT1);   glDisable(GL_LIGHT2);   glDisable(GL_LIGHT3);   glDisable(GL_LIGHT4);   glDisable(GL_LIGHT5);   glutSwapBuffers();  flag = false;
  76. }
  77.  
  78. void reshape(int w, int h) {
  79.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  80.     glMatrixMode(GL_MODELVIEW);
  81.     glLoadIdentity();
  82.     glMatrixMode(GL_PROJECTION);
  83.     glLoadIdentity();
  84.     // установка перспективы: угол обзора 60 градусов, аспект,
  85.     // глубина пространства 20 единиц
  86.     gluPerspective(60, GLfloat(1.33), 1, 20);
  87.     // установка вектора обзора
  88.     // (0,0,5) камера; (0,0,0) центр сцены, верхом будет ось Y
  89.     gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
  90. }
  91. void key(unsigned char key, int  x, int y) {
  92.     if (key == 'w' || key == 'W') { glRotated(10.0, 0.0, 0.0, 1.0); }
  93.     else if (key == 'a' || key == 'A') { glRotated(10.0, 0.0, -1.0, 0.0); }
  94.     else if (key == 's' || key == 'S') { glRotated(10.0, 0.0, 0.0, -1.0); }
  95.     else if (key == 'd' || key == 'D') { glRotated(10.0, 0.0, 1.0, 0.0); }
  96.     std::cout << key << std::endl;
  97.     glutPostRedisplay();
  98. }
  99. void mytime(int value) {
  100.     angle = (angle>358) ? 0 : angle + 2; // расчет угла
  101.     if (!flag) {
  102.         glutPostRedisplay();
  103.     }
  104.     glutTimerFunc(40, mytime, 0);
  105. }
  106. int main(int argc, char** argv) {
  107.     glutInit(&argc, argv);
  108.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  109.     glutInitWindowSize(800, 600);
  110.     int glWin = glutCreateWindow("My program");
  111.     init();
  112.     glutDisplayFunc(display);
  113.     glutReshapeFunc(reshape);
  114.     glutKeyboardFunc(key);
  115.     glutTimerFunc(40, mytime, 0);
  116.     glutMainLoop();
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment