hmmは、ユーティリティを8 M AP Mエッシングしています。
3Dゲーム開発、3D印刷、またはその他のことを行った場合、グレースケールの高さの画像を3Dメッシュに変換したいと考えています。素朴な方法は非常にシンプルですが、何百万もの三角形の巨大なメッシュを生成します。長年にわたってさまざまなソリューションを通り抜けた後、私はついにこの目的のために良いツールを書く必要があると決めました。
hmm 、ガーランドとヘッキバートによる地形と高さのフィールドの1995年の紙の高速ポリゴン近似からの素敵なアルゴリズムの最新の実装です。 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以下の画像をクリックして、さまざまなコマンドライン引数の例をご覧ください。このheightmap:gale.pngでこれらの例を自分で試すことができます。
必要な-zパラメーターは、完全に黒いピクセルと垂直Z軸の完全に白いピクセルの間の距離を定義し、単位は1ピクセルの幅または高さに等しくなります。たとえば、高さの各ピクセルが1x1メートルの正方形の領域を表し、高さの垂直範囲が100メートルである場合、 -z 100使用する必要があります。
-xパラメーターは、提供されたZスケールの上にある追加の乗数です。 Zスケールは実際のデータから派生し、142.2378のような奇妙な値を持つ可能性があるため、たとえば2xで誇張するためだけに頭を乗算する必要はありません。
-eパラメーターは、合計メッシュの高さの割合として、出力メッシュの最大許容エラーを定義します。たとえば、 -e 0.01を使用する場合、完全に黒いピクセルと完全に白いピクセルの間の距離の1%以上の誤差がある場合はありません。これは、8ビットの入力画像の場合、 e = 1 / 256 ~= 0.0039のエラーにより、ピクセルに1つのフルグレースケールユニットが大きいエラーがないことを意味します。 ( 0.5 / 256のような低い値を使用することがまだ望ましい場合があります。)
-bオプションを使用してソリッドメッシュを作成すると、高さの高さの割合として、高さの最低部分が表示される前にベースの高さを定義します。たとえば、 -z 100 -b 0.5を使用した場合、最終メッシュは高さ約150単位になります(入力に完全に白いピクセルが存在する場合)。
--border-sizeと--border-heightフラグを使用して、境界線をメッシュに追加できます。高さのマップは、三角測量の前にborder-sizeピクセルでパディングされます。ボーダーの(事前にスケールされた)Z値は、デフォルトで1にデフォルトでborder-heightで設定できます。
ガウスのぼかしは、 --blurフラグに適用できます。これは、騒々しい画像に特に役立ちます。
高さのマップは、 --invertフラグで反転できます。これはリトファンに役立ちます。
heightmapは、 --levelフラグで自動レベルにすることができます。これにより、グレースケール値が伸びて、ブラック=>白の範囲全体を使用します。
ガンマ曲線は、 --gammaフラグを使用して高さに適用できます。これにより、各ピクセルにx = x ^ gammaが適用されます。ここで、 xは[0、1]です。
--normal-map引数では、完全な解像度の通常のマップを生成できます。これにより、指定されたパスにRGB PNGとして通常のマップが保存されます。これは、低解像度の三角形メッシュを使用しながら、より高い解像度のバンプと詳細をレンダリングするのに役立ちます。
グレースケールのヒルシェード画像は--shade-path引数で生成できます。光源の高度と方位角は、 --shade-altおよび--shade-az引数で変更できます。
パフォーマンスは高さの詳細に大きく依存していますが、エベレスト山を中心とした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 |