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 |