Окно программы, рассматриваемой в этой главе
Рисунок 12.8. Окно программы, рассматриваемой в этой главе
Вы можете свободно перемещаться по сцене, используя следующие клавиши:
W/S — передвижение вперед и назад;
A/D — сдвиг влево и вправо;
R/F — полет вверх и вниз;
Стрелки вверх/вниз — наклон камеры;
Стрелки влево/вправо — рыскание камеры;
N/M — вращение камеры.
Реализация примера тривиальна, поскольку вся работа выполняется внутри класса Camera, о котором мы уже говорили. В функции Display мы обрабатываем нажатие клавиш согласно их назначению. Учтите, что мы в начале программы создаем глобальный объект камеры TheCamera. Также обратите внимание, что перемещение камеры синхронизируется по прошедшему с прошлого кадра времени (timeDelta); благодаря этому скорость перемещения не зависит от частоты кадров.
bool Display(float timeDelta) { if(Device) { // // Обновление сцены: перемещение камеры // if(::GetAsyncKeyState('W') & 0x8000f) TheCamera.walk(4.0f * timeDelta);
if(::GetAsyncKeyState('S') & 0x8000f) TheCamera.walk(-4.0f * timeDelta);
if(::GetAsyncKeyState('A') & 0x8000f) TheCamera.strafe(-4.0f * timeDelta);
if(::GetAsyncKeyState('D') & 0x8000f) TheCamera.strafe(4.0f * timeDelta);
if(::GetAsyncKeyState('R') & 0x8000f) TheCamera.fly(4.0f * timeDelta);
if(::GetAsyncKeyState('F') & 0x8000f) TheCamera.fly(-4.0f * timeDelta);
if(::GetAsyncKeyState(VK_UP) & 0x8000f) TheCamera.pitch(1.0f * timeDelta);
if(::GetAsyncKeyState(VK_DOWN) & 0x8000f) TheCamera.pitch(-1.0f * timeDelta);
if(::GetAsyncKeyState(VK_LEFT) & 0x8000f) TheCamera.yaw(-1.0f * timeDelta);
if(::GetAsyncKeyState(VK_RIGHT) & 0x8000f) TheCamera.yaw(1.0f * timeDelta);
if(::GetAsyncKeyState('N') & 0x8000f) TheCamera.roll(1.0f * timeDelta);
if(::GetAsyncKeyState('M') & 0x8000f) TheCamera.roll(-1.0f * timeDelta);
// Обновление матрицы вида согласно новому //местоположению и ориентации камеры D3DXMATRIX V; TheCamera.getViewMatrix(&V); Device->SetTransform(D3DTS_VIEW, &V);