Введение в программирование трехмерных игр с DX9

       

Пример приложения: ландшафт


Пример приложения для этой главы создает ландшафт на основе содержащихся в файле RAW данных карты высот, текстурирует его и рассчитывает освещение. Помимо этого, с помощью клавиш управления курсором можно перемещаться по ландшафту. Обратите внимание, что в приведенных ниже фрагментах не относящийся к рассматриваемой теме код пропущен; места, где должен находиться пропущенный код отмечены многоточиями. Имейте в виду, что скорость работы приложения зависит от установленного оборудования; если программа работает медленно, попробуйте уменьшить размер ландшафта.

Сперва мы добавляем глобальные переменные, представляющие наш ландшафт, камеру и счетчик частоты кадров:

Terrain* TheTerrain = 0; Camera TheCamera(Camera::LANDOBJECT);

FPSCounter* FPS = 0;

Теперь посмотрите на функции каркаса приложения:

bool Setup() { D3DXVECTOR3 lightDirection(0.0f, -1.0f, 0.0f); TheTerrain = new Terrain(Device, "coastMountain256.raw", 256, 256, 10, 1.0f); TheTerrain->genTexture(); TheTerrain->lightTerrain(&directionToLight);

...

return true; }

void Cleanup() { d3d::Delete<Terrain*>(TheTerrain); d3d::Delete<FPSCounter*>(FPS); }

bool Display(float timeDelta) { if( Device ) { // // Обновление сцены: //

...[пропущен код для проверки ввода]

// Ходьба по ландшафту: настраиваем высоту // камеры таким образом, чтобы она находилась // в 5 единицах над поверхностью той ячейки, // где мы находимся. D3DXVECTOR3 pos; TheCamera.getPosition(&pos);

float height = TheTerrain->getHeight(pos.x, pos.z);

pos.y = height + 5.0f;

TheCamera.setPosition(&pos);

D3DXMATRIX V; TheCamera.getViewMatrix(&V); Device->SetTransform(D3DTS_VIEW, &V);

// // Рисование сцены: // Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0); Device->BeginScene();

D3DXMATRIX I; D3DXMatrixIdentity(&I);

if(TheTerrain) TheTerrain->draw(&I, false);

if(FPS) FPS->render(0xffffffff, timeDelta);

Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; }



Содержание раздела