Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / 5_i_poslednyaya / glopen10 / Labor_07.doc
Скачиваний:
26
Добавлен:
29.05.2018
Размер:
416.26 Кб
Скачать

Использование таймера для моделирования движения 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.)