Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <math.h>
- #include <GL\glut.h>
- //Угол поворота камеры
- float angle = 0.0;
- //Координаты вектора направления движения камеры
- float lx = 0.0f, lz = -1.0f;
- //Координаты позиции камеры
- float x = 0.0f, z = 5.0f;
- //Флаги изменения положения камеры
- //изначально 0 - когда клавиши не нажаты
- float deltaAngle = 0.0f;
- float deltaMove = 0;
- //Инициализация освещения
- void init() {
- //Цвет фона
- glClearColor(0.5f, 0.5f, 0.5f, 0.0);
- //Включение света
- glEnable(GL_LIGHTING);
- //Рассчет освещения - от наблюдателя
- glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
- //Нормирование векторов - нормалей
- glEnable(GL_NORMALIZE);
- }
- //Изменение размеров окна - сохранение пропорций
- void changeSize(int w, int h) {
- //Предотвращение деления на ноль
- if (h == 0)
- h = 1;
- float ratio = w * 1.0 / h;
- //Использование матрицы проекции
- glMatrixMode(GL_PROJECTION);
- //Reset матрицы
- glLoadIdentity();
- //Устанавливаем окно
- glViewport(0, 0, w, h);
- //Установка параметров точки зрения
- //Поле зрения и угол в плоскости, соотношение между h и w
- //Ближняя и дальняя граница отсечения
- gluPerspective(45.0f, ratio, 0.1f, 1000.0f);
- //Возвращение к модели
- glMatrixMode(GL_MODELVIEW);
- }
- //Положение камеры
- void computePos(float deltaMove)
- {
- x += deltaMove * lx * 0.1f;
- z += deltaMove * lz * 0.1f;
- }
- //Направление взгляда
- void computeDir(float deltaAngle)
- {
- angle += deltaAngle;
- lx = sin(angle);
- lz = -cos(angle);
- }
- //Функция рисования и регистрации обратных вызовов
- void renderScene(void) {
- //Обновление ориентации камеры
- if (deltaMove)
- computePos(deltaMove);
- if (deltaAngle)
- computeDir(deltaAngle);
- //Очищение буфера кадра и буфера глубины
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //Свойства материала
- GLfloat material_diffuse[] = { 0.8,0.8,0.0,1.0 };
- //Тип граней, для которых задается материал
- //И диффузный цвет материала
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
- //Цвет источника
- GLfloat light1_diffuse[] = { 0.4,0.7,0.2 };
- //Положение источника
- GLfloat light1_position[] = { 0.0,0.0,1.0,1.0 };
- //Включаем точечный источник света
- glEnable(GL_LIGHT1);
- //Определение цвета
- glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
- //Определение позиции
- glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
- //Цвет тумана
- GLfloat FogColor[4] = { 0.5,0.5,0.5,1 };
- //Включение тумана
- glEnable(GL_FOG);
- //Тип тумана - режим прорисовки тумана
- glFogi(GL_FOG_MODE, GL_LINEAR);
- //Глубина начала тумана
- glFogf(GL_FOG_START, 20.0);
- //Глубина конца тумана
- glFogf(GL_FOG_END, 100.0);
- //Цвет тумана
- glFogfv(GL_FOG_COLOR, FogColor);
- //Считывание текущей матрицы
- glLoadIdentity();
- //Установка камеры
- gluLookAt(x, 1.0f, z,
- x + lx, 1.0f, z + lz,
- 0.0f, 1.0f, 0.0f);
- //Прорисовка поля - поверхность с 4 стенами
- glColor3f(0.9f, 0.9f, 0.9f);
- glBegin(GL_QUADS);
- glVertex3f(-100.0f, 0.0f, -100.0f);
- glVertex3f(-100.0f, 0.0f, 100.0f);
- glVertex3f(100.0f, 0.0f, 100.0f);
- glVertex3f(100.0f, 0.0f, -100.0f);
- glEnd();
- glColor3f(0.5f, 0.5f, 0.5f);
- glBegin(GL_QUADS);
- glVertex3f(100.0f, 0.0f, -100.0f);
- glVertex3f(100.0f, 10.0f, -100.0f);
- glVertex3f(-100.0f, 10.0f, -100.0f);
- glVertex3f(-100.0f, 0.0f, -100.0f);
- glEnd();
- glColor3f(0.5f, 0.5f, 0.5f);
- glBegin(GL_QUADS);
- glVertex3f(100.0f, 0.0f, 100.0f);
- glVertex3f(100.0f, 10.0f, 100.0f);
- glVertex3f(-100.0f, 10.0f, 100.0f);
- glVertex3f(-100.0f, 0.0f, 100.0f);
- glEnd();
- glColor3f(0.5f, 0.5f, 0.5f);
- glBegin(GL_QUADS);
- glVertex3f(100.0f, 0.0f, -100.0f);
- glVertex3f(100.0f, 10.0f, -100.0f);
- glVertex3f(100.0f, 10.0f, 100.0f);
- glVertex3f(100.0f, 0.0f, 100.0f);
- glEnd();
- glColor3f(0.5f, 0.5f, 0.5f);
- glBegin(GL_QUADS);
- glVertex3f(-100.0f, 0.0f, 100.0f);
- glVertex3f(-100.0f, 10.0f, 100.0f);
- glVertex3f(-100.0f, 10.0f, -100.0f);
- glVertex3f(-100.0f, 0.0f, -100.0f);
- glEnd();
- //Отключения света и тумана
- glDisable(GL_LIGHT1);
- glDisable(GL_FOG);
- //Смена буферов - эффект анимации
- glutSwapBuffers();
- }
- //Обработка нажатия клавиш
- void pressKey(int key, int xx, int yy) {
- switch (key) {
- //Кнопка влево
- case GLUT_KEY_LEFT:
- deltaAngle = -0.00025f;
- break;
- //Кнопка вправо
- case GLUT_KEY_RIGHT:
- deltaAngle = 0.00025f;
- break;
- //Кнопка вперед
- case GLUT_KEY_UP:
- deltaMove = 0.05f;
- break;
- //Кнопка назад
- case GLUT_KEY_DOWN:
- deltaMove = -0.05f;
- break;
- }
- }
- //Обработка снятия клавиш
- void releaseKey(int key, int x, int y) {
- switch (key) {
- //Кнопка влево
- case GLUT_KEY_LEFT:
- //Кнопка вправо
- case GLUT_KEY_RIGHT:
- deltaAngle = 0.0f;
- break;
- //Кнопка вперед
- case GLUT_KEY_UP:
- //Кнопка назад
- case GLUT_KEY_DOWN:
- deltaMove = 0;
- break;
- }
- }
- //Главная функция
- int main(int argc, char **argv) {
- //Инициализация GLUT
- glutInit(&argc, argv);
- //Режим отображения - буфер глубины, режим двойной буферизации, режим RGBA
- glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
- //Положение окна от левого верхнего угла
- glutInitWindowPosition(0, 0);
- //Размеры окна
- glutInitWindowSize(1000, 500);
- //Создание окна с названием
- glutCreateWindow("My Project");
- //Инициализация освещения
- init();
- //Регистрация
- glutDisplayFunc(renderScene);
- //Изменение размеров окна
- glutReshapeFunc(changeSize);
- //Регистрация функции обратного вызова
- glutIdleFunc(renderScene);
- //Обработка специальных клавиш
- glutSpecialFunc(pressKey);
- //Остановка функции обратного вызова
- //При повторном нажатии
- glutIgnoreKeyRepeat(1);
- //Обработка специальных клавиш
- glutSpecialUpFunc(releaseKey);
- //Включение буфера глубины
- glEnable(GL_DEPTH_TEST);
- //Главный цикл
- glutMainLoop();
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement