Как составить карту высот местности

Генерация карты высот

Время на прочтение
3 мин

Количество просмотров 30K

В качестве языка программирования здесь используется C++, но перенести этот код на другой язык программирования будет не так уж сложно.
Код написанный ниже далёк от идеала, но новичкам он может пригодится.
Не так давно у меня была проблема с генерацией карты высот для ландшафта.

Я решил попробовать задать каждой точке случайное значение.


Вот пример кода для двухмерного массива данных.

//Задаётся зерно для генерации случайных чисел
srand(GetTickCount());       
for(int i=0;i<World::size;i++)
{
	for(int u=0;u<World::size;u++)
	{   
                //Задаются случайные значения всем точкам от 0*0.1-10, до 100*0.1-10
		World::data[i][u]=(rand()%100)*0.1f-10.0f;                            
	}
}

Но такой результат мне не годился, и я решил добавить холмы и ямы.

Код с использованием функции Land_MakeHill(код которой находится ниже):

srand(GetTickCount());
for(int i=0;i<rand()%(World::size*World::size*1000);i++)
{
		Land_MakeHill(World::data,                            //Карта высот
                rand()%(World::size),             //Координаты по X в пределах размера карты
                rand()%(World::size),             //Координаты по Y в пределах размера карты
                World::size,                              //Размер карты
                (rand()%20*1.0)+20)/100.0, //Высота холма
                rand()%14+14);                      //Радиус холма(в данном случае от 14 до 28 точек).
}
srand(GetTickCount());
for(int i=0;i<rand()%(World::size*World::size*1000);i++)
{
	Land_MakeHill(World::data,                            //Карта высот
        rand()%(World::size),               //Координаты по X в пределах размера карты
        rand()%(World::size),               //Координаты по Y в пределах размера карты
        World::size,                                //Размер карты
         -(rand()%20*1.0)+20)/100.0, //Глубина ямы
          rand()%4+7);                           //Радиус ямы(в данном случае от 7 до 11 точек).
}

Обратите внимание — отличие создания холма от ямы всего лишь высота. У ямы она меньше нуля, у холма больше.
Код функции Land_MakeHill:

/*data - указатель на массив, 
px - координаты по x, 
py - координаты по y, 
size - размер карты,
height - высота,
Rad - радиус
*/
void Land_MakeHill(float** data,int px,int pz, int size,float height,int Rad )
{
for(int i=0;i<size;i++){
for(int w=0;w<size;w++){
//Чем дальше точка от центра, тем меньше значение
float d=Rad *Rad -((px-i)*(px-i)+(pz-w)*(pz-w)); 
data[i][w]+=d*height;
}
}
}

Такому ландшафту очень не хватает плавности, поэтому понадобилось сделать сглаживание.

Код функции Land_blur:

void Land_Blur(float** data,int size)
{
//Временный массив вершин
float** oldData = new float*[size];    
for (int i = 0; i < size; i++){
	oldData[i] = new float[size];
}
//Переносим значения из массива вершин во временный массив, чтобы для сглаживания не использовались уже сглаженные точки
for(int i=0;i<size;i++){                         
	for(int u=0;u<size;u++){
		oldData[i][u]=data[i][u];
	}
}
//Идём начиная со второй точки до предпоследней, чтобы у каждой точки было 8 точек вокруг.
for(int i=1;i<size-1;i++){                   
	for(int u=1;u<size-1;u++){
		float v[9];
			v[0]=data[i-1][u-1];
			v[1]=data[i-1][u  ];
			v[2]=data[i-1][u+1];
			v[3]=data[i]  [u-1];
			v[4]=data[i]  [u  ];
			v[5]=data[i]  [u+1];
			v[6]=data[i+1][u-1];
			v[7]=data[i+1][u  ];
			v[8]=data[i+1][u+1];
		data[i][u]=(v[0]+v[1]+v[2]+v[3]+v[4]+v[5]+v[6]+v[7]+v[8])/9;
	}
}
}

Это наипростейшее сглаживание.
Берётся точка, берутся точки вокруг неё. Их значения складываются и делятся на их количество.
Это значение и есть высота выбранной точки.
Теперь код генерации карты высот имеет следующий вид:

        //Задаём случайные значения для всех точек
	for(int i=0;i<World::size;i++)
	{
		for(int u=0;u<World::size;u++)
		{
			srand(GetTickCount()*i*u);
			World::data[i][u]=(rand()%1000)*0.1-100;
		}
	}
	srand(GetTickCount());
        //Создаём холмы
	for(int i=0;i<rand()%(World::size*World::size*1000);i++)
	{
                //Эта функция идентична той, которая была разобрана ранее
		Land_MakeHill(World::data,rand()%(World::size*17),rand()%(World::size*17),World::size,((rand()%10*1.0)+10)/100.0,rand()%14+14);
	}
	srand(GetTickCount());
        //Создаём ямы
	for(int i=0;i<rand()%(World::size*World::size*1000);i++)
	{
               //Эта функция идентична той, которая была разобрана ранее
		Land_MakeHill(World::data,rand()%(World::size),rand()%(World::size),World::size,-((rand()%20*1.0)+20)/100.0,rand()%4+7);
	}
        //Делаем сглаживание 3 раза подряд
        for(int i=0;i<3;i++) 
	Land_Blur(World::data,World::size);

После этого я добавил ещё немного маленьких холмов и ещё раз сгладил карту.
Вот что получилось:

This tutorial will explain how to create a height map from elevation data of
real life places in the world. This can be used for creating worlds that are
based on real locations.

Downloading the height map from terrain.party[]

The website terrain.partywas primarily designed for downloading height maps for using in City: Skylines, but can easily be used for CAW. Note that not every area will have height map data.
Caw height map1

Move the map output box to the place that you want a height map of. If your map output box is off the screen you can recenter it by clicking on download, then OK, then cancel. Or you can immediately jump to a particular place by searching it for it.

When you have moved the map output box to where you want it, and resized the box if necessary, click the download icon. Name the file and the zip download should begin.

Caw height map2

The zip file should contain several height map images. Look through them to see which one you prefer but generally the most accurate will be the ‘Merged’ image.

Formatting the file[]

Resizing the image[]

First, you need to resize the image to a CAW compatible size.The standard sizes are:

Tiny: 256 x 256 pixels

Small: 512 x 512 pixels

Medium: 1024 x 1024 pixels

Large: 2048 x 2048 pixels

However, Appaloosa Plains uses a height map that is 1536 x 1536 pixels. Intermediate map sizes are possible as long as they are in multiples of 256. So another map size that is possible is 1280 x 1280. You resize the image file in any image editing program. For this tutorial I will show you how to do it in the Windows default program paint.

Caw height map3

When you have resized the image to your desired map size click save.

Converting the image to 16 bit PNG[]

CAW uses height maps in the 16 bit PNG format. Using any other bit PNG file will result in the map being distorted or repeated in CAW.

To convert the file you need to download the latest development version of GIMP, an image editing tool. Please note that the stable version of GIMP does not have the capabilities to change the bit size. For this tutorial I will be using the Windows 64-bit 2.92 development version. Install the .exe file that you have downloaded.

Inside the GIMP folder that you have just installed will be a run_gimp.bat file. Click on this to start the program. Two windows will open, you need both open while you use the program but you can ignore and minimize the GIMP Output window. However, don’t close it until you are finished using GIMP and have closed the other main window.

Open up your downloaded height map.

Caw height map4

1. Select Image, then Mode, then Greyscale.

2. Select Image, then Precision, then 16 bit Integer.

3. Select Image, then Flatten Image.

Now save the image by clicking File, then Export as.

Caw height map5

In the Export Image box that pops up, click the plus sign next to select File Type, then select PNG from the list. Finally click Export to save the image.

Check the image has been exported correctly by right clicking on the exported file, selecting properties and then details.

Caw height map6

If the Bit depth is 16 then you have formatted it correctly.

Loading the height map in CAW[]

Place your image in the Height Maps folder in CAW. The location will be something like this: C:UsersuserDocumentsElectronic ArtsThe Sims 3 Create A World ToolUserToolDataHeightMaps

Now load up CAW. Select File, New World. Select your height map to use as the Image File. Select the desired characteristics of the world (maximum height, whether the world is lush or desert) and then click ok.

Your world will likely be very jagged, but this is a shortcoming of the way elevation data is obtained. This method is best used as a base to further sculpt the landscape to your liking.

Страница 1 из 3

  1. Прошу прощения за ламерскую терминологию, я не землемер :(

    Итак, ситуация достаточно классическая – есть в принципе прямоугольный участок земли, имеющий сложный рельеф по высоте. Прежде чем бездумно завозить КАМАЗами землю и загонять бульдозер, хочется понять, где бугор, где ямка, где лучше подсыпать, а где наоборот срезать земли.

    Реально же как то составить некую карту высот участка, например через каждый метр?

    Пока мне приходит в голову единственное – сделать такой циркуль с шагом в один метр, совмещенный с водяным уровнем и двумя линейками…

    Да, мож есть какой софт, чтоб потом в него занести результаты измерений и покрутить на экране получившуюся поверхность?

    Что правильнее брать за “ноль” – какую то точку на строящемся доме? или самую высокую точку – асфальт дороги в метре от забора?

  2. эээ это как бы проектная работа, тут надо смотреть что где как и куда…. течет. Что за грунты, что там с водой, что там у соседей, потом сделать топосъемку всех эти дел (метр слишком часто, чтобы примерный расчет сделать (точный не получится из-за неравномерной плотности, дальнейшей осадки, вынутого, заменяного грунта и тд) достаточно по абрису точек 15-25 отстрелять. У меня иногда до 2х см точность получается по итогу – и для меня это реальное чудо не пойму почему так. А вот уже когда поймете где какой рельеф будет получаться и в зависимости от контрукции дома (длинна свесов, наличие гаража пристроенного, площади дома) уже от этого вымеряются высоты дома а не наоборот. В общем смотреть надо. Где участок то?

  3. правильно. именно для этого и заморачиваюсь. грунт там – 70 сантиметров чернозем, потом глина. результат – если образовать в середине яму (уже есть тестовые ямы) то можно рис выращивать. хотя может и не везде. прошлым летом тестили колодец – вылили несколько кубов воды в одну точку – ей пофиг, уходит как в губку. Ну исследовать весь участок что там как – ну его нафиг.
    этого я не понял (или спросил некорректно) – по итогам измерений я хочу получить такую 3Д-плоскость. разумно, что по вертикальной шкале она может уходить в плюс или минус (или и туда и туда) – вот и вопрос – что удобнее принять за ноль – самую высокую точку, самую низкую (изза дороги и реки я могу заранее их выбрать), какую то точку на строении на участке или пофик?
    север области.

    В принципе, когда дом планировался – прикидки уже прикидывали, что и куда гребсти, но хочется
    а) точно вымерять
    б) следствием п. “а” должна стать экономия в закупаемых объемах грунта
    в) по возможности организовать стекание воды в реку а не к себе или соседям (люди хорошие, нефиг им пакостить)

  4. Теодолит и рейка спасут отца русской демократии. :)
    Ставим теодолит в горизонталь, а рейкой тыкаем в точки на участке с любым шагом – хоть метр, хоть 10 см. – и видим повышение/понижение относительно теодолита.
    Потом занести это всё в Эксель в виде таблицы.
    Можно взять любую нулевую точку и пересчитать относительно неё.
    А можно в том же Экселе построить поверхностную диаграмму.

    А ещё можно отдать наёмникам много-много рублей и они сделают это за вас.


  5. Dir

    Dir
    Активный участник

    Реально. Если при помощи профессионального оборудования, то нужен нивелир и рейка.
    Если при помощи подручных средств, то здесь

  6. это не очень поможет. Тут дофига факторов смореть надо. Далеко от Волгограда? занести что? координаты точки откуда нарисуются? за пол га 5 тыщ отдавал. В смете дома непреодолимые расходы


  7. Dir

    Dir
    Активный участник

    А визирная ось прибора в качестве нуля не подойдёт?

  8. Задумавшийся Гость, а верно… это же все действительно банально… для СПЕЦИАЛИСТА… пошел читать про теодолиты… ооо…. при цене ~50000 за сей чудный девайс я уже ничего не сэкономлю, если куплю его.


  9. Dir

    Dir
    Активный участник

    Не нужен Вам теодолит. Вам нужен нивелир!

  10. Dir, спасибо, нашел!!! а прикольные штуковины оказывается :) и дешевые. СПАСИБО!!!

    я ламер, тема моя была ниочем :(

  11. вот будет у вас нивелир – а дальше чо? вы откуда остальные две координаты возьмете?

  12. zyu-zik, а для этого нужны астролябия и буссоль :d

    Человеку карту высот участка составить, взять лазерный уровень чтобы дальности хватало и деревянную рейку с прикрученной рулеткой :)

  13. координаты отметок он как ловить будет? по сетке? кто поставит сетку?

  14. zyu-zik,

    относительно своего забора. Для целей ТС более чем достаточно.

    Такая услуга есть и у профессиональных геодезистов — съемка участка для ландшафтного дизайна. За счет того что без привязки к координатам и без штампов всяких контор, нужных в экспертизе, стоит горазд дешевле.

    Но при помощи нивелира реально сделать и самому.

    Кстати система координат не обязательно декартова. Удобнее в полярной системе, за ноль точка стояния нивелира, углы по его шкале, расстояния от нуля до точки рулеткой.

    И сетка необязательно должна быть сплошной. Есть кочки — измеряешь погуще, плоский участок — реже.

    Для профессиональнйо обработки есть специальный софт, например версия автокада Сивил, http://www.autodesk.ru/products/autocad-civil-3d/overview

    можно скачать бесплатную демоверсию.

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

    Вычертил на генплане дом, выбрал точку куда нивелир поставить, измерил рассотяни и углы — все, на емстности 15 минут достаточно для разметки.

    ———- Сообщение добавлено 05.06.2015 18:24 ———-

    За “0” выбрать можно что угодно вообще, но удобнее всего то что фиксировано, во первых, во вторых на уровне нивелира. Я обычно беру 1,5 от уровня земли какого либо столба, и рисую на нем отметку. Дальше стройка от этой отметки.

  15. это уже теодолит. И дальномер. Все вместо тахеометр называется. Русский стоит новый 60 тыщ бу 25 тыщ. японы тоже самое только в 4 раза дороже я так и писал это чтобы заводы строить гэсы и автобаны. В том же автокаде что и проект дома легко делается и вертикальная планировка участка а также расчеты

  16. zyu-zik,

    лучше говно да еще и ложкой. Нафига тебе тахеометр? GPS рулит же.

    На практике достаточно дешевого нивелира и рулетки. На нивелире есть угловая шкала, не знал?

  17. исключительно там где от него есть смысл. 20 см – не сильно нужная точность для расчета кол-ва камазов.

    а расстояние от визира до вешки кто меряет? мужик с рулеткой?

  18. господа (внимательно читаю вас и то, что нахожу по теме в сети) и все таки, чем плоха моя идея с водяным уровнем? точность с ним будет приемлимая, соорудить его – стоит копейки, сетка организуется легко с помощью веревки… где в тут зарыта собака я реально не пойму

    вот кстати интересно люди пишут https://www.forumhouse.ru/threads/11011/page-3

  19. 3aвулoн, пока не выгоните все пузырьки со шланга – будет геморрой, да и вообще геморрой со шлангами бегать по всему участку, переносить отметки и т.д. и т.п.

    ротационный нивелир у кого-нить взять на вечер, примотать скотчем рулетку на рейку нужной длины и все дела

    а вообще если планы частично строиться самостоятельно, то советую вообще о лазерном нивелире или осепостроителе задуматься, а то даже если нанимаешь и приходят оконщики с 30см китайским пузырьковым (которым еще и вертикаль строят!!!), ну а потом за ними видишь уклон в 5мм на метр.

  20. у меня все это есть сто лет в обед но я в как представил сколько скакать и какая в итоге точность будет плюнул и дал денег людям с тахеометром, сам побегал с вешкой – и вуаля – готово облако точек, те рельеф уже готов и не надо ничего никуда вписывать руками

  21. Иной гость, zyu-zik, ну вы богатые, даже если такая работа стоит всего 10к – за день, можно и самому побегать с женой, рулеткой и уровнем.

    заодно и отдых от офисной работы.

  22. 3aвулoн, возьми лазерный невелир с приемником пригодится и дальше в стройке. Я вон по совету зюзика взял ADA Phantom 2D Set (он советовал ADA, а не конкретно эту модель) и дополнительно приемник и горя не знаю, всю канализацию им сделали (свыше 100 м), фундамент сделали, потом еще для дорожек пригодится учитывать рельеф. Дополнительно к нему купил алюминиевую рейку 3 метра, рулетку тряпичную 5 м и наклеил на рейку, цена вопроса вообще не о чем. Поставил невелир, и пошел с рейкой и приемником точки отбивать, затем надо развернул невелир и другой сегмент пошел. Оптика конечно поточнее будет, но там надо двоим работать, один с рейкой другой на приборе, а тут один человек может скакать с рейкой, премником, тетрадкой и карандашом. По поводу радиальной системы координат ПЕ прав, она гораздо удобнее в данном случаем чем декартова (прямоугольная), я тебе как бывший физик скажу, нарезал сразу сектора от центра невелира и пошел измерять по радиусу, затем передвинул на другой угол сектора.

    ———- Сообщение добавлено 07.06.2015 07:49 ———-

    http://www.citilink.ru/catalog/power_tools_and_garden_equipments/measuring_instruments/982534/

  23. Богатые? )) Китайские 10-метровые от 1500 начинаются )
    Но по ссылке выше дальность 70метров, точно хватит чтобы прострелить горизонт на участке и по мере строительства дома еще спасибо не раз скажете. Заборы, стены, полы, плитка, установка дверей, окон, уклон канализации в доме и т.д. и т.п. Даже полочку повесить быстрее и проще по такому уровню.

    zyu-zik, ну да, в идеале только так и надо. Но даже лазерный уровень уже прогресс по сравнению с “нехай так” :d

  24. я говорил о привлечении сторонних специалистов, о том, что не вижу какого то особого гимороя в “побегать денек самим с женой” по участку :)

    а так да, еще подумаю подумаю (время пока позволяет, мне до 20 го надо определиться с технологией измерения ям, сейчас этим просто некогда заниматься) и видимо куплю что нибудь, например девайс, который barracuda советует…

    у меня участок и есть 70 метров. Вот только с одной точки его уже точно не прострелишь – там (по состоянию на сегодня) уже вот это имеет место быть:

    [​IMG]

    ну, буду кумекать. обязательно потом опишу о результатах своих опытов.

    Вложения:

    • 07.06.2015-1.jpg
  25. отдал 5 тыщ через пол часа было готовое облако точек и е вечеру проект готов. Все. Вы потратите 3 рабочих дня и получите шляпу.

  26. скорее всего я тазик получу, там впуклость по центру, по первоначальным прикидкам – камазов на 10, но хочется знать точно…

  27. Мне некоторые советы напомнили случай с моим знакомым, который захотел курятник себе. И когда ему назвали цену в 46тыщ, сказал ну нафиг сам сделаю, доски есть, станок для роспуска тоже… В итоге станок пятидесятку не берёт и купил за 26 новый, а потом ещё какой-то за 24 и Шурик за 8 и материалов на 6тыщ, но зато сделал все сам :super:
    П.с. станки уже два года после этого пылятся)))

  28. Dimanuga, хотя достаточно было купить брусков нужной толщины тысячи на две-три :d

  29. Ну ты скажешь тоже, доска то есть, лежит в подполье, а тут как раз для дела приходилась :d

Страница 1 из 3

  • Закрыть Меню
  • Волгоградский форум

    • Поиск сообщений
    • Последние сообщения
  • Пользователи

    • Выдающиеся пользователи
    • Зарегистрированные пользователи
    • Сейчас на форуме
  • Поиск

Введение

Целью учебной практики было изучение способов машинной генерации
ландшафта.

Цель и требования к работе

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

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

  • Визуализация полученной карты высот с возможностью
    перемещения камеры.

Теоретические основы

Карты высот

Для представления ландшафта обычно используется карта высот. Карта высот
— набор значений высот для каждого значения x, z на плоскости, лежащей
горизонтально. В программировании карта высот чаще всего представляется
в виде двумерного массива переменных с плавающей точкой.

Динамическая генерация

Для возможности динамического расширения будет использоваться деление на
чанки (двумерные квадратные области) с разной детализацией. В каждый
момент времени чанки вокруг камеры (ближе определенного радиуса) должны
быть сгенерированы. Для оптимизации, разрешение (кол-во точек карты
высот) чанка будет зависеть от расстояния до камеры.

Детализация чанков

Т.к. подразумевается генерация весьма большой области (расстояние на
которое видит человеческий глаз) необходимо провести некоторые
оптимизации. Например, для чанков введем понятие уровня детализации.
Пусть размер чанка 65×65. Тогда на 0-м уровне детализации размер чанка
65×65, на 1-м 33×33, на 2-м 17×17 и т.д. Т.е. при увеличении уровня на
1, размер сетки чанка уменьшается в 2 раза.

chunks.png

Алгоритмы генерации карты высот

Существуют множество способов создания карты высот, но почти все они
схожи в одном — использование шумов. Рассмотрим некоторые наиболее
распространенные:

  • Diamond-square
    Данный алгоритм дает хороший результат и позволяет догенерировать чанк
    до нужной детализации, но генерация происходит увеличением детализации.
    Т.е. сначала генерируется сетка 3×3, затем 7×7, 17×17, 33×33, …
    Из-за этого, этому алгоритму необходимо заранее иметь всю карту высот
    (генерация происходит сверху вниз). Нам необходима возможность
    достраивать карту высот динамически, поэтому этот алгоритм не подходит.

  • Perlin Noise
    Данный алгоритм также дает хороший результат, и не зависит от уже
    сгенерированной карты высот. Т.к. каждой точке на карте высот
    соответствует функция, данный алгоритм позволяет динамически достраивать
    карту высот и увеличивать детализацию уже сгенерированных чанков.

Добавление водной эрозии

Для создания эффекта водной эрозии есть несколько алгоритмов. Один из
них приведен по ссылке ниже.
http://www-evasion.imag.fr/Publications/2007/MDH07/FastErosion_PG07.pdf
Данный алгоритм требует полностью сгенерированную карту высот для
работы, для динамического расширения карты высот и увеличения
детализации чанков он не подходит. Подходящий алгоритм найти не удалось.

Реализация

Хранение карты высот и чанков

Вся карта высот хранится в ассоциативном массиве, где ключ –
целочисленная координата, значение – значение высота в данной точке. Это
позволяет

  1. Динамически расширять карту высот

  2. В отличие от двумерного массива занимает только необходимую память
    (детализация чанков может отличаться => не все координаты будут
    сразу сгенерированы)

  3. Дает доступ к точке карты высот практически за константное время.

Сами чанки – лишь абстракция. По сути чанк – квадратная область на карте
высот => может быть получен простым пересчетом координат (с учетом
детализации).

Алгоритмы генерации карты высот

Были реализованы оба алгоритма (Diamond-square и Perlin Noise).
Diamond-square не подошел в явном виде, его пришлось дорабатывать. Это
ухудшило результат работы и было решено не использовать его. Реализация
Perlin Noise решала все поставленные задачи.

Добавление водной эрозии

Был реализован алгоритм
http://www-evasion.imag.fr/Publications/2007/MDH07/FastErosion_PG07.pdf.
Были попытки доработать его для поставленной задачи, но не получилось.

Визуализация

Для визуализации ландшафта использовался движок Unity. Ландшафт
представлялся в виде группы стандартных Terrain объектов. Каждому чанку
соответствовал Terrain. При перемещении камеры все Terrain в области
вокруг игрока обновлялись (если Terrain не был сгенерирован раньше, то
он генерировался в низшем разрешении, если Terrain уже сгенерирован, то
при необходимости его разрешение увеличивалось)

Примеры генерации:

sample1.png

sample2.png

Карты высот

Карты высот — это двухмерные карты, используемые для хранения высот ландшафта. Обычно они хранятся как 8-разрядные изображения с градациями серого, где каждая точка изображения хранит высоту ландшафта в соответствующей позиции. Изображение карты высот представлено на рис. 10.1.

Рис. 10.1. Пример карты высот

Рис. 10.1. Пример карты высот

Чтобы построить ландшафт из карты высот вам сперва надо построить сетку вершин той же размерности, что и у карты высот, а затем использовать значение высоты каждой точки (пикселя) из карты высот как высоту для вершины в сетке вершин. Например, вы можете использовать карту высот разрешением 6 × 6 пикселей для смещения высоты каждой вершины в сетке вершин 6 × 6.

Помимо местоположения, каждая вершина сетки содержит другие атрибуты, необходимые для визуализации, такие как нормаль и координаты текстуры. На рис. 10.2 показана сетка вершин 6 × 6, созданная в мировой плоскости XZ, где высота каждой вершины задается по мировой оси Y.

Рис. 10.2. Сетка вершин 6 х 6, созданная в плоскости XZ

Рис. 10.2. Сетка вершин 6 × 6, созданная в плоскости XZ

В сетке вершин вы должны определить расстояние между каждой парой вершин (по вертикали и по горизонтали). На рис. 10.2 это расстояние называется «размер блока». Меньшее расстояние между вершинами позволяет сгладить перепады между высотами вершин, но уменьшает размер сетки, в то время как большое расстояние между вершинами увеличивает размер сетки, но может привести к резким перепадам между высотами вершин. Таким образом, если расстояние между каждой парой вершин (по вертикали и по горизонтали) составляет 1 метр, общий размер сгенерированного ландшафта будет 255 × 255 метров.

Карта высот ландшафта обычно хранится в 8-разрядном изображении, ее значения высот варьируются от 0 до 255, где 0 (черный цвет) представляет самую низкую высоту вершины, а 255 (белый цвет) представляет максимально возможную высоту вершины. Вы можете расширить этот интервал, используя коэффициент масштабирования, который умножается на заданное значение высоты, увеличивая его диапазон. Это обеспечивает больший интервал высот, но с меньшей точностью между значениями. На рис. 10.3 показан трехмерный ландшафт, построенный из карты высот с рис. 10.1, визуализированный в каркасном (сверху) и сплошном (снизу) режимах.

Рис. 10.3. Ландшафт, сгенерированный из карты высот

Рис. 10.3. Ландшафт, сгенерированный из карты высот на рис 10.1 и визуализированный в каркасном и сплошном режимах

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

Генерация карты высот

Вы можете строить или получать карты высот разными способами. Вы можете найти различные типы карт высот повсюду в Интернете, в том числе и карты высот реальных мест (городов и т.д.). Поскольку карты высот являются изображениями с градациями серого, вы можете использовать для построения и редактирования ваших собственных карт высот любой графический редактор. Также некоторые утилиты позволяют выполнять процедурную генерацию карт высот ландшафта на основе заданных пользователем параметров.

Один из простейших и быстрейших способов построения карт высот — использование утилит процедурной генерации, таких как Terragen (http://www.planetside.co.uk/terragen/). Terragen позволяет генерировать карты высот с различными, определяемыми пользователем параметрами, такими как размер ландшафта, реализм, сглаженность, гляцинация и изрезанность. Одно из преимуществ Terragen в том, что вы его можете использовать бесплатно для некоммерческих приложений. Позже художник может почистить сгенерированную Terragen карту высот.

Другой утилитой, которую можно использовать для создания карт высот, является EarthSculptor (http://www.earthsculptor.com/). В EarthSculptor есть несколько внутренних инструментов для трехмерного моделирования ландшафта, и она позволяет сохранять модели ландшафтов как карты высот.

Форматы файлов карт высот

Для хранения карт высот используется необработанный формат файлов RAW. Этот формат просто читать, поскольку он не содержит заголовков с какой-либо информацией об изображении, такой как размер или тип изображения. Файлы RAW являются просто двоичными файлами, содержащими только данные о высотах ландшафта. В 8-разрядных картах высот каждый байт внутри файла RAW представляет высоту вершины.

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

Добавить комментарий