Sign in to follow this  
photo

[SOLVED] Принцип "работы" высот.

Recommended Posts

Добрый день!

Пытаюсь собрать lmap из сгенерированных карт высот. Есть несколько не понятных моментов.

Как рассчитать высоту? Например при разрешении в 0.25 m/p получится чуть больше пол метра?

Есть ли возможность менять высоту тайлов по Z координатной оси? Или же карту можно разрезать как то по другому, чтобы работать с высотой?

Что модифицирует  scale factor для высот? 

С Уважением Константин.

 

Edited by Vasara

Share this post


Link to post

Здравствуйте!

Quote

Как рассчитать высоту? Например при разрешении в 0.25 m/p получится чуть больше пол метра?

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

Вы можете иметь одну и ту же карту высот, например, файл размером 1302 на 1303 как на изображении ниже, для которого после импорта вы указали размер в редакторе идентичный разрешению самого файла, в таком случае плотностью данных будет один к одному - один метр на пиксель, но тот же самый файл может иметь детализацию в сто раз хуже, сто метров на пиксель, например, достаточно увеличить в редакторе Edit Size размер для LandscapeLayerMap в сто раз, но в таком случае данные высот "поедут" так как изначально карта была выгружена с другой плотностью.

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

Ниже карта высот с использованием реальных данных (Grand Canyon National Park) открытый в программе RenderDoc. По правому клику мыши в указанной точке, в строке статуса ниже, отобразится значение высоты в выбранном месте, в данном примере оно будет равно 2411.45703 и чем темнее цвет, тем меньше будет значение.

изображение.png

Если вы используете подобные карты как на изображении выше, хранящие реальные данные высот в каждом пикселе - в редакторе на этапе импорта установите "unnormalized" для heightmap, программа сама считает значение высоты в каждой точке и сгенерирует террейн нужным образом, вам останется только установить корректный Edit Size размер карты, равный тому значению, которое было указанно на этапе выгрузки данных в стороннем приложении, на изображении оно равно 1302х1303

Выгружаете normalized данные - выбираете соответствующее значение в параметрах импорта LandscapeLayerMap, в таком случае вы должны знать крайние значения Height Max и Height Min, эти данные вы также берете из стороннего приложения, откуда выгружаете данные, как например Global Mapper или World Machine. В этом варианте heightmap хранит в каждом пикселе значение от 0.0000 до 1.0000, где ноль может быть равен значению -1000, а единица 5000, эти значения определяются пользователем на этапе выгрузки данных и чтобы редактор их корректно интерпретировал на этапе генерации, необходимо указать значения Height Min и Height Max в параметрах импорта LandscapeLayerMap

Quote

Есть ли возможность менять высоту тайлов по Z координатной оси? Или же карту можно разрезать как то по другому, чтобы работать с высотой?

Для регулировки значения высоты по Z есть такие параметры как Height Max, Height Min, Unnormalized/Normalized, Height Scale, о предназначении каждого из параметров можно подробнее прочитать в нашей документации здесь  https://developer.unigine.com/en/docs/2.12/objects/objects/terrain/landscape_terrain/landscape_layer_map?rlang=cpp

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

15 hours ago, Vasara said:

Что модифицирует  scale factor для высот? 

Если вы имели в виду параметр "Height Scale" то это просто множитель, по умолчанию он равен единице и отображает поданные на выход значения высот как есть, один к одному, не искажая их. Иногда, есть кейсы в которых необходимо быстро и в реальном времени изменить масштаб, кратно умножив исходные данные значения высот.

Share this post


Link to post

Спасибо за развёрнутый ответ.

28 minutes ago, bmyagkov said:

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

Я, видимо, не совсем корректно описал проблему. Сторонними приложениями не пользуюсь, до редактора ещё не дошли руки. Работаю только с API. Все карты высот генерируются Unigine в диапазоне (0.0f , 1.0f) и сохраняются в *.dds файлы. Если загружать как есть, с разрешениями LandscapeLayerMap - 512х512, source.dds - 2048x2048. Длина и ширина 512 / 2048 = 0.25 метра/пиксель. А как подсчитать высоту не понимаю.

В API я нашёл метод setHeightScal(), который мне не подходит. Также через API можно запросить экстремумы методом getExtremumHeight () . То есть эти данные где то хранятся в lmap и на каком то этапе их можно задать. Могу ли я вызвать метод "setExtremumHeight ()" или его аналог. И если подобный метод существует, то где о нём можно почитать. 

Share this post


Link to post

Здравствуйте, высота  зависит от величины пикселя, которая записана в карту высот тоесть в вашем случае от 0.0f -1.0f, так же это равно от 0 метров до 1 метра, так как в Unigine 1 unit == 1 метр
getExtremumHeight - считает уже по вашим данным экстремумы 

15 hours ago, Vasara said:

А как подсчитать высоту не понимаю

Вот тут не совсем понял, что значит подсчитать высоту?

Share this post


Link to post
3 hours ago, danvern said:

Вот тут не совсем понял, что значит подсчитать высоту?

А всё, дошло. (0.0f, 1.0f) указан в классе Image как стандарт для r32f, который принимает движок. А сохранять в lmap можно величины в гораздо большем диапазоне. К примеру, перемножив все точки на highRange - lowRange. Может ещё какому начинающему окажется полезным. Большое спасибо за столь оперативные и детальные ответы.

  • Like 1

Share this post


Link to post
Sign in to follow this