hmm es una utilidad H de ocho m de AP m .
Si ha realizado algún desarrollo de juegos 3D, impresión 3D u otras cosas similares, es probable que haya querido convertir una imagen de mapas de altura en la escala de grises en una malla 3D. La forma ingenua es bastante simple, pero genera grandes mallas con millones de triángulos. Después de piratear varias soluciones a lo largo de los años, finalmente decidí que necesitaba escribir una buena herramienta para este propósito.
hmm es una implementación moderna de un algoritmo agradable del papel de 1995 rápido aproximación poligonal rápida de terrenos y campos de altura por Garland y Heckbert. Las mallas producidas por hmm satisfacen la condición de Delaunay y pueden satisfacer un error máximo especificado o un número máximo de triángulos o vértices. También es muy rápido.
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 admite una variedad de formatos de archivo como PNG, JPG, etc. para el mapa de altura de entrada. La salida es siempre un archivo STL binario. El único otro parámetro requerido es -z , que especifica cuánto escalar el eje Z en la malla de salida.
$ hmm input.png output.stl -z ZSCALETambién puede proporcionar un error máximo permitido, número de triángulos o número de vértices. (Si se especifican múltiples, se usa el primero alcanzado).
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000Haga clic en la imagen a continuación para ver ejemplos de varios argumentos de línea de comandos. Puede probar estos ejemplos usted mismo con este mapa de altura: gale.png.
El parámetro -z requerido define la distancia entre un píxel completamente negro y un píxel completamente blanco en el eje Z vertical, con unidades igual a un ancho o altura de un píxel. Por ejemplo, si cada píxel en el mapa de altura representaba un área cuadrada de 1x1 metros, y el rango vertical del mapa de altura era de 100 metros, entonces -z 100 debería usarse.
El parámetro -x es simplemente un multiplicador adicional en la parte superior de la escala Z proporcionada. Se proporciona como conveniencia para que no tenga que hacer multiplicación en su cabeza solo para exagerar, por ejemplo, 2X, ya que las escalas Z a menudo se derivan de datos del mundo real y pueden tener valores extraños como 142.2378.
El parámetro -e define el error máximo permitido en la malla de salida, como un porcentaje de la altura de la malla total. Por ejemplo, si se usa -e 0.01 , entonces ningún píxel tendrá un error de más del 1% de la distancia entre un píxel completamente negro y un píxel completamente blanco. Esto significa que para una imagen de entrada de 8 bits, un error de e = 1 / 256 ~= 0.0039 asegurará que ningún píxel tenga un error mayor a una unidad de escala de grises completa. (Todavía puede ser deseable usar un valor más bajo como 0.5 / 256 ).
Cuando la opción -b se usa para crear una malla sólida, define la altura de la base antes de que aparezca la parte más baja de la Mesh de altura, como un porcentaje de la altura del mapa de altura. Por ejemplo, si se usaron -z 100 -b 0.5 , entonces la malla final sería de aproximadamente 150 unidades de altura (si existe un píxel completamente blanco en la entrada).
Se puede agregar un borde a la malla con las banderas --border-size y --border-height . El mapa de altura estará acolchado por píxeles border-size antes de triangular. El valor z (preescalado) del borde se puede establecer con border-height lo cual es predeterminado a 1.
Se puede aplicar un desenfoque gaussiano con la bandera --blur . Esto es particularmente útil para imágenes ruidosas.
El mapa de altura se puede invertir con el indicador --invert . Esto es útil para los lithophanes.
El mapa de altura se puede nivelar automático con la bandera --level . Esto estirará los valores de la escala de grises para usar todo el rango negro => blanco.
Se puede aplicar una curva gamma a la mapa de altura con la bandera --gamma . Esto se aplica x = x ^ gamma a cada píxel, donde x está en [0, 1].
Se puede generar un mapa normal de resolución completa con el argumento --normal-map . Esto guardará un mapa normal como un PNG RGB en la ruta especificada. Esto es útil para hacer baches y detalles de mayor resolución mientras se usa una malla triangular de menor resolución.
Se puede generar una imagen de escala de grises con el argumento --shade-path . La altitud y el acimut de la fuente de luz se pueden cambiar con los argumentos --shade-alt y --shade-az , que por defecto a 45 grados en altitud y 0 grados desde el norte (arriba).
El rendimiento depende mucho de la cantidad de detalles en el mapa de altura, pero aquí hay algunas figuras para un mapa de altura de ejemplo de un área de 40x40 kilómetros centrada en el monte Everest. Se muestran varias resoluciones de mapas de altura y errores máximos permitidos. Times calculado en un MacBook Pro 2018 13 "(Intel Core i7 de 2.7 GHz).
| Tamaño / error de la imagen | E = 0.01 | E = 0.001 | E = 0,0005 | E = 0.0001 |
|---|---|---|---|---|
| 9490 x 9490 PX (90.0 MP) | 6.535 | 13.102 | 19.394 | 58.949 |
| 4745 x 4745 PX (22.5 MP) | 1.867 | 4.903 | 8.886 | 33.327 |
| 2373 x 2373 PX (5.6 MP) | 0.559 | 2.353 | 4.930 | 14.243 |
| 1187 x 1187 PX (1.4 MP) | 0.168 | 1.021 | 1.961 | 3.709 |
| Tamaño / error de la imagen | E = 0.01 | E = 0.001 | E = 0,0005 | E = 0.0001 |
|---|---|---|---|---|
| 9490 x 9490 PX (90.0 MP) | 33,869 | 1.084.972 | 2,467,831 | 14,488,022 |
| 4745 x 4745 PX (22.5 MP) | 33,148 | 1.032.263 | 2,323,772 | 11,719,491 |
| 2373 x 2373 PX (5.6 MP) | 31,724 | 935,787 | 1.979,227 | 6,561,070 |
| 1187 x 1187 PX (1.4 MP) | 27,275 | 629,352 | 1.160.079 | 2,347,713 |