Программирование на Visual C++. Архив рассылки
Шрифт:
Функции GLUT могут быть классифицированы на несколько групп по своему назначению:
• Инициализация
• Начало обработки событий
• Управление окнами
• Управление меню
• Регистрация вызываемых (callback) функций
• Управление индексированной палитрой цветов
• Отображение шрифтов
• Отображение дополнительных геометрических фигур (тор, конус и др.)
Инициализация проводится с помощью функции
Переменная argcp есть указатель на стандартную переменную argc описываемую в функции main, а argv – указатель на параметры,
Первые две функции задают соответственно положение и размер окна, а последняя функция определяет различные режимы отображения информации, которые могут совместно задаваться с использованием операции побитового "или" ("|"):
GLUT_RGBA | Режим RGBA. Используется по умолчанию, если не указаны явно режимы GLUT_RGBA или GLUT_INDEX. |
GLUT_RGB | То же, что и GLUT_RGBA. |
GLUT_INDEX | Режим индексированных цветов (использование палитры). Отменяет GLUT_RGBA. |
GLUT_SINGLE | Окно с одиночным буфером. Используется по умолчанию. |
GLUT_DOUBLE | Окно с двойным буфером. Отменяет GLUT_SINGLE. |
GLUT_STENCIL | Окно с трафаретным буфером. |
GLUT_ACCUM | Окно с буфером накопления. |
GLUT_DEPTH | Окно с буфером глубины. |
Это неполный список параметров для данной функции, однако, для большинства случаев этого бывает достаточно.
Двойной буфер обычно используют для анимации, сначала рисуя что-нибудь в одном буфере, а затем, меняя их местами, что позволяет избежать мерцания. Буфер глубины или z-буфер используется для удаления невидимых линий и поверхностей.
Работа с трафаретным буфером и буфером накопления описана в разделе Спецэффекты.
Функции библиотеки GLUT реализуют так называемый событийно-управляемый механизм. Это означает, что есть некоторый внутренний цикл, который запускается после соответствующей инициализации и обрабатывает, один за другим, все события, объявленные во время инициализации. К событиям относятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши, и "пустое" (idle) событие, когда ничего не происходит. Для проведения периодической проверки совершения того или иного события надо зарегистрировать функцию, которая будет его обрабатывать. Для этого используются функции вида:
То
Через glutReshapeFunc устанавливается функция обработки изменения размеров окна пользователем, которой передаются новые размеры.
glutMouseFunc определяет обработчика команд от мыши, а glutIdleFunc задает функцию, которая будет вызываться каждый раз, когда нет событий от пользователя.
Контроль всех событий происходит внутри бесконечного цикла в функции
которая обычно вызывается в конце любой программы, использующей GLUT. Структура приложения, использующего анимацию, будет следующей:
В случае если приложение должно строить статичное изображение, можно заменить GLUT_DOUBLE на GLUT_SINGLE, так как одного буфера в этом случае будет достаточно, и убрать вызов функции glutIdleFunc.
Положение вершины определяются заданием их координат в двух-, трех-, или четырехмерном пространстве (однородные координаты). Это реализуется с помощью нескольких версий команды glVertex:
Каждая команда задает 4 координаты вершины: x, y, z и w. Команда glVertex2 получает значения x и y. Координата z в таком случае устанавливается по умолчанию равной 0, а координата w равной 1. Vertex3 получает координаты x, y, z и заносит в координату w значение 1. Vertex4 позволяет задать все 4 координаты.