Vasara Posted September 13, 2020 Share Posted September 13, 2020 (edited) Добрый день! Пытаюсь собрать lmap из сгенерированных карт высот. Есть несколько не понятных моментов. Как рассчитать высоту? Например при разрешении в 0.25 m/p получится чуть больше пол метра? Есть ли возможность менять высоту тайлов по Z координатной оси? Или же карту можно разрезать как то по другому, чтобы работать с высотой? Что модифицирует scale factor для высот? С Уважением Константин. Edited September 15, 2020 by Vasara Link to comment
bmyagkov Posted September 14, 2020 Share Posted September 14, 2020 Здравствуйте! Quote Как рассчитать высоту? Например при разрешении в 0.25 m/p получится чуть больше пол метра? Здесь не совсем понятно о чем конкретно идет речь, говоря о плотности данных мы как правило подразумеваем размер сетки, которая характеризуется параметрами метр на пиксель, а значение высоты в каждой точке в свою очередь зависит от того, какая величина записана для данного пикселя в карту высот для этой точки. Вы можете иметь одну и ту же карту высот, например, файл размером 1302 на 1303 как на изображении ниже, для которого после импорта вы указали размер в редакторе идентичный разрешению самого файла, в таком случае плотностью данных будет один к одному - один метр на пиксель, но тот же самый файл может иметь детализацию в сто раз хуже, сто метров на пиксель, например, достаточно увеличить в редакторе Edit Size размер для LandscapeLayerMap в сто раз, но в таком случае данные высот "поедут" так как изначально карта была выгружена с другой плотностью. Всё зависит от того, в каком разрешении вы выгружаете данные и какой размер карты указываете редакторе после импорта и нужно понимать, что редактор только интерпретирует поданные на вход данные, все остальное определяет пользователь на этапе выгрузки карт высот и альбедо из сторонних приложений. Ниже карта высот с использованием реальных данных (Grand Canyon National Park) открытый в программе RenderDoc. По правому клику мыши в указанной точке, в строке статуса ниже, отобразится значение высоты в выбранном месте, в данном примере оно будет равно 2411.45703 и чем темнее цвет, тем меньше будет значение. Если вы используете подобные карты как на изображении выше, хранящие реальные данные высот в каждом пикселе - в редакторе на этапе импорта установите "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" то это просто множитель, по умолчанию он равен единице и отображает поданные на выход значения высот как есть, один к одному, не искажая их. Иногда, есть кейсы в которых необходимо быстро и в реальном времени изменить масштаб, кратно умножив исходные данные значения высот. Link to comment
Vasara Posted September 14, 2020 Author Share Posted September 14, 2020 Спасибо за развёрнутый ответ. 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 ()" или его аналог. И если подобный метод существует, то где о нём можно почитать. Link to comment
danvern Posted September 15, 2020 Share Posted September 15, 2020 Здравствуйте, высота зависит от величины пикселя, которая записана в карту высот тоесть в вашем случае от 0.0f -1.0f, так же это равно от 0 метров до 1 метра, так как в Unigine 1 unit == 1 метрgetExtremumHeight - считает уже по вашим данным экстремумы 15 hours ago, Vasara said: А как подсчитать высоту не понимаю Вот тут не совсем понял, что значит подсчитать высоту? Link to comment
Vasara Posted September 15, 2020 Author Share Posted September 15, 2020 3 hours ago, danvern said: Вот тут не совсем понял, что значит подсчитать высоту? А всё, дошло. (0.0f, 1.0f) указан в классе Image как стандарт для r32f, который принимает движок. А сохранять в lmap можно величины в гораздо большем диапазоне. К примеру, перемножив все точки на highRange - lowRange. Может ещё какому начинающему окажется полезным. Большое спасибо за столь оперативные и детальные ответы. 1 Link to comment
Recommended Posts