Представление данных о ландшафте, использование полигонального объекта HeightMapMesh


Введение


В данной статье коротко описываются основные методы представления ландшафтов. На примере HeightMapMesh изучим, как быстро реализовать ландшафт в движке.


Представление данных о ландшафте


Существует несколько основных принципов представления данных для хранения информации о ландшафтах:


  • Первый - использование иррегулярной сетки вершин и связей, их соединяющих (т.е. хранение простой триангулизированной карты).

  • Второе - посегментная карта высот, использование блоков, т.е. создается некоторое количество заранее построенных сегментов, а на карте указываются только индексы этих сегментов.

  • Третий - использование регулярной сетки высот,  так называемая карта высот (HeightMap).


Первый способ - иррегулярная сетка



Данный способ построения ландшафтов применяется в специализированных пакетах (3Dmax, Maya) и хранится в виде трехмерных моделей.


Плюсы:


  • Используется меньше информации для построения ландшафта. Храним только значения каждой вершины и связи, соединяющие вершины.

Минусы:


  • Т.к. вершины расположены достаточно далеко друг от друга и неравномерно, возникают сложности при динамическом освещении;

  • Хранение и модификация такого ландшафта более трудоемка;

Второй способ - посегментная карта высот


Данный способ использует карту высот (только вместо высот в ней хранятся индексы сегментов). Сегменты могут быть представлены как регулярной сеткой, так и иррегулярной (можно использовать эти подходы одновременно).


Плюсы:


  • Возможность представления практически безразмерных пространств;

  • Можно создавать несколько вариантов одного и того же сегмента с разной детализацией  (LOD ландшафты - Level Of Detail);

  • Кроме ландшафта в сегментах можно хранить и информацию о зданиях, растениях и т.д.

Минусы:


  • Проблема стыковки разных сегментов (необходим контроль разрывов, наложения объектов друг на друга и т.д.);

  • Модификация потребует написания своего редактора.

Третий способ - регулярная карта высот


Карта высот - это двумерный массив значений высот ландшафта, взятых с определенным интервалом. Карты высот хранят в файлах картинок. Создать карту высот можно с помощью графического редактора (например, Photoshop) или с помощью программ, специально для этого предназначенных. Размер карты может быть произвольный, но удобней использовать квадратную, с размером сторон кратным числу степени двойки: 32х32, 64х64 и т.д. Стоит отметить, что размерность карты будет на единицу меньше, т.е., если карта высот представлена размерами 6х6, то количество ячеек будет 5х5. На рисунке можно увидеть это наглядно.



Плюсы:


  • В любой графической программе можно увидеть необходимую информацию;

  • Простота модификации;

  • Т.к. вершины расположены регулярно и достаточно близко друг к другу, можно более правильно и аккуратно производить динамическое освещение.

Минусы:


  • Наблюдается избыточность данных (когда задается плоскость, то для ее построения используется множество точек, хотя достаточно всего трех).

Стоит отметить, что движок может использовать любой из представленных принципов.


Работа с объектом HeightMapMesh


HeightMapMesh - реализует третий способ (регулярная карта высот).


Возмем, к примеру, карту высот представленную на рисунке.



Поместим в библиотеку карту высот и текстуру ландшафта.


Создадим метод и назовем его например, setupGeometries.


private function setupGeometries():void

{

var heightMap:BitmapData = new Hmap(0, 0);

var texture:BitmapData = new Texture(0, 0);

var mesh:HeightMapMesh = new HeightMapMesh(heightMap, 20, 20, 1, false, "MyHeightMesh");

var material:BitmapMaterial = new BitmapMaterial(texture, 1, false, true);

mesh.addMaterial(material, "front");

this.scene.addChild(mesh);

}


В этом методе мы создаем:


  • экземпляр карты высот из библиотеки

  • экземпляр текстуры из библиотеки

  • экземпляр HeightMapMesh, передаем нашу карту высот и задаем имя "MyHeightMesh"

  • экземпляр текстурного материала и передаем в него нашу текстуру

  • добавляем наш текстурный материал в поверхность "front"

  • добавляем получившийся полигональный объект в сцену



Этот пример и более полный исходник вы можете скачать.