На рис. 3.10 показаны некоторые из использованных окон; все они являются концентрическими и имеют фиксированное форматное соотношение, но с каждым последующим кадром их размер уменьшается. Представьте мысленно, что нарисовано в порте просмотра для каждого из этих окон.

Скелет программы, позволяющей достичь этого эффекта приближения, показан в листинге 3.3. Для каждого нового кадра экран очищается, окно делается все меньше (с фиксированными центром и форматным соотношением), а рисунок внутри окна рисуется в постоянном порту просмотра.

5 Ф. Хилл Глава 3. Дополнительные инструменты для рисования Листинг 3.3. Создание анимации

float сх - 0.3, су - 0.2: // center of the window // центр окна

float Н. w - 1.2. aspect - 0.7:

// window properties

// свойства окна

set the viewport

II устанавливаем порт просмотра

for(int frame - 0: frame < NumFrames: frame++)

{

// for each frame

// для каждого кадра

clear the screen

II очищаем экран

// erase the previous figure

// удаляем предыдущий рисунок

w *- 0.7: // reduce the window width // уменьшаем ширину окна

H - W * aspect; // maintain the same aspect ratio // сохраняем прежнее форматное соотношение

setwindowCcx - W. сх + w. су - H, су + Н); //set the next window // устанавливаем следующее окно

hexSwi rl(); // draw the object // рисуем объект

}

Френсис Хилл

Рис. 3.10. Приближение к завихряющимся шестиугольникам Получение плавной анимации Предыдущее приближение не является вполне удовлетворительным, поскольку рисование новой фигуры занимает определенное время. Все, что видит пользователь, - это повторяющийся цикл из следующих двух действий: О А. Мгновенное стирание текущей фигуры.

О Б. (Как можно более) медленное рисование новой фигуры.

3.2. Мировые окна и порты просмотра Проблема заключается в том, что пользователь видит создание нового кадра строка за строкой, что может отвлекать внимание. А пользователь скорее хотел бы видеть такой повторяющийся цикл: О А. Постоянный показ текущей фигуры.

О Б. Мгновенное замещение текущей фигуры законченной новой фигурой.

Хитрость заключается в том, чтобы нарисовать новую фигуру «где-нибудь в другом месте» в то время, пока пользователь разглядывает текущую фигуру, а затем мгновенно переместить готовую новую фигуру на дисплей пользователя. OpenGL предлагает для решения этой задачи двойную буферизацию (double buffering). Выделяется память для дополнительного экранного окна, которое невидимо на действующем дисплее, и все рисование выполняется в этом окне, называемом буфером. (Использование такой «внеэкранной памяти» («off-screen memory») рассматривается более полно в главе 10.) Затем с помощью команды glutSwapBuffersO изображение из буфера передается в экранное окно и становится видимым для пользователя.


⇐ Предыдущая| |Следующая ⇒