, но я не уверен, как создать непрерывный или прокручивающий эффект перемещения объекта или вращения ...
Чтобы создать плавное движение (перемещение или вращение),Перемещаемая или вращающаяся часть матрицы модели должна быть изменена на небольшую величину соответственно на угол в каждом кадре.Это может быть достигнуто с помощью управляющих переменных, которые увеличиваются с небольшим шагом в каждом кадре.Модельная матрица должна быть пересчитана путем использования этих управляющих переменных в каждом кадре.
См. Концепцию в следующем псевдокоде:
translate_x = 0;
angle = 0;
while (1)
model_matrix = translate(translate_x, 0, 0) * roatateX(angle)
translate_x = translate_x + step_x
angle = angle + step_angle
Попробуйте следующий код и поиграйтесь с параметрами, для достижения эффекта для ваших нужд:
float angle = 0.0f;
float step_ang = 1.0f;
float trans_x = -0.5f;
float step_x = 0.01f;
bool move_forward = true;
while (1)
{
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(trans_x, 0.2f, 1.0f));
model = glm::rotate(model, glm::radians(angle), glm::vec3(0.0f, 0.0f, 1.0f));
angle += step_ang;
trans_x += move_forward ? step_x : -step_x;
move_forward = move_forward ? trans_x < 0.5f : trans_x <= -0.5f;
glm::mat4 MVP = model;
.....
... до нажатия клавиши.
Поскольку вопрос помечен winapi , я предполагаю, что вы инициализировали WNDCLASSEX
структуру данных и что для функции WindowProc установлена функция lpfnWndProc
.
Вы должны реализовать событие сообщения WM_KEYDOWN в функции обратного вызова окна и проверить, была ли нажата Esc (VK_ESCAPE
):
глобальная переменная:
bool esc_pressed = false;
функция обратного вызова:
LRESULT CALLBACK WindowProcedure( HWND hWnd, unsigned int msg, WPARAM wparam, LPARAM lparam )
{
switch(msg)
{
case WM_KEYDOWN:
if ( wparam == VK_ESCAPE )
esc_pressed = true;
break;
// other messages
// ...
}
return DefWindowProc( hWnd, msg, wparam, lparam );
}
Далее вам придется обрабатывать оконные сообщения в основном цикле.См. Функции GetMessage
и DispatchMessage
.
вместо
while (1)
{
.....
}
вам необходимо
MSG msg;
while( GetMessage( &msg, 0, 0, 0 ) )
{
DispatchMessage( &msg );
.....
}