hmm adalah utilitas H delapan M AP M Eshing.
Jika Anda telah melakukan pengembangan game 3D, pencetakan 3D, atau hal -hal seperti itu, Anda mungkin ingin mengubah gambar heightmap skala abu -abu menjadi mesh 3D. Cara naif cukup sederhana tetapi menghasilkan jerat besar dengan jutaan segitiga. Setelah meretas jalan melalui berbagai solusi selama bertahun -tahun, saya akhirnya memutuskan untuk menulis alat yang baik untuk tujuan ini.
hmm adalah implementasi modern dari algoritma yang bagus dari perkiraan poligonal cepat tahun 1995 dari medan dan ladang tinggi oleh Garland dan Heckbert. Meshes yang diproduksi oleh hmm memenuhi kondisi Delaunay dan dapat memenuhi kesalahan maksimal yang ditentukan atau jumlah maksimal segitiga atau simpul. Ini juga sangat cepat.
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 mendukung berbagai format file seperti PNG, JPG, dll. Untuk input tinggi input. Output selalu merupakan file STL biner. Satu -satunya parameter yang diperlukan lainnya adalah -z , yang menentukan berapa banyak untuk skala sumbu z dalam mesh output.
$ hmm input.png output.stl -z ZSCALEAnda juga dapat memberikan kesalahan yang diizinkan maksimal, jumlah segitiga, atau jumlah simpul. (Jika beberapa ditentukan, yang pertama dicapai digunakan.)
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000Klik gambar di bawah ini untuk melihat contoh berbagai argumen baris perintah. Anda dapat mencoba contoh -contoh ini sendiri dengan peta tinggi ini: Gale.png.
Parameter -z yang diperlukan mendefinisikan jarak antara piksel hitam sepenuhnya dan piksel putih sepenuhnya pada sumbu z vertikal, dengan unit sama dengan satu lebar atau tinggi piksel. Misalnya, jika setiap piksel di heightmap mewakili area persegi 1x1 meter, dan kisaran vertikal dari heightmap adalah 100 meter, maka -z 100 harus digunakan.
Parameter -x hanyalah pengganda tambahan di atas skala Z yang disediakan. Ini disediakan sebagai kenyamanan sehingga Anda tidak perlu melakukan multiplikasi di kepala Anda hanya untuk membesar -besarkan, misalnya 2x, karena skala z sering berasal dari data dunia nyata dan dapat memiliki nilai -nilai aneh seperti 142.2378.
Parameter -e mendefinisikan kesalahan maksimum yang diizinkan di output mesh, sebagai persentase dari total tinggi mesh. Misalnya, jika -e 0.01 digunakan, maka tidak ada piksel yang akan memiliki kesalahan lebih dari 1% dari jarak antara piksel hitam sepenuhnya dan piksel putih sepenuhnya. Ini berarti bahwa untuk gambar input 8-bit, kesalahan e = 1 / 256 ~= 0.0039 akan memastikan bahwa tidak ada piksel yang memiliki kesalahan lebih besar dari satu unit grayscale penuh. (Mungkin masih diinginkan untuk menggunakan nilai yang lebih rendah seperti 0.5 / 256 )
Ketika opsi -b digunakan untuk membuat mesh padat, itu menentukan ketinggian pangkalan sebelum bagian terendah dari heightmesh muncul, sebagai persentase tinggi tinggi. Misalnya, jika -z 100 -b 0.5 digunakan, maka jala akhir akan sekitar 150 unit tinggi (jika ada piksel putih yang sepenuhnya ada dalam input).
Perbatasan dapat ditambahkan ke jala dengan bendera --border-size dan --border-height . Ketinggian akan empuk dengan piksel border-size sebelum triangulasi. Nilai Z (pra-skala) dari perbatasan dapat diatur dengan border-height yang default menjadi 1.
Kabur Gaussian dapat diterapkan dengan bendera --blur . Ini sangat berguna untuk gambar bising.
Heightmap dapat dibalik dengan bendera --invert . Ini berguna untuk lithophanes.
Heightmap dapat diisi secara otomatis dengan bendera --level . Ini akan meregangkan nilai skala abu -abu untuk menggunakan seluruh rentang hitam => putih.
Kurva gamma dapat diterapkan pada heightmap dengan bendera --gamma . Ini berlaku x = x ^ gamma untuk setiap piksel, di mana x berada di [0, 1].
Peta normal resolusi penuh dapat dihasilkan dengan argumen --normal-map . Ini akan menyimpan peta normal sebagai RGB PNG ke jalur yang ditentukan. Ini berguna untuk membuat benjolan dan detail resolusi yang lebih tinggi saat menggunakan mesh segitiga resolusi yang lebih rendah.
Gambar hillshade berskala abu-abu dapat dihasilkan dengan argumen --shade-path . Ketinggian dan azimuth dari sumber cahaya dapat diubah dengan argumen --shade-alt dan --shade-az , yang default menjadi 45 derajat di ketinggian dan 0 derajat dari utara (atas).
Kinerja sangat tergantung pada jumlah detail di heightmap, tetapi berikut adalah beberapa angka untuk contoh tinggi dari area 40x40 kilometer yang berpusat di Gunung Everest. Berbagai resolusi tinggi dan kesalahan maks yang diizinkan ditampilkan. Times dihitung pada MacBook Pro 2018 (2,7 GHz Intel Core i7).
| Ukuran / kesalahan gambar | 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 |
| Ukuran / kesalahan gambar | 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 |