Главная » Free Pascal » Анимация на плоскости Free Pascal

0

Вращающийся квадрат — один из самых простых примеров анимации. При описании пакета OpenGL к подобной иллюстрации прибегают столь же часто, как и к программе "Общего привета" ("Hello, world!"). Больше других нам понравилась реализация вращения квадрата,  написанная  на  языке  C  и  приведенная  в  книге Э. Эйнджела "Интерактивная компьютерная графика" [36]. В этом примере, с од- ной стороны, демонстрируется управление вращением с помощью кнопок мыши (левая кнопка запускает вращение, правая — останавливает). С другой стороны, здесь появилась возможность разумного использования времени ожидания сооб- щения, адресованного какому-нибудь из обработчиков событий. Вместо пустого повторения главного цикла приложение может получить управление и использо- вать время "простоя" для выполнения каких-то вычислений или подготовки ин- формации для отображения следующей сцены. Адрес такой процедуры, преду- смотренной в приложении, регистрируется в GLUT с помощью подпрограммы glutIdleFunc. Объем нашей модификации примерно на 10% меньше по сравнению с программой Эйнджела.

Программа Rotating_Quad выводит на экран изображение красного квадрата и ждет сообщение от мыши (листинг 16.7). Если поступает сигнал о нажатии левой кнопки, в качестве адреса процедуры обработки простоя назначается вход в под- программу OnIdle, заставляет GLUT обратиться к процедуре перерисовки изобра- жения (опосредованно через процедуру glutPostRedisplay). Если поступает сиг- нал от нажатия правой кнопки, то в качестве адреса процедуры обработки простоя передается нулевой указатель, и GLUT перестает периодически вызывать процеду- ру OnIdle. Ближайший вызов подпрограммы OnRedraw может произойти либо при изменении размеров окна, либо при очередном нажатии левой кнопки мыши. На быстром компьютере для замедления вращения квадрата следует уменьшить зна- чение угла поворота angle.

Процедура  обработки  сообщения  от мыши получает четыре целочисленных

параметра. Первый задает номер нажатой кнопки — левая, правая и центральная (в  случае,  если  мышь  трехкнопочная).  Второй  параметр  фиксирует  состояние

кнопки — утоплена или отпущена. Два оставшихся соответствуют координатам x и

y курсора мыши.

   Листинг 1 6 .7 .  Вра ща ющийс я  к вад ра т                                                                                            

program Rotating_Quad; uses

GL, GLUT;

var

angle : single = 0.1;

//——————————

procedure OnRedraw; cdecl; begin

glClear(GL_COLOR_BUFFER_BIT); glRotatef(angle,0,0,1); glRectf(-25,-25,25,25);

glutSwapBuffers; end;

//——————————–

procedure OnResize(w,h:integer); cdecl; begin

glViewPort(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity;

glOrtho(-50,50,-50,50,-1,1);

glMatrixMode(GL_MODELVIEW); glLoadIdentity;

if W>H then glScalef(h/w,1,1) else glScalef(1,w/h,1); end;

//———————————

procedure OnIdle; cdecl; begin

glutPostRedisplay; end;

//———————————

procedure OnMouse(button,state,x,y:integer); cdecl; begin

if state <> GLUT_DOWN then exit;

if button = GLUT_LEFT_BUTTON then glutIdleFunc(@OnIdle);

if button = GLUT_RIGHT_BUTTON then glutIdleFunc(Nil);

//———————————-

begin

glutInit(@argc,argv); glutInitDisplayMode(GLUT_DOUBLE); glutCreateWindow(‘Rotating Quad’); glClearColor(0.75,0.75,0.75,0); glutDisplayFunc(@OnRedraw); glutReshapeFunc(@OnResize); glutMouseFunc(@OnMouse); glColor3f(1,0,0);

glutMainLoop; end.

На рис. 16.7 представлены две наложенные друг на друга позиции вращающе- гося квадрата. В каждый текущий момент мы наблюдаем на экране только одну из промежуточных позиций квадрата.

Рис. 16.7. Вращающийся квадрат

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии