Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.14 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include <GL\glut.h>
  4.  
  5. //Угол поворота камеры
  6. float angle = 0.0;
  7. //Координаты вектора направления движения камеры
  8. float lx = 0.0f, lz = -1.0f;
  9. //Координаты позиции камеры
  10. float x = 0.0f, z = 5.0f;
  11. //Флаги изменения положения камеры
  12. //изначально 0 - когда клавиши не нажаты
  13. float deltaAngle = 0.0f;
  14. float deltaMove = 0;
  15.  
  16. //Инициализация освещения
  17. void init() {
  18.     //Цвет фона
  19.     glClearColor(0.5f, 0.5f, 0.5f, 0.0);
  20.     //Включение света
  21.     glEnable(GL_LIGHTING);
  22.     //Рассчет освещения - от наблюдателя
  23.     glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  24.     //Нормирование векторов - нормалей
  25.     glEnable(GL_NORMALIZE);
  26. }
  27.  
  28. //Изменение размеров окна - сохранение пропорций
  29. void changeSize(int w, int h) {
  30.     //Предотвращение деления на ноль
  31.     if (h == 0)
  32.         h = 1;
  33.     float ratio = w * 1.0 / h;
  34.     //Использование матрицы проекции
  35.     glMatrixMode(GL_PROJECTION);
  36.     //Reset матрицы
  37.     glLoadIdentity();
  38.     //Устанавливаем окно
  39.     glViewport(0, 0, w, h);
  40.     //Установка параметров точки зрения
  41.     //Поле зрения и угол в плоскости, соотношение между h и w
  42.     //Ближняя и дальняя граница отсечения
  43.     gluPerspective(45.0f, ratio, 0.1f, 1000.0f);
  44.     //Возвращение к модели
  45.     glMatrixMode(GL_MODELVIEW);
  46. }
  47.  
  48. //Положение камеры
  49. void computePos(float deltaMove)
  50. {
  51.     x += deltaMove * lx * 0.1f;
  52.     z += deltaMove * lz * 0.1f;
  53. }
  54.  
  55. //Направление взгляда
  56. void computeDir(float deltaAngle)
  57. {
  58.     angle += deltaAngle;
  59.     lx = sin(angle);
  60.     lz = -cos(angle);
  61. }
  62.  
  63. //Функция рисования и регистрации обратных вызовов
  64. void renderScene(void) {
  65.     //Обновление ориентации камеры
  66.     if (deltaMove)
  67.         computePos(deltaMove);
  68.     if (deltaAngle)
  69.         computeDir(deltaAngle);
  70.  
  71.     //Очищение буфера кадра и буфера глубины
  72.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  73.     //Свойства материала
  74.     GLfloat material_diffuse[] = { 0.8,0.8,0.0,1.0 };
  75.     //Тип граней, для которых задается материал
  76.     //И диффузный цвет материала
  77.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
  78.  
  79.     //Цвет источника
  80.     GLfloat light1_diffuse[] = { 0.4,0.7,0.2 };
  81.     //Положение источника
  82.     GLfloat light1_position[] = { 0.0,0.0,1.0,1.0 };
  83.     //Включаем точечный источник света
  84.     glEnable(GL_LIGHT1);
  85.     //Определение цвета
  86.     glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
  87.     //Определение позиции
  88.     glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
  89.    
  90.     //Цвет тумана
  91.     GLfloat FogColor[4] = { 0.5,0.5,0.5,1 };
  92.     //Включение тумана
  93.     glEnable(GL_FOG);
  94.     //Тип тумана - режим прорисовки тумана
  95.     glFogi(GL_FOG_MODE, GL_LINEAR);
  96.     //Глубина начала тумана
  97.     glFogf(GL_FOG_START, 20.0);
  98.     //Глубина конца тумана
  99.     glFogf(GL_FOG_END, 100.0);
  100.     //Цвет тумана
  101.     glFogfv(GL_FOG_COLOR, FogColor);
  102.    
  103.     //Считывание текущей матрицы
  104.     glLoadIdentity();
  105.  
  106.     //Установка камеры
  107.     gluLookAt(x, 1.0f, z,
  108.         x + lx, 1.0f, z + lz,
  109.         0.0f, 1.0f, 0.0f);
  110.  
  111.     //Прорисовка поля - поверхность с 4 стенами
  112.     glColor3f(0.9f, 0.9f, 0.9f);
  113.     glBegin(GL_QUADS);
  114.     glVertex3f(-100.0f, 0.0f, -100.0f);
  115.     glVertex3f(-100.0f, 0.0f, 100.0f);
  116.     glVertex3f(100.0f, 0.0f, 100.0f);
  117.     glVertex3f(100.0f, 0.0f, -100.0f);
  118.     glEnd();
  119.  
  120.     glColor3f(0.5f, 0.5f, 0.5f);
  121.     glBegin(GL_QUADS);
  122.     glVertex3f(100.0f, 0.0f, -100.0f);
  123.     glVertex3f(100.0f, 10.0f, -100.0f);
  124.     glVertex3f(-100.0f, 10.0f, -100.0f);
  125.     glVertex3f(-100.0f, 0.0f, -100.0f);
  126.     glEnd();
  127.  
  128.     glColor3f(0.5f, 0.5f, 0.5f);
  129.     glBegin(GL_QUADS);
  130.     glVertex3f(100.0f, 0.0f, 100.0f);
  131.     glVertex3f(100.0f, 10.0f, 100.0f);
  132.     glVertex3f(-100.0f, 10.0f, 100.0f);
  133.     glVertex3f(-100.0f, 0.0f, 100.0f);
  134.     glEnd();
  135.  
  136.     glColor3f(0.5f, 0.5f, 0.5f);
  137.     glBegin(GL_QUADS);
  138.     glVertex3f(100.0f, 0.0f, -100.0f);
  139.     glVertex3f(100.0f, 10.0f, -100.0f);
  140.     glVertex3f(100.0f, 10.0f, 100.0f);
  141.     glVertex3f(100.0f, 0.0f, 100.0f);
  142.     glEnd();
  143.  
  144.     glColor3f(0.5f, 0.5f, 0.5f);
  145.     glBegin(GL_QUADS);
  146.     glVertex3f(-100.0f, 0.0f, 100.0f);
  147.     glVertex3f(-100.0f, 10.0f, 100.0f);
  148.     glVertex3f(-100.0f, 10.0f, -100.0f);
  149.     glVertex3f(-100.0f, 0.0f, -100.0f);
  150.     glEnd();
  151.  
  152.     //Отключения света и тумана
  153.     glDisable(GL_LIGHT1);
  154.     glDisable(GL_FOG);
  155.  
  156.     //Смена буферов - эффект анимации
  157.     glutSwapBuffers();
  158. }
  159.  
  160. //Обработка нажатия клавиш
  161. void pressKey(int key, int xx, int yy) {
  162.     switch (key) {
  163.         //Кнопка влево
  164.     case GLUT_KEY_LEFT:
  165.         deltaAngle = -0.00025f;
  166.         break;
  167.         //Кнопка вправо
  168.     case GLUT_KEY_RIGHT:
  169.         deltaAngle = 0.00025f;
  170.         break;
  171.         //Кнопка вперед
  172.     case GLUT_KEY_UP:
  173.         deltaMove = 0.05f;
  174.         break;
  175.         //Кнопка назад
  176.     case GLUT_KEY_DOWN:
  177.         deltaMove = -0.05f;
  178.         break;
  179.     }
  180. }
  181.  
  182. //Обработка снятия клавиш
  183. void releaseKey(int key, int x, int y) {
  184.  
  185.     switch (key) {
  186.         //Кнопка влево
  187.     case GLUT_KEY_LEFT:
  188.         //Кнопка вправо
  189.     case GLUT_KEY_RIGHT:
  190.         deltaAngle = 0.0f;
  191.         break;
  192.         //Кнопка вперед
  193.     case GLUT_KEY_UP:
  194.         //Кнопка назад
  195.     case GLUT_KEY_DOWN:
  196.         deltaMove = 0;
  197.         break;
  198.     }
  199. }
  200.  
  201. //Главная функция
  202. int main(int argc, char **argv) {
  203.     //Инициализация GLUT
  204.     glutInit(&argc, argv);
  205.     //Режим отображения - буфер глубины, режим двойной буферизации, режим RGBA
  206.     glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  207.     //Положение окна от левого верхнего угла
  208.     glutInitWindowPosition(0, 0);
  209.     //Размеры окна
  210.     glutInitWindowSize(1000, 500);
  211.     //Создание окна с названием
  212.     glutCreateWindow("My Project");
  213.  
  214.     //Инициализация освещения
  215.     init();
  216.     //Регистрация
  217.     glutDisplayFunc(renderScene);
  218.     //Изменение размеров окна
  219.     glutReshapeFunc(changeSize);
  220.     //Регистрация функции обратного вызова
  221.     glutIdleFunc(renderScene);
  222.     //Обработка специальных клавиш
  223.     glutSpecialFunc(pressKey);
  224.  
  225.     //Остановка функции обратного вызова
  226.     //При повторном нажатии
  227.     glutIgnoreKeyRepeat(1);
  228.     //Обработка специальных клавиш
  229.     glutSpecialUpFunc(releaseKey);
  230.  
  231.     //Включение буфера глубины
  232.     glEnable(GL_DEPTH_TEST);
  233.  
  234.     //Главный цикл
  235.     glutMainLoop();
  236.  
  237.     return 1;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement