Название: Компьютерная графика(Е.Н. Павенко)

Жанр: Информатика

Просмотров: 1428


3. анимация

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

Эту проблему можно решить с использованием двойной буферизации – стандартной технологии организации компьютерной анимации. В этом случае в нашем распоряжении имеется два буфера кадра, которые принято называть рабочим и фоновым. Рабочий буфер – это тот, из которого выполняется регенерация изображения на экране, а в фоновом буфере изображение формируется программой. По командам из прикладной программы можно переключать функции буферов: сделать рабочим тот, который ранее был фоновым, а фоновым – тот, который ранее был рабочим. Механизм двойной буферизации устанавливается в процессе инициализации аргументом функции glutInitDisplayMode(). Вместо константы GLUT_SINGLE нужно задать константу GLUT_DOUBLE. Переключение буферов выполняется функцией glutSwapBuffers(). Все операторы формирования изображения включатся в функцию display(), но при использовании двойной буферизации в этой функции сначала нужно очистить рабочий буфер, вызвав команду glClear(), а последним оператором вызвать функцию переключения буферов glutSwapBuffers().

Программа рисования вращающегося квадрата

#include <GL/glut.h>

#include <stdlib.h>

static GLfloat spin = 0.0;

void spinDisplay(void)

{

    spin = spin + 2.0;

   if (spin > 360.0)

      spin = spin – 360.0;

   glutPostRedisplay();

}

void display(void)

{

   glClear(GL_COLOR_BUFFER_BIT);

   glPushMatrix();

   glRotatef(spin, 0.0, 0.0, 1.0);

   glColor3f(1.0, 1.0, 1.0);

   glBegin(GL_POLYGON);

            glVertex2f(-25.0,-25.0);

            glVertex2f(25.0,-25.0);

            glVertex2f(25.0,25.0);

            glVertex2f(-25.0,25.0);

            glEnd( );

   glPopMatrix();

   glutSwapBuffers();

}

void init(void)

{

   glClearColor (0.0, 0.0, 0.0, 0.0);

   glShadeModel (GL_FLAT);

}

void reshape(int w, int h)

{

   glViewport (0, 0, (GLsizei) w, (GLsizei) h);

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity();

   glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);

   glMatrixMode(GL_MODELVIEW);

   glLoadIdentity();

}

int main(int argc, char** argv)

{

   glutInit(&argc, argv);

   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);

   glutInitWindowSize (250, 250);

   glutInitWindowPosition (100, 100);

   glutCreateWindow (argv[0]);

   init ();

   glutDisplayFunc(display);

   glutReshapeFunc(reshape);

   glutIdleFunc(spinDisplay);

   glutMainLoop();

   return 0;   /* ANSI C requires main to return int. */

}

Порядок выполнения лабораторной работы

1. Ввести и отладить программу рисования вращающегося квадрата.

2. Изменить программу п.1 таким образом, чтобы она управлялась нажатием клавиш на клавиатуре – при нажатии клавиши «x», квадрат вращается, при нажатии клавиши «X»- вращение прекращается, при нажатии клавиши «Esc» – программа завершает свою работу.

3. Изменить программу п.1 таким образом, чтобы она управлялась нажатием клавиши мыши – при нажатии левой клавиши–квадрат вращается, при нажатии правой клавиши–вращение прекращается.

4. Нарисовать любую фигуру в одном из углов экрана. Обеспечить перемещение этой фигуры по экрану при нажатой и удерживаемой клавише мыши.

Контрольные вопросы

1. Назначение анимации. Методы создания анимации средствами OpenGL.

2. Диалоговые средства ввода. Реализация диалоговых средств ввода в библиотеке GLUT.

3. Видовое преобразование. Функции OpenGL, обеспечивающие видовое преобразование.

4. Матричное представление геометрических преобразований в однородных координатах.