Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
exam_answers_v3.2_2013.docx
Скачиваний:
0
Добавлен:
12.01.2020
Размер:
3.08 Mб
Скачать

4. Компьютерная графика. Анимация средствами библиотеки OpenGl

Смена изображения за некоторый промежуток времени называется анимацией. Скорость смены изображения измеряется кадровой частотой, т.е. числом кадров в секунду.

Функция Idle() регистрируется в обработчике событий GLUT функцией glutIdleFunc(). У этой функции особое назначение - она вызывается каждый раз, как обработчик событий по завершению своего цикла не нашел никаких действий со стороны пользователя. Вызываемая функция Idle() используется для создания анимации. Для этого в функции задаем изменение определенного параметра, а в конце функции idle() вызываем функцию glutPostResDisplay(), которая перерисовывает окно, сохраняя предыдущую инициализацию.

Пример: void Idle()

{

if (t<=1)

{

t=t+0.005;

}

Display();

}

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

void glutTimerFunc(unsigned int millis, void (*func)(int value), int value) – эта функция устанавливает таймер. У этой функции три параметра: первый параметр millis задает время в миллисекундах, по истечении которых вызывается функция, которая указана как второй параметр. Третий параметр value указывает индентификатор таймера, т.е. таймеров может быть одновременно запущено несколько. То же самое значение value есть и в функции, которая вызывается таймером. Это нужно для того, чтобы определить, какой таймер сработал, т.е. если ваша функция обрабатывает несколько таймеров.

5. Компьютерная графика. Обеспечение работы приложений в реальном времени средствами библиотеки OpenGl

Функция Timer – обеспечение режима работы в реальном времени.

void glutTimerFunc(unsigned int millis, void (*func)(int value), int value) – эта функция устанавливает таймер. У этой функции три параметра: первый параметр millis задает время в миллисекундах, по истечении которых вызывается функция, которая указана как второй параметр. Третий параметр value указывает индентификатор таймера, т.е. таймеров может быть одновременно запущено несколько. То же самое значение value есть и в функции, которая вызывается таймером. Это нужно для того, чтобы определить, какой таймер сработал, т.е. если ваша функция обрабатывает несколько таймеров.

Часть кода программы с таймером:

void Display(void)

{

// Отрисовка основной сцены

a++;

if (a>10)

{

// Если прошло 10*100 миллисекунд – отрисовка дополнительных объектов

}

}

void Timer(int value)

{

glutTimerFunc(100, Timer, 0); // Setup next timer

glutPostRedisplay(); // Redraw windows

}

void main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);

glutInitWindowSize(Width, Height);

glutCreateWindow("Timer");

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyboard);

glutTimerFunc(0, Timer, 0);

glutMainLoop();

}

6. Компьютерная графика. Создание цикла обработки сообщений в приложении средствами библиотеки OpenGl

Речь идет об объектно-ориентрованном программировании, а не о структурном. Создается цикл обработки сообщений. Стартовой точкой выполнения программы является функция main(). В функции main() есть функция, которая запускает цикл обработки сообщений glutMainLoop(). В разные службы направляет сообщения. Цикл обработки выступает как разносчик сообщений и устанавливает очередь сообщения. Сообщения могут накапливаться в разных буферах.

Обработчик сообщений подбирает, кто ответственен за эти сообщения. Заранее известно кто будет обрабатывать сообщения (например: отвечать за клики мыши). Функции библиотеки GLUT реализуют так называемый событийно-управляемый механизм. Это означает, что есть некоторый внутренний цикл, который запускается после соответствующей инициализации и обрабатывает, одно за другим, все события, объявленные во время инициализации. К событиям относятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши, и "пустое" (idle) событие, когда ничего не происходит. Для этого используются функции вида:

• void glutDisplayFunc (void (*func) (void)) - функция рисования для окна приложения, которая вызывается при необходимости создания или восстановления изображения

• void glutReshapeFunc (void (*func) (int width, int height)) - функция обработки изменения размеров окна пользователем

• void glutMouseFunc (void (*func) (int button, int state, int x, int y)) - функция для регистрации действий мыши

• void glutIdleFunc (void (*func) (void)) - функцию, которая будет вызываться каждый раз, когда нет событий от пользователя

Контроль всех событий происходит внутри бесконечного цикла в функции void glutMainLoop(void) которая обычно вызывается в конце любой программы, использующей GLUT.

Но и у разработчика приложения есть возможность на себя перехватить инициативу обработки сообщения. Для этого регистрируем в функции main idle (пустое событие) - тогда сами можем обрабатывать сообщения, а не windows.

Выход из цикла – клавиша ESC.

void main(int argc, char *argv[]) //главный цикл приложения

{

glutInit(&argc, argv); //производит начальную инициализацию библиотеки GLUT.

glutInitDisplayMode(GLUT_RGB); //инициализирует буфер кадра и настраивает полноцветный непалитровый) режим RGB.

glutInitWindowSize(Width, Height); //используется для задания начальных размеров окна.

glutCreateWindow("timerAW"); // задает заголовок окна и визуализирует само окно на экране.

glutDisplayFunc(Display); //регистрирует функцию Display(), которая будет вызвана при перерисовке окна.

// initAW();

glutReshapeFunc(Reshape); //регистрирует функцию Reshape(), которая будет вызвана при изменении размеров окна.

glutKeyboardFunc(Keyboard); //регистрирует функцию Keyboard(), которая будет вызвана при нажатии клавиши на клавиатуре.

glutTimerFunc(200, timAW, 0); // a=1;

glutMainLoop(); //Внутри бесконечного цикла в этой функции происходит контроль всех событий и вызов нужных функций.

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]