В компьютерной анимации частоту дискретизации периодического движения можно регулировать, настраивая параметры движения. Например, угловой прирост движения вращающегося объекта можно задать так, чтобы для каждого оборота генерировалось несколько кадров. Таким образом, прирост 3° дает 120 этапов движения за один оборот, а прирост 4° дает 90 положений. Для более быстрого движения можно использовать большие шаги вращения, только нужно следить, чтобы число выборок за цикл не было слишком малым, и движение отображалось корректно. Если анимировать нужно сложные объекты, следует учитывать влияние, которое время построения кадра может иметь на частоту обновления, как обсуждалось в разделе 13.1. Движение сложного объекта может быть значительно более медленным, чем хотелось бы, если время построения каждого кадра анимации слишком велико.
Другой фактор, который следует рассматривать при отображении повторяющегося изображения, - эффект округления при расчете параметров движения. Как отмечалось в разделе 5.4, значения параметров можно периодически обновлять, чтобы накопление ошибки не вызвало ложного движения. При непрерывном вращении параметры можно обновлять каждый цикл (360°).
ПРОЦЕДУРЫ АНИМАЦИИ OpenGL
Растровые операции (раздел 5.7) и функции присвоения кодов цвета (color-index assignment) содержатся в корневой библиотеке, а процедуры изменения значений таблицы цветов есть в GLUT (раздел 4.3). Другие операции растровой анимации есть только в процедурах GLUT, поскольку они зависят от используемой системы окон. Кроме того, в некоторых аппаратных системах могут отсутствовать особенности компьютерной анимации, такие как двойная буферизация.
Операции двойной буферизации, если они есть, вызываются посредством следующей команды GLUT.
glutlnitDisplayMode (GLUT_DOUBLE); В результате создается два буфера, передний и задний, которые можно использовать попеременно для обновления изображения на экране. Пока один буфер выступает в роли буфера обновления текущего окна на экране, в другом буфере строится следующий кадр анимации. Момент, когда буферы меняются ролями, задается командой
glutSwapBuffers ( ) ; Чтобы определить, возможна ли в системе работа с двойной буферизацией, можно выдать следующий запрос.
glGetBooleanv (GL_DOUBLEBUFFER, status); Значение GL_TRUE, выданное в ответ, присваивается параметру массива status, если в системе доступны передний и задний буферы. В противном случае возвращается значение GL_FALSE.
Для непрерывной анимации также можно использовать следующую процедуру.
glutldleFunc (animationFcn); Здесь параметру animationFcn присваивается имя процедуры, которая будет последовательно увеличивать параметры анимации. Данная процедура непрерывно выполняется, пока не останется событий в окне дисплея, которые нужно обработать. Чтобы блокировать процедуру glutldleFunc, ее аргументу присваивается значение NULL или 0.
Ниже приведен пример программы анимации, в которой правильный шестиугольник непрерывно вращается в плоскости ху вокруг оси 2. Начало трехмерных экранных координат располагается в центре окна на экране, так что ось z проходит через этот центр. В процедуре init таблица отображения используется для задания описания правильного шестиугольника, центр которого изначально находится в точке с экранными координатами (150, 150), а радиус (расстояние от центра многоугольника до любой вершины) равен 100 пикселям. В функции отображения displayHex задается начальный угол вращения 0° вокруг оси z и вызывается процедура glutSwapBuf fers. Чтобы инициировать вращение, используется процедура mouseFcn, которая последовательно увеличивает угол поворота на 3° при нажатии средней кнопки мыши. Расчет последовательно увеличивающегося угла выполняется в процедуре