hmm是A 8 m ap M eShing實用程序。
如果您完成了任何3D遊戲開發,3D打印或其他此類操作,則可能希望將灰度高度圖映像轉換為3D網格。天真的方式非常簡單,但與數百萬個三角形產生了巨大的網格。多年來,我涉足各種解決方案後,我終於決定為此目的編寫一個好的工具。
hmm是1995年紙的快速多邊形近似地形和高度田地的現代實現,Garland和Heckbert。 hmm產生的網格滿足Delaunay條件,並且可以滿足指定的最大誤差或最大數量的三角形或頂點。也很快。
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標誌應用高斯模糊。這對於嘈雜的圖像特別有用。
高度圖可以用--invert標誌倒置。這對岩石植物很有用。
高度圖可以使用--level標誌自動級別。這將擴展灰度值以使用整個黑色=>白色範圍。
伽馬曲線可以用--gamma標誌應用於高度圖。這將x = x ^ gamma應用於每個像素,其中x在[0,1]中。
完整的分辨率正常地圖可以使用--normal-map參數生成。這將把普通的地圖作為RGB PNG保存到指定的路徑。這對於在使用較低分辨率三角網格時呈現較高的分辨率凸起和細節很有用。
可以通過--shade-path論點來產生灰度山坡圖像。光源的高度和方位角可以通過--shade-alt和--shade-az的參數更改,該論點默認為45度,距離North(向上)為0度。
性能在很大程度上取決於高度圖中的細節數量,但這裡有一些數字,用於以珠穆朗瑪峰為中心的40x40公里區域的高度圖。顯示了各種高度圖分辨率和允許的最大錯誤。在2018年13英寸MacBook Pro(2.7 GHz Intel Core i7)上計算的時間。
| 圖像大小 /錯誤 | 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 |
| 圖像大小 /錯誤 | 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 |