| netlib.narod.ru | < Назад | Оглавление | Далее > |
Пример приложения для этой главы создает ландшафт на основе содержащихся в файле 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;
}
| netlib.narod.ru | < Назад | Оглавление | Далее > |