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