netlib.narod.ru< Назад | Оглавление | Далее >

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

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

Сайт управляется системой uCoz