ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1687
Скачиваний: 4
116
*/
glPushMatrix();
glTranslatef (0,0,-RingHeight/2);
DrawRing();
glPopMatrix();
glPushMatrix();
glTranslatef (0,RingHeight/2,0);
glRotatef (90,1,0,0);
DrawRing();
glPopMatrix();
glPushMatrix();
glTranslatef (-RingHeight/2,0,0);
glRotatef (90,0,1,0);
DrawRing();
glPopMatrix();
/*
Восстанавливаем
матрицу
для
поворотов
тераэдра
*/
glPopMatrix();
/*
Выключаем
режим
наложения
текстуры
*/
glDisable(GL_TEXTURE_2D);
/*
Проводим
повороты
*/
glRotatef (CurAng,1,0,0);
glRotatef (CurAng/2,1,0,1);
/*
Чтобы
тетраэдр
вращался
вокруг
центра
,
его
*
надо
сдвинуть
вниз
по
оси
oz
*/
glTranslatef (0,-0.33,0);
/*
Задаем
цвет
диффузного
отражения
для
тетраэдра
*/
glColor3fv(mat_diff2);
/*
Проводим
построение
тетраэдра
*/
glCallList(TETR_LIST);
}
void Display(void)
{
/*
Инициализация
(
очистка
)
текущего
буфера
кадра
и
*
глубины
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*
Построение
объектов
*/
DrawFigures();
/*
Перестановка
буферов
кадра
*/
glutSwapBuffers();
}
void Redraw(void)
{
/*
Увеличение
текущего
угла
поворота
*/
117
CurAng+=1;
/*
Сигнал
для
вызова
процедуры
создания
*
изображения
(
для
обновления
)
*/
glutPostRedisplay();
}
int main(int argc, char **argv)
{
/*
Инициализация
функций
библиотеки
GLUT */
glutInit(&argc, argv);
/*
Задание
режима
с
двойной
буферизацией
,
*
представление
цвета
в
формате
RGB,
использование
*
буфера
глубины
*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |
GLUT_DEPTH);
/*
Создание
окна
приложения
*/
glutCreateWindow("Example of using OpenGL");
/*
Регистрация
функции
построения
изображения
*/
glutDisplayFunc(Display);
/*
Регистрация
функции
обновления
изображения
*/
glutIdleFunc(Redraw);
/*
Инициализация
функций
OpenGL */
Init();
/*
Цикл
обработки
событий
*/
glutMainLoop();
return 0;
}
118
Приложение
E.
Примеры
практических
заданий
E.1. Cornell Box
Целью
задания
является
создание
изображения
заданной
трехмерной
статичной
сцены
средствами
OpenGL
с
использованием
,
возможно
,
стандартных
геометрических
примитивов
.
Требуется
создать
изображение
сцены
Cornell Box.
Эта
классическая
сцена
представляет
собой
комнату
кубического
вида
,
с
отсутствующей
передней
стенкой
.
В
комнате
находятся
геометрические
предметы
различных
форм
и
свойств
(
кубы
,
параллелепипеды
,
шары
),
и
протяженный
источник
света
на
потолке
.
Присутствует
также
камера
с
заданными
параметрами
(
обычно
она
расположена
так
,
чтобы
была
видна
вся
комната
).
В
одной
из
лабораторий
Корнельского
университета
(
http://graphics.cornell.edu
)
такая
комната
существует
в
реальности
,
и
ее
фотографии
сравниваются
с
изображениями
,
построенными
методами
трассировки
лучей
для
оценки
точности
методов
.
На
странице
лаборатории
можно
найти
описание
геометрии
сцены
в
текстовом
формате
.
Реализации
сцены
,
приведенной
на
рисунке
достаточно
для
выполнения
задания
,
хотя
возможно
введение
новых
предметов
дополнительно
к
существующим
,
или
вместо
них
.
Приветствуется
использование
примитивов
библиотек
GLUT
и
GLU.
Внимание
!
Сцена
не
должна
превращаться
в
набор
разнородных
предметов
.
Эстетичность
и
оригинальность
выполненного
задания
принимается
во
внимание
.
Протяженный
источник
света
на
потолке
комнаты
можно
эмулировать
несколькими
точечными
источниками
.
За
простейшую
реализацию
сцены
ставится
7
баллов
.
Реалистичность
сцены
можно
значительно
повысить
за
счет
разбиение
многоугольников
.
Суть
этого
в
том
,
что
модели
освещение
OpenGL
освещенность
вычисляется
в
вершинах
многоугольника
с
учетом
направления
нормалей
в
этих
вершинах
,
а
затем
линейно
интерполируется
по
всей
поверхности
.
Если
используются
119
относительно
большие
многоугольники
,
то
,
очевидно
,
невозможно
получить
действительно
плавные
переходы
и
затенения
.
Для
преодоления
этого
недостатка
можно
разбивать
большие
грани
(
стены
,
например
)
на
множество
меньших
по
размерам
.
Соответственно
разброс
в
направлении
нормалей
в
вершинах
одного
многоугольника
не
будет
столь
велик
и
затенение
станет
более
плавным
. (1
балл
)
Наложение
текстур
на
объекты
сцены
поощряется
2-
мя
баллами
.
Дополнительными
баллами
оценивается
присутствие
в
сцене
теней
.
Один
из
простейших
алгоритмов
наложения
теней
приведен
в
разделе
7.2.
За
его
реализацию
можно
получить
до
2
баллов
.
Использование
более
продвинутых
алгоритмов
(
например
, shadow volumes)
будет
оценено
дополнительными
баллами
.
Реализация
устранения
ступенчатости
(antialiasing)
методом
,
предложенным
в
разделе
7.1.
или
каким
-
либо
другим
оценивается
в
2
балла
.
За
введение
в
сцену
прозрачных
объектов
и
корректный
их
вывод
дается
1
балл
.
Механизм
работы
с
прозрачными
объектами
описан
в
разделе
6.1.
Задание
оценивается
,
исходя
из
15
баллов
.
В
приведенной
ниже
таблице
указано
распределение
баллов
в
зависимости
от
реализованных
требований
:
Простейший
вариант
сцены
(
только
освещение
)
7
баллов
Разбиение
полигонов
+1
балл
Использование
текстур
+2
балла
Наложение
теней
+2
балла
Устранение
ступенчатости
+2
балла
Использование
прозрачных
объектов
+1
балл
Дополнительные
баллы
можно
получить
за
хорошую
оптимизацию
программы
,
необычные
решения
,
эстетичность
и
т
.
д
.
120
E.2.
Виртуальные
часы
Целью
задания
является
создание
трехмерной
интерактивной
модели
аналоговых
часов
.
Обязательные
требования
к
программе
:
1.
Программа
должна
демонстрировать
на
экране
трехмерную
модель
часов
.
Часы
могут
быть
любые
,
от
наручных
до
кремлевских
.
Проявите
в
полной
мере
Вашу
фантазию
и
чувство
меры
!
Постарайтесь
сделать
как
можно
более
реалистичную
сцену
.
Поощряется
подробная
детализация
элементов
часов
.
2.
Часы
на
экране
обязательно
должны
иметь
минутную
и
часовую
стрелки
.
Секундная
-
по
желанию
,
но
очень
приветствуется
(
иначе
трудно
будет
определить
,
ходят
часы
или
нет
).
3.
Время
на
часах
должно
совпадать
с
системным
временем
компьютера
.
Часы
обязательно
должны
ходить
,
т
.
е
.
стрелки
должны
двигаться
и
скорость
их
движения
не
должна
зависеть
от
производительности
компьютера
,
а
определяться
только
текущим
временем
.
4.
Сцена
должна
быть
интерактивной
,
т
.
е
.
давать
приемлемую
частоту
кадров
в
секунду
(>10)
при
визуализации
на
машине
с
аппаратным
ускорителем
трехмерной
графики
.
Если
программа
будет
работать
медленно
,
баллы
могут
быть
снижены
5.
Необходимо
реализовать
вращения
часов
(
или
,
возможно
,
камеры
)
с
помощью
мыши
(
предпочтительно
)
или
клавиатуры
.
Можно
также
предусмотреть
режимы
с
автоматическим
вращением
.
Пожелания
к
программе
:
1.
Поощряется
введение
дополнительной
геометрии
.
Например
,
ремешков
,
маятников
и
т
.
д
.
Можно
сделать
часы
с
кукушкой
,
будильник
и
т
.
п
.
2.
Желательно
наличие
возможностей
для
управления
процессом
визуализации
.
Например
,
наличие
/
отсутствие
текстур
,
режимы
заливки
,
детализации
и
т
.
д
.