|
Представление данных о ландшафте, использование полигонального объекта HeightMapMesh Введение В данной статье коротко описываются основные методы представления ландшафтов. На примере HeightMapMesh изучим, как быстро реализовать ландшафт в движке. Представление данных о ландшафте Существует несколько основных принципов представления данных для хранения информации о ландшафтах:
Первый способ - иррегулярная сетка
Данный способ построения ландшафтов применяется в специализированных пакетах (3Dmax, Maya) и хранится в виде трехмерных моделей. Плюсы:
Минусы:
Второй способ - посегментная карта высот Данный способ использует карту высот (только вместо высот в ней хранятся индексы сегментов). Сегменты могут быть представлены как регулярной сеткой, так и иррегулярной (можно использовать эти подходы одновременно). Плюсы:
Минусы:
Третий способ - регулярная карта высот Карта высот - это двумерный массив значений высот ландшафта, взятых с определенным интервалом. Карты высот хранят в файлах картинок. Создать карту высот можно с помощью графического редактора (например, 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); } В этом методе мы создаем:
![]() Этот пример и более полный исходник вы можете скачать. |