hmm เป็น ยู ทิลิตี้ E Exp ap m eshing
หากคุณได้ทำการพัฒนาเกม 3 มิติการพิมพ์ 3 มิติหรือสิ่งอื่น ๆ คุณอาจต้องการแปลงภาพความสูงสีเทาเป็นตาข่าย 3 มิติ วิธีที่ไร้เดียงสานั้นค่อนข้างง่าย แต่สร้างตาข่ายขนาดใหญ่ที่มีสามเหลี่ยมหลายล้าน หลังจากแฮ็ควิธีการแก้ปัญหาต่าง ๆ ในช่วงหลายปีที่ผ่านมาในที่สุดฉันก็ตัดสินใจว่าฉันต้องเขียนเครื่องมือที่ดีสำหรับจุดประสงค์นี้
hmm เป็นการดำเนินการที่ทันสมัยของอัลกอริทึมที่ดีจากการประมาณรูปหลายเหลี่ยมที่รวดเร็วของกระดาษและทุ่งนาโดย 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 ได้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับภาพที่มีเสียงดัง
HEIGHTMAP สามารถกลับด้านด้วยธง --invert สิ่งนี้มีประโยชน์สำหรับ lithophanes
HEIGHTMAP สามารถปรับระดับอัตโนมัติด้วยธง --level สิ่งนี้จะยืดค่าสีเทาเพื่อใช้ช่วงสีดำ => สีขาวทั้งหมด
เส้นโค้งแกมมาสามารถนำไปใช้กับความสูงด้วยธง --gamma แกมม่า สิ่งนี้ใช้ x = x ^ gamma กับแต่ละพิกเซลโดยที่ x อยู่ใน [0, 1]
แผนที่ปกติความละเอียดเต็มสามารถสร้างได้ด้วยอาร์กิวเมนต์ --normal-map สิ่งนี้จะบันทึกแผนที่ปกติเป็น RGB PNG ไปยังเส้นทางที่ระบุ สิ่งนี้มีประโยชน์สำหรับการแสดงความละเอียดที่สูงขึ้นและรายละเอียดในขณะที่ใช้ตาข่ายสามเหลี่ยมความละเอียดต่ำกว่า
สามารถสร้างภาพ Hillshade สีเทาได้ด้วยการโต้เถียง --shade-path ระดับความสูงและ azimuth ของแหล่งกำเนิดแสงสามารถเปลี่ยนแปลงได้ด้วยอาร์กิวเมนต์ --shade-alt และ --shade-az ซึ่งเริ่มต้นเป็น 45 องศาในระดับความสูงและ 0 องศาจากทิศเหนือ (ขึ้น)
ประสิทธิภาพขึ้นอยู่กับปริมาณของรายละเอียดมากมายในความสูง แต่นี่คือตัวเลขบางส่วนสำหรับตัวอย่างความสูงของพื้นที่ 40x40 กิโลเมตรที่มีศูนย์กลางอยู่ที่ Mount Everest ความต้องการความสูงที่หลากหลายและข้อผิดพลาดสูงสุดที่อนุญาตจะแสดงขึ้น เวลาคำนวณในปี 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 |