hmm - это утилита в восемь м .
Если вы сделали какую -либо разработку 3D -игры, 3D -печать или другие подобные вещи, вы, вероятно, хотели преобразовать изображение высоты серого в 3D -сетку. Наивный путь довольно прост, но генерирует огромные сетки с миллионами треугольников. После того, как я пробирался через различные решения за эти годы, я наконец решил, что мне нужно написать хороший инструмент для этой цели.
hmm - это современная внедрение хорошего алгоритма из бумаги 1995 года быстрого полигонального приближения местности и высоты гирлянда и Хекберта. Сетки, произведенные hmm удовлетворяют условию Делауны, и могут удовлетворить указанную максимальную ошибку или максимальное количество треугольников или вершин. Это также очень быстро.
brew install glm # on macOS
sudo apt-get install libglm-dev # on Ubuntu / Debian
git clone https://github.com/fogleman/hmm.git
cd hmm
make
make install heightmap meshing utility
usage: hmm --zscale=float [options] ... infile outfile.stl
options:
-z, --zscale z scale relative to x & y (float)
-x, --zexagg z exaggeration (float [=1])
-e, --error maximum triangulation error (float [=0.001])
-t, --triangles maximum number of triangles (int [=0])
-p, --points maximum number of vertices (int [=0])
-b, --base solid base height (float [=0])
--level auto level input to full grayscale range
--invert invert heightmap
--blur gaussian blur sigma (int [=0])
--gamma gamma curve exponent (float [=0])
--border-size border size in pixels (int [=0])
--border-height border z height (float [=1])
--normal-map path to write normal map png (string [=])
--shade-path path to write hillshade png (string [=])
--shade-alt hillshade light altitude (float [=45])
--shade-az hillshade light azimuth (float [=0])
-q, --quiet suppress console output
-?, --help print this message
hmm поддерживает различные форматы файлов, такие как PNG, JPG и т. Д. Для входной высоты. Вывод всегда является двоичным файлом STL. Единственный другой необходимый параметр -z , который указывает, сколько масштабировать ось z в выходной сетке.
$ hmm input.png output.stl -z ZSCALEВы также можете предоставить максимальную допустимую ошибку, количество треугольников или количество вершин. (Если указано несколько, используется первая достигнутая.)
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000Нажмите на изображение ниже, чтобы увидеть примеры различных аргументов командной строки. Вы можете попробовать эти примеры самостоятельно с этой высотой: gale.png.
Требуемый параметр -z определяет расстояние между полностью черным пикселем и полностью белым пикселем в вертикальной оси Z, с единицами, равными ширине или высоте одного пикселя. Например, если каждый пиксель в высоте представлял площадь 1x1 -метров, а вертикальный диапазон высоты составлял 100 метров, то следует использовать -z 100 .
Параметр -x -это просто дополнительный множитель на вершине предоставленной шкалы Z. Он предоставляется в качестве удобства, поэтому вам не нужно делать умножение в своей голове, чтобы преувеличить, например, 2x, поскольку шкалы Z часто получают из реальных данных и могут иметь странные значения, такие как 142.2378.
Параметр -e определяет максимально разрешенную ошибку в выходной сетке, как процент от общей высоты сетки. Например, если используется -e 0.01 , то ни один пиксель не будет иметь ошибки более 1% от расстояния между полностью черным пикселем и полностью белым пикселем. Это означает, что для 8-битного входного изображения ошибка e = 1 / 256 ~= 0.0039 гарантирует, что ни у одного пикселя нет ошибки, превышающей один полный блок серого. (Все еще может быть желательно использовать более низкое значение, например, 0.5 / 256 )
Когда опция -b используется для создания твердой сетки, она определяет высоту основания до того, как появится самая низкая часть высоты, в процентах от высоты высоты. Например, если бы использовался -z 100 -b 0.5 , то последняя сетка была бы высотой около 150 единиц (если на входе существует полностью белый пиксель).
Граница может быть добавлена в сетку с флагами --border-size и --border-height . Высокая карта будет пролакнута пикселями по border-size перед триангуляцией. Значение (предварительно масштабное) Z может быть установлено с border-height что по умолчанию до 1.
Гауссовое размытие может быть применено с флагом --blur . Это особенно полезно для шумных изображений.
HeightMap может быть перевернута с флагом --invert . Это полезно для литофанов.
Высокая карта может быть автоматически выровнена с --level . Это расширит значения серого, чтобы использовать весь белый диапазон Black =>.
Гамма -кривая может быть применена на карту высоты с флагом --gamma . Это применяется x = x ^ gamma к каждому пикселю, где x находится в [0, 1].
Обычная карта с полным разрешением может быть сгенерирована с помощью аргумента --normal-map . Это сохранит нормальную карту в виде RGB PNG для указанного пути. Это полезно для того, чтобы оформить удары и детали более высокого разрешения при использовании сетки треугольника с более низким разрешением.
Образ Hillshade с серого может быть сгенерировано с помощью аргумента --shade-path . Высота и азимут источника света могут быть изменены с помощью аргументов --shade-alt и --shade-az , которые по умолчанию до 45 градусов по высоте и 0 градусов от севера (вверх).
Производительность сильно зависит от количества деталей в высоте, но вот несколько цифр для примера высоты площадью 40x40 километров, центрированной на горе Эверест. Показаны различные разрешения высоты и разрешенные максимальные ошибки. Times, рассчитанная на 13 "MacBook Pro 2018 года (2,7 ГГц Intel Core i7).
| Размер изображения / ошибка | E = 0,01 | E = 0,001 | E = 0,0005 | E = 0,0001 |
|---|---|---|---|---|
| 9490 x 9490 px (90,0 Мп) | 6.535 | 13.102 | 19.394 | 58.949 |
| 4745 x 4745 px (22,5 Мп) | 1.867 | 4.903 | 8.886 | 33,327 |
| 2373 x 2373 PX (5,6 Мп) | 0,559 | 2.353 | 4.930 | 14.243 |
| 1187 x 1187 PX (1,4 Мп) | 0,168 | 1.021 | 1.961 | 3.709 |
| Размер изображения / ошибка | E = 0,01 | E = 0,001 | E = 0,0005 | E = 0,0001 |
|---|---|---|---|---|
| 9490 x 9490 px (90,0 Мп) | 33 869 | 1 084 972 | 2467 831 | 14 488 022 |
| 4745 x 4745 px (22,5 Мп) | 33,148 | 1 032 263 | 2 323 772 | 11 719 491 |
| 2373 x 2373 PX (5,6 Мп) | 31 724 | 935,787 | 1 979 227 | 6 561 070 |
| 1187 x 1187 PX (1,4 Мп) | 27 275 | 629,352 | 1 160,079 | 2 347 713 |