- •Московский институт электронной техники
- •Введение.
- •Подключение графической библиотеки OpenGl в программах Win32.
- •Создание консольного приложения Windows для работы с библиотекой OpenGl.
- •Интерактивное взаимодействие с OpenGl в оконном режиме Windows.
- •Двойная буферизация.
- •Двойная буферизация OpenGl в оконном приложении Windows.
- •Двойная буферизация OpenGl в консольном приложении Windows.
- •Создание 2d объектов с помощью графической библиотеки OpenGl.
- •Пример создания 3d объектов с помощью графической библиотеки OpenGl.
- •Использование таймера для моделирования движения 3d-объектов OpenGl в оконном приложении Windows.
- •Моделирование движения 3d-объектов OpenGl без таймера в консольном приложении Windows.
- •Задание к работе.
- •Варианты к лабораторной работе.
Использование таймера для моделирования движения 3d-объектов OpenGl в оконном приложении Windows.
Движение 3D-объектов можно осуществить независимо от пользователя, если использовать системный таймер, который через определенное время будет менять положение объектов на экране.
Новая программа будет находиться в файле glopen10.cpp. За основу возьмем программу glopen04.cpp, и внесем туда следующие изменения.
Направление вращения 3D-объектов будем задавать стрелками клавиатуры. Определим флаг FlagRotation для указания, какая стрелка была нажата.
//флаг для указания направления вращения
int FlagRotation;
Значения флага выберем следующие: 1 – налево, 2 - направо, 3 – вверх, 4 – вниз. При нажатии пробела (SPACE) движение должно прекращаться. Поэтому нажатию пробела соответствует значение флага FlagRotation = 0.
Ниже приводим код обработки сообщения от таймера.
case WM_TIMER:
switch(FlagRotation)
{
case 1:
angl.fi += 0.5;
break;
case 2:
angl.fi -= 0.5;
break;
case 3:
angl.teta += 0.5;
break;
case 4:
angl.teta -= 0.5;
break;
}
SurfDC(hwnd);
break;
При нажатии указанных клавиш, флаг вращения принимает соответствующие значения, что видно из приведенного ниже кода.
case WM_KEYDOWN:
switch(wParam)
{
case VK_SPACE:
FlagRotation = 0;
break;
case VK_LEFT:
FlagRotation = 1;
break;
case VK_RIGHT:
FlagRotation = 2;
break;
case VK_UP:
FlagRotation = 3;
break;
case VK_DOWN:
FlagRotation = 4;
break;
}
break;
Нужно предусмотреть также запуск и удаление таймера. Это показано в следующих строчках кода.
case WM_CREATE:
SetTimer(hwnd, 1, 2, NULL);
SurfCreate();
break;
case WM_DESTROY:
KillTimer(hwnd, 1);
SurfDestroy();
break;
Теперь можно компилировать и запускать программу glopen10.cpp на выполнение Рис.14, Рис.15.
Рис.14 Рис.15
(Изображения на Рис.14, 15 созданы программой glopen10.cpp.)
Моделирование движения 3d-объектов OpenGl без таймера в консольном приложении Windows.
Если модулируется движение 3D-объектов с помощью графики OpenGL в консольном режиме, то использовать системный таймер не удается, как это было в оконном приложении Windows. Дело в том, что в библиотеке GLAUX нет соответствующих функций поддержки таймера. Поэтому нужно использовать другие возможности, которые предоставляет эта библиотека.
Нужно создать функцию, которая будет перерисовывать сцену с измененными углами поворота в ответ на приходящее сообщение.
Новая программа будет находиться в файле glopen11.cpp. За основу возьмем программу glopen04.cpp, и внесем туда следующие изменения.
Направление вращения 3D-объектов будем задавать стрелками клавиатуры. Определим флаг FlagRotation для указания, какая стрелка была нажата.
//флаг для указания направления вращения
int FlagRotation;
Значения флага выберем следующие: 1 – налево, 2 - направо, 3 – вверх, 4 – вниз. При нажатии пробела (SPACE) движение должно прекращаться. Поэтому нажатию пробела соответствует значение флага FlagRotation = 0.
Ниже приводим код обработки нажатия клавиш клавиатуры.
void Key_DOWN(void)
{
FlagRotation = 3;
}
void Key_UP(void)
{
FlagRotation = 4;
}
void Key_LEFT(void)
{
FlagRotation = 1;
}
void Key_RIGHT(void)
{
FlagRotation = 2;
}
void Key_SPACE(void)
{
FlagRotation = 0;
}
Эффект движения здесь создается при помощи перерисовывания сцены в другой буфер кадра. Для этого нужно указать функцию, которая будет перерисовывать изображение.
//обрабатывает сообщение на перерисовывание сцены
auxIdleFunc((AUXIDLEPROC)Redraw);
//обрабатывает сообщение на перерисовывание сцены
void Redraw(void)
{
switch(FlagRotation)
{
case 1:
alX -= 0.5;
break;
case 2:
alX += 0.5;
break;
case 3:
alY += 0.5;
break;
case 4:
alY -= 0.5;
break;
}
Draw();
}
Теперь можно компилировать и запускать программу glopen11.cpp на выполнение.
Рис.16 Рис.17
(Изображения на Рис.16, 17 созданы программой glopen11.cpp.)