hmm est un utilitaire h AP M eshing h huit.
Si vous avez effectué un développement de jeu 3D, une impression 3D ou d'autres choses de ce type, vous vouliez probablement convertir une image de lampe de hauteur en niveaux de gris en un maillage 3D. La manière naïve est assez simple mais génère d'énormes mailles avec des millions de triangles. Après avoir piraté mon chemin à travers diverses solutions au fil des ans, j'ai finalement décidé que je devais écrire un bon outil à cet effet.
hmm est une mise en œuvre moderne d'un bel algorithme de l'approximation polygonale rapide du papier de 1995 des terrains et des champs de hauteur par Garland et Heckbert. Les mailles produites par hmm satisfont à la condition de Delaunay et peuvent satisfaire une erreur maximale spécifiée ou un nombre maximal de triangles ou de sommets. C'est aussi très rapide.
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 prend en charge une variété de formats de fichiers comme PNG, JPG, etc. pour la hauteur d'entrée. La sortie est toujours un fichier STL binaire. Le seul autre paramètre requis est -z , qui spécifie la quantité à évoluer l'axe z dans le maillage de sortie.
$ hmm input.png output.stl -z ZSCALEVous pouvez également fournir une erreur maximale autorisée, un nombre de triangles ou un nombre de sommets. (Si plusieurs sont spécifiés, le premier atteint est utilisé.)
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000Cliquez sur l'image ci-dessous pour voir des exemples de divers arguments de ligne de commande. Vous pouvez essayer vous-même ces exemples avec cette hauteur map: gale.png.
Le paramètre -z requis définit la distance entre un pixel entièrement noir et un pixel entièrement blanc dans l'axe z vertical, avec des unités égales à une largeur ou une hauteur de pixels. Par exemple, si chaque pixel de la hauteur de la hauteur représentait une zone carrée de 1x1 mètre et que la plage verticale de la carte de hauteur était de 100 mètres, alors -z 100 doit être utilisé.
Le paramètre -x est simplement un multiplicateur supplémentaire au-dessus de l'échelle Z fournie. Il est fourni comme une commodité, vous n'avez donc pas à faire de multiplication dans votre tête juste pour exagérer, par exemple 2x, car les échelles z sont souvent dérivées de données réelles et peuvent avoir des valeurs étranges comme 142.2378.
Le paramètre -e définit l'erreur maximale autorisée dans le maillage de sortie, en pourcentage de la hauteur totale du maillage. Par exemple, si -e 0.01 est utilisé, alors aucun pixel n'aura une erreur de plus de 1% de la distance entre un pixel entièrement noir et un pixel entièrement blanc. Cela signifie que pour une image d'entrée 8 bits, une erreur d' e = 1 / 256 ~= 0.0039 garantira qu'aucun pixel n'a une erreur supérieure à une unité complète en niveaux de gris. (Il peut toujours être souhaitable d'utiliser une valeur inférieure comme 0.5 / 256 )
Lorsque l'option -b est utilisée pour créer un maillage solide, il définit la hauteur de la base avant que la partie la plus basse de la hauteur n'apparaisse, en pourcentage de la hauteur de la hauteur. Par exemple, si -z 100 -b 0.5 était utilisé, le maillage final serait d'environ 150 unités de haut (si un pixel entièrement blanc existe dans l'entrée).
Une bordure peut être ajoutée au maillage avec les drapeaux --border-size et de --border-height . La touche de hauteur sera rembourrée par des pixels border-size avant de triangulonner. La valeur z (pré-échelle) de la bordure peut être définie avec border-height qui est par défaut 1.
Un flou gaussien peut être appliqué avec le drapeau --blur . Ceci est particulièrement utile pour les images bruyantes.
La hauteur MAP peut être inversée avec le drapeau --invert . Ceci est utile pour les lithophanes.
La taille de hauteur peut être automatiquement du niveau avec le drapeau --level . Cela étirera les valeurs de niveaux de gris pour utiliser toute la plage noire => blanc.
Une courbe gamma peut être appliquée à la touche de hauteur avec le drapeau --gamma . Cela applique x = x ^ gamma à chaque pixel, où x est dans [0, 1].
Une carte normale à pleine résolution peut être générée avec l'argument --normal-map . Cela enregistrera une carte normale en tant que RVB PNG sur le chemin spécifié. Ceci est utile pour rendre les bosses et les détails de résolution plus élevée lors de l'utilisation d'un maillage triangulaire de résolution inférieure.
Une image de Hillshade en niveaux de gris peut être générée avec l'argument --shade-path . L'altitude et l'azimut de la source lumineuse peuvent être modifiés avec les arguments --shade-alt et --shade-az , qui par défaut à 45 degrés en altitude et 0 degrés du nord (UP).
Les performances dépendent beaucoup de la quantité de détails dans la hauteur de la hauteur, mais voici quelques chiffres pour un exemple de feuille de hauteur d'une zone de 40 x 40 kilomètres centrée sur le mont Everest. Différentes résolutions de mAP de hauteur et des erreurs maximales autorisées sont affichées. Times calculés sur un MacBook Pro 2018 13 "(2,7 GHz Intel Core i7).
| Taille / erreur de l'image | 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 |
| Taille / erreur de l'image | 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 |