hmm ist ein U -Nutzen von acht m ap M eshing.
Wenn Sie 3D -Spieleentwicklung, 3D -Druck oder andere solche Dinge durchgeführt haben, wollten Sie wahrscheinlich ein Graustufen -Heightmap -Bild in ein 3D -Netz umwandeln. Der naive Weg ist ziemlich einfach, erzeugt aber riesige Maschen mit Millionen von Dreiecken. Nachdem ich mich im Laufe der Jahre durch verschiedene Lösungen gehackt hatte, entschied ich schließlich, dass ich für diesen Zweck ein gutes Werkzeug schreiben musste.
hmm ist eine moderne Implementierung eines schönen Algorithmus aus dem Papier von 1995 schnell polygonaler Annäherung an Gebiet und Höhenfelder von Garland und Heckbert. Die von hmm erzeugten Netze erfüllen den Zustand der Delaunay und können einen bestimmten maximalen Fehler oder eine maximale Anzahl von Dreiecken oder Scheitelpunkten erfüllen. Es ist auch sehr schnell.
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 unterstützt eine Vielzahl von Dateiformaten wie PNG, JPG usw. für die Eingangshöhe. Die Ausgabe ist immer eine binäre STL -Datei. Der einzige andere erforderliche Parameter ist -z , der angibt, wie viel die Z -Achse im Ausgangsnetz skalieren kann.
$ hmm input.png output.stl -z ZSCALESie können auch einen maximal zulässigen Fehler, die Anzahl der Dreiecke oder die Anzahl der Scheitelpunkte liefern. (Wenn mehrere angegeben werden, wird der erste erreicht.)
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000Klicken Sie auf das Bild unten, um Beispiele für verschiedene Befehlszeilenargumente anzuzeigen. Sie können diese Beispiele selbst mit dieser HeightMap: gale.png ausprobieren.
Der erforderliche Parameter -z definiert den Abstand zwischen einem vollständig schwarzen Pixel und einem vollständig weißen Pixel in der vertikalen Z -Achse mit Einheiten, die einer Pixelbreite oder -höhe entsprechen. Wenn beispielsweise jedes Pixel in der Höhe einer 1x1 -Meter -Quadratfläche darstellte und der vertikale Bereich der Höhe der Höhe von 100 Metern betrug, sollte -z 100 verwendet werden.
Der Parameter -x ist einfach ein zusätzlicher Multiplikator über der bereitgestellten Z -Skala. Es wird als Bequemlichkeit bereitgestellt, sodass Sie nicht in Ihrem Kopf eine Multiplikation durchführen müssen, nur um durch, z. B. 2x, zu übertreiben, da Z -Skalen häufig aus realen Daten abgeleitet sind und seltsame Werte wie 142.2378 haben können.
Der -e -Parameter definiert den maximal zulässigen Fehler im Ausgangsnetz als Prozentsatz der gesamten Netzhöhe. Wenn beispielsweise -e 0.01 verwendet wird, hat kein Pixel einen Fehler von mehr als 1% des Abstands zwischen einem vollständig schwarzen Pixel und einem vollständig weißen Pixel. Dies bedeutet, dass für ein 8-Bit-Eingabebild ein Fehler von e = 1 / 256 ~= 0.0039 sicherstellt, dass kein Pixel einen Fehler von mehr als einer Vollgrad-Einheit aufweist. (Es kann immer noch wünschenswert sein, einen niedrigeren Wert mit 0.5 / 256 zu verwenden.)
Wenn die Option -b verwendet wird, um ein festes Netz zu erzeugen, definiert sie die Höhe der Basis, bevor der niedrigste Teil der Höhe der Höhe erscheint, als Prozentsatz der Höhe des Heightmap. Wenn beispielsweise -z 100 -b 0.5 verwendet würde, wäre das endgültige Netz etwa 150 Einheiten hoch (wenn ein vollständig weißes Pixel im Eingang vorhanden ist).
Ein Rand kann dem Netz mit den Flaggen mit der --border-size und --border-height hinzugefügt werden. Die Heightmap wird vor dem Triangulieren von border-size gepolstert. Der (vorskalierte) Z-Wert der Grenze kann mit border-height festgelegt werden, die standardmäßig 1 ist.
Eine Gaußsche Unschärfe kann mit der Flagge --blur angewendet werden. Dies ist besonders nützlich für laute Bilder.
Die Heightmap kann mit der Flagge --invert umgekehrt werden. Dies ist nützlich für Lithophaner.
Die Heightmap kann mit der Flagge --level Flagge automatisch aufgetragen werden. Dadurch wird die Graustufenwerte ausgeweitet, um den gesamten Schwarz => Weißer Bereich zu verwenden.
Eine Gamma -Kurve kann mit der Flagge --gamma auf die Heightmap angewendet werden. Dies gilt für jedes Pixel x = x ^ gamma , wobei x in [0, 1] ist.
Eine normale MAP mit voller Auflösung kann mit dem Argument --normal-map erzeugt werden. Dadurch speichert eine normale Karte als RGB -PNG für den angegebenen Pfad. Dies ist nützlich, um Unebenheiten und Details mit höherer Auflösung bei der Verwendung eines Dreiecks mit niedrigerer Auflösung zu rendern.
Ein Graustufen-Hillschattenbild kann mit dem Argument --shade-path erzeugt werden. Die Höhe und der Azimut der Lichtquelle können mit den Argumenten --shade-alt und --shade-az , die in Höhe von 45 Grad und 0 Grad von Norden (nach oben) standardmäßig 45 Grad standardmäßig (nach oben) standhalten.
Die Leistung hängt stark von der Detailmenge in der Heightmap ab, aber hier sind einige Zahlen für eine Beispielheighymap eines 40x40 -Kilometer -Bereichs, das auf dem Mount Everest zentriert ist. Verschiedene Höhenmap -Auflösungen und zulässige maximale Fehler werden angezeigt. Times, berechnet auf einem 2018 13 "MacBook Pro (2,7 GHz Intel Core i7).
| Bildgröße / Fehler | 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 |
| Bildgröße / Fehler | 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 |