Jeffrey Cross
Jeffrey Cross

การพิมพ์แผนที่ภูมิประเทศ 3 มิติจากข้อมูลกระสวยอวกาศ

ในเดือนกุมภาพันธ์ปี 2000 กระสวยอวกาศเอนเดเวอร์เริ่มต้นในภารกิจ 11 วันที่รู้จักกันในชื่อภารกิจกระสวยเรดาร์เรดาร์ (SRTM) โดยมีวัตถุประสงค์คือการรวบรวมข้อมูลเรดาร์ interferometric เพื่อสร้างฐานข้อมูลภูมิประเทศแบบดิจิตอลความละเอียดสูงของโลก ข้อมูลที่ได้คือชุดของไฟล์ที่เรียกว่า Digital Elevation Models (DEMs) ไฟล์เหล่านี้มีระดับความสูงเป็นเมตรเหนือระดับน้ำทะเลหมายถึงละติจูดต่ำกว่า 60 องศา ความละเอียดของข้อมูลคือ 1 อาร์คที่สองเหนืออเมริกาเหนือและ 3 อาร์ควินาทีเหนืออเมริกาเหนือและ (ส่วนใหญ่) ส่วนที่เหลือของแผ่นดินโลก

หมายเหตุ: ณ สิ้นปี 2557 หน่วยงานที่รับผิดชอบข้อมูล SRTM เริ่มปล่อยข้อมูล SRTM สำหรับส่วนที่เหลือของโลกด้วยความละเอียด 1 arc second ทวีปแรกที่ปล่อยออกมาคือแอฟริกาพร้อมภูมิภาคอื่น ๆ ของโลกที่ปล่อยออกมาในไม่กี่เดือนถัดไป

เป้าหมายของโครงการนี้คือการแปลงข้อมูล SRTM ระดับความสูง 3 ส่วนโค้งที่สองเป็นพื้นผิว 3 มิติที่สามารถใช้เป็นพื้นฐานในการสร้าง Raised Relief Maps โดยใช้เครื่องพิมพ์ 3 มิติ ซอฟต์แวร์ที่สร้างขึ้นเพื่อจุดประสงค์นี้เรียกว่า SRTM2STL ซอฟต์แวร์อ่านไฟล์ SRTM ไบนารี 3 อาร์ควินาทีที่มีข้อมูลระดับความสูงและแปลงเป็นสามเหลี่ยมและเขียนไฟล์เอาต์พุตใน Standard Tessellation Language (STL) ซึ่งเป็นรูปแบบไฟล์ 3D ทั่วไปในรูปแบบไบนารีหรือข้อความ เมื่อสร้างไฟล์ STL ไฟล์นั้นจะสามารถนำเข้าสู่ซอฟต์แวร์การแบ่งส่วนข้อมูลผู้จำหน่ายเครื่องพิมพ์ 3 มิติได้อย่างง่ายดาย ซอฟต์แวร์การแบ่งส่วนจะแปลงข้อมูลเป็น G-Code ซึ่งเป็นรูปแบบไฟล์ที่เครื่องพิมพ์ 3D ใช้ในการควบคุมการพิมพ์

ข้อมูล SRTM

ข้อมูล SRTM 3 ส่วนโค้งที่สองถูกเข้ารหัสเป็นข้อมูลไบนารีที่ได้รับคำชม 16 บิต 2 ที่ลงนามแล้ว ที่ 3 arc วินาทีหนึ่งองศาต่อหนึ่งตารางสี่เหลี่ยมของโลกถูกแบ่งออกเป็น 1200 โดย 1200 จุดข้อมูล ข้อมูล SRTM ถูกเก็บไว้ที่ 1201 โดย 1201 คะแนน จุดข้อมูลแต่ละจุดจะถูกเก็บเป็นคู่ไบต์ คู่ไบต์เหล่านี้สร้างไฟล์ 2,884,802 ไบต์ (1201 X 1201 * 2 ไบต์ต่อจุด) ขอบด้านบนและด้านขวาของข้อมูลประกอบด้วยข้อมูลเดียวกันกับขอบด้านล่างและด้านซ้ายของสี่เหลี่ยมจัตุรัสที่อยู่ติดกัน (1200 + 1) สามารถใช้เป็นข้อมูลการลงทะเบียนได้เมื่อทำการต่อไฟล์เข้าด้วยกัน

ซอฟต์แวร์

ซอฟต์แวร์ในการสร้างไฟล์ STL คือ SRTM2STL เขียนด้วยวานิลลา C (ธรรมดามาก) C ซอฟต์แวร์นี้สามารถคอมไพล์ลงในโปรแกรมปฏิบัติการบนแพลตฟอร์มใด ๆ เช่นแพลตฟอร์มใด ๆ ที่มีคอมไพเลอร์ C เช่น gcc

ขั้นตอนวิธี

กระบวนการแปลงข้อมูล SRTM เป็นไฟล์ STL เริ่มต้นด้วยการแปลงทุกกลุ่ม 4 คะแนนให้เป็นสองสามเหลี่ยม แต่ละสามเหลี่ยมต้องการ 3 จุดสามจุด x, y และ z เพื่อกำหนดตำแหน่งของสามเหลี่ยมในอวกาศ นอกจากนี้แต่ละสามเหลี่ยมต้องการเวกเตอร์ x, y และ z ปกติเพื่อกำหนดทิศทางของมันในอวกาศ เวกเตอร์ปกติควรชี้ให้เห็นวัตถุที่ถูกกำหนดตามกฎมือขวา (อธิบายในภายหลัง) ข้อมูลที่ได้จะเป็นพื้นผิวของแผนที่โล่งอก

นอกเหนือจากพื้นผิวแผนที่โล่งอกแล้วโปรแกรมยังต้องสร้างทั้งสี่ด้านและด้านล่างทำให้โมเดล 3D ปิดหรือ 'watertight' ทำให้โมเดล 3 มิติสมบูรณ์ซึ่งสามารถนำเข้าสู่โปรแกรมดูไฟล์ STL สำหรับการตรวจสอบหรือเป็นซอฟต์แวร์การแบ่งส่วนเพื่อสร้าง ข้อมูลที่จำเป็นสำหรับการพิมพ์แบบจำลอง 3 มิติ

สำหรับข้อมูล SRTM ที่มีจุดข้อมูล 1201 X 1201 พื้นผิวของพื้นที่ที่ถูกสร้างขึ้น (พร้อมกับด้านข้างและด้านล่าง) จะมีรูปสามเหลี่ยม 5759996 (หรือด้าน / รูปหลายเหลี่ยม)

อุดรู

ด้วยเหตุผลหลายประการข้อมูลบางอย่างในไฟล์ SRTM ดั้งเดิมขาดหายไป จุดที่ขาดหายไปถูกทำเครื่องหมายด้วยการทำให้จุดเท่ากับค่าลบที่ใหญ่ที่สุดที่เป็นไปได้สำหรับ 16 บิตหรือ -32768 จุดข้อมูลที่ทำเครื่องหมายไว้สามารถอยู่ภายในข้อมูลได้อย่างง่ายดายและหากเลือกตัวเลือกซอฟต์แวร์จะสามารถใส่ข้อมูลลงในช่องได้ ซอฟต์แวร์ใช้อัลกอริธึมเชิงเส้นอย่างง่ายสำหรับจุดประสงค์นี้

อัลกอริทึมการเติมเชิงเส้นทำงานโดยการหาหลุมในข้อมูลในแถวในอาร์เรย์ที่มีข้อมูล อัลกอริทึมจะมองหาจุดข้อมูลถัดไปบนแถวที่ไม่ใช่รู จากนั้นคำนวณความชันระหว่างจุดปลายทั้งสอง การคำนวณระดับความสูงสำหรับแต่ละหลุมขึ้นอยู่กับความลาดชันและหลุมจะเต็มไปด้วยค่าที่คำนวณ

อัลกอริทึมการเติมเชิงเส้นมีข้อ จำกัด ตัวอย่างเช่นเมื่อข้อมูลจำนวนมากหายไปโปรแกรมจะสร้างเส้นเติมเชิงเส้นยาว (ซึ่งอาจดูไม่ดี) โดยปกติแล้วข้อมูลจะหายไปเนื่องจากการกระจายของสัญญาณเรดาร์ตามพื้นที่ผิวที่ไม่สม่ำเสมอ เส้นที่มีเส้นตรงยาวไม่ตรงกับพื้นผิวในกรณีเหล่านี้เป็นอย่างดีและมักจะดูไม่ดี อัลกอริทึมที่ดีกว่าในการจัดการกับหลุมเป็นที่เดียวที่สามารถทำการปรับปรุงซอฟต์แวร์นี้ได้

มีปัญหาอื่นที่คุณสามารถพบกับอัลกอริทึมการเติมเชิงเส้น (ตามที่นำมาใช้ในการเปิดตัวครั้งแรกของซอฟต์แวร์) นี่คือเมื่อหลุมเริ่มต้นที่จุดเริ่มต้นหรือจุดสิ้นสุดของแถว (ขอบ) เพื่อแก้ไขปัญหาที่พบในสถานการณ์นี้ผู้ใช้ควรแยกข้อมูลออกจากหลุมที่ปรากฏตามขอบ นี่เป็นอีกสถานที่หนึ่งที่มีพื้นที่สำหรับการปรับปรุงในอัลกอริทึมดั้งเดิม

อีกวิธีหนึ่งในการหลีกเลี่ยงปัญหาหลุมคือการดาวน์โหลดไฟล์ที่ถูกแก้ไข ทีม SRTM ทำงานหลายอย่างเพื่อเติมหลุมโดยใช้เทคนิคที่หลากหลาย ลิงค์ไปยังไฟล์ที่ถูกต้องสามารถพบได้ในการอ้างอิง

ตัวเลือกบรรทัดคำสั่ง

โปรแกรมใช้ตัวเลือกบรรทัดคำสั่งเพื่อควบคุมพฤติกรรมของมัน ไวยากรณ์ของบรรทัดคำสั่งมีดังนี้:

srtm2stl อินพุตเอาต์พุต [ตัวเลือก]

ตัวเลือก / A - การขยายภาพ - ตัวคูณเพื่อเพิ่มความสูงด้วย สิ่งนี้จะถูกนำไปใช้ก่อนที่จะเพิ่ม / ลบอคติ / B - Bias - ต้องเป็นจำนวนเต็ม ลบเพื่อลดแผนที่ (บาง) / C - ชุดย่อยพิกัด - ละติจูด, ลองจิจูด, ละติจูด, ลองจิจูด (นาทีทศนิยม) / F - แก้ไขรู (เติมเชิงเส้น) / N - เปลี่ยนชื่อที่มั่นคงในไฟล์ STL ASCII / H + หมายถึงพิมพ์พิกัดอาร์เรย์ของรู (ข้อมูลที่หายไป) S | s - กลุ่มย่อย - Start_Row, Start_Column, Stop_Row, Stop_Column / T + หมายถึงรูปแบบเอาต์พุต ASCII / T- หมายถึงรูปแบบไบนารีเอาต์พุต V - เปิดเอาต์พุต verbose

การสร้างรูปหลายเหลี่ยม

รูปหลายเหลี่ยมแต่ละอันที่ประกอบเป็นใบหน้าของพื้นผิว 3 มิติที่สร้างขึ้นโดย SRTM2STL ประกอบด้วยพิกัดสามมิติ 3 มิติคือ X, Y และ Z พิกัด X และ Y เป็นตัวแทนของลองจิจูดและละติจูดในขณะที่พิกัด Z แทนความสูงของจุดเหนือ geoid หรือประมาณระดับน้ำทะเลปานกลาง ในการสร้างพื้นผิวด้านบนของแผนที่เราใช้จุดที่อยู่ติดกัน 4 จุด ตัวอย่างเช่นหากเราเริ่มต้นในพิกัดมือซ้ายของแผนที่เราจะใช้สองจุดแรกในแถวแรกและสองจุดแรกในแถวที่สอง รูปหลายเหลี่ยมแรกถูกสร้างขึ้นจากจุดแรกในแถวที่ 1 และสองจุดในแถวที่สอง รูปหลายเหลี่ยมที่สองถูกสร้างขึ้นจากจุดที่สองในแถวแรกและจุดสองจุดบนแถวที่สอง นี่หมายความว่ารูปหลายเหลี่ยมสองรูปนี้ใช้ขอบร่วมกันและพวกมันทำ

นี่คือข้อมูลตัวอย่างบางส่วนที่ผลิตโดยโปรแกรมซึ่งประกอบไปด้วยรูปหลายเหลี่ยมสองรูป ข้อมูลที่แสดงถึงรูปหลายเหลี่ยมเดียวประกอบด้วยจุดสามชุด แต่ละจุดประกอบด้วยสามพิกัด X, Y และ Z รูปหลายเหลี่ยมแรกในตัวอย่างนี้ประกอบด้วยสามจุดเหล่านี้:

จุดที่ 1: 0.000000, 0.000000, 223.000000 จุดที่ 2: 0.000000, 92.408531, 219.000000 จุดที่ 3: 68.984360, 0.000000, 182.000000

รูปหลายเหลี่ยมที่สองประกอบด้วยสามจุดต่อไปนี้ (X, Y และ Z):

จุดที่ 1: 68.984360, 92.408531, 180.000000 จุดที่ 2: 0.000000, 92.408531, 219.000000 จุดที่ 3: 68.984360, 0.000000, 182.000000

ดังนั้นพื้นผิวด้านบนจะถูกสร้างขึ้นจากรูปหลายเหลี่ยมทั้งหมดที่สร้างโดยโปรแกรมตามตัวเลือกที่เลือก ข้อมูลความสูงถูกดึงมาจากข้อมูล SRTM และเก็บไว้ในอาร์เรย์ 2 มิติในหน่วยความจำของโปรแกรม ระยะทางและพิกัดของข้อมูลละติจูดและลองจิจูดจะถูกสร้างขึ้นโดยการคูณดัชนีจำนวนเต็มของแถวและคอลัมน์อาร์เรย์ด้วยระยะทางต่อจุดในแต่ละทิศทางระยะทางสำหรับลองจิจูด (เหนือและใต้) จะแตกต่างจากละติจูด (ตะวันออกและตะวันตก) เพราะระยะทางละติจูดนั้นเล็กลงเมื่อคุณไปจากเส้นศูนย์สูตรถึงขั้ว ระยะทางสำหรับละติจูด (ตะวันออกและตะวันตก) คำนวณจากด้านล่างของ 1 องศาคูณ 1 องศาสแควร์ จะมีความแม่นยำมากขึ้นในการคำนวณค่านี้อีกครั้งในขณะที่คุณสำรวจอาร์เรย์เพื่อให้ "เรียว" ที่มีอยู่ตามธรรมชาติแสดงอย่างถูกต้อง ในทางปฏิบัติแล้วความแตกต่างของระยะทางนี้เป็นสิ่งที่สังเกตไม่ได้ มันสามารถเพิ่มในอนาคตเป็นตัวเลือกโปรแกรม

หลังจากสร้างพื้นผิวด้านบนโปรแกรมจะปิดด้านข้างและด้านล่างโดยสร้างคู่รูปหลายเหลี่ยมสามจุดดังที่เห็นในภาพด้านล่าง

การคำนวณ

หนึ่งในสิ่งที่จำเป็นในไฟล์ STL เอาต์พุตเป็นเรื่องปกติที่พื้นผิวของรูปหลายเหลี่ยมแต่ละรูป เวกเตอร์นี้ชี้ให้เห็นจากวัตถุที่กำลังสร้างเช่นเวกเตอร์ระบุทิศทางของวัตถุภายนอก

ปกติคำนวณโดยใช้กฎมือขวา ภาพกราฟิกมีลักษณะดังนี้:

ดังนั้นเมื่อคุณสร้างรูปหลายเหลี่ยมที่คุณรู้ว่าข้างนอกและข้างในคือเลือกจุดสุดยอดของรูปหลายเหลี่ยม จากภาพด้านบนเวกเตอร์ a และ b จะสอดคล้องกับดัชนีและนิ้วกลางตามลำดับและจุดยอดเป็นจุดที่เริ่มต้น ดังนั้นผลิตภัณฑ์ข้ามจะคำนวณเวกเตอร์ปกติซึ่งแสดงด้วยนิ้วหัวแม่มือในภาพด้านบน นิ้วหัวแม่มือหลังจากการคำนวณนี้จะชี้ 'ออก' ของวัตถุ

การคำนวณผลิตภัณฑ์ Cross ถือว่าเป็นพิกัดจุดสุดยอด (0,0,0) เพื่อให้การคำนวณจากพิกัดสามชุดเวกเตอร์ a และ b คำนวณโดยการลบพิกัดองค์ประกอบของจุดยอดออกจากพิกัดองค์ประกอบของจุดสิ้นสุดเช่นพิกัดของปลายนิ้วในรูปภาพด้านบน เราจะใช้พิกัดปกติเหล่านี้สำหรับการคำนวณผลิตภัณฑ์ข้าม

กำหนดพิกัดสามชุดที่กำหนดรูปหลายเหลี่ยมเป็น r, s และ t โดยที่ r คือจุดยอดและเนื่องจากกฎมือขวามีการติดตามใน r-> s แทนเวกเตอร์ a และ r-> t แทนเวกเตอร์ b ดังนั้นการคำนวณเวกเตอร์ a และ b มีดังนี้:

ax = sx - rx ay = sy - ry az = sz - rz

bx = tx - rx โดย = ty - ry bz = tz - rz

ผลิตภัณฑ์ Cross, c คำนวณจาก a และ b เป็น:

cx = (ay * bz) - (az * by) cy = (ax * bz) - (az * bx) cz = (ax * by) - (ay * bx)

ผลิตภัณฑ์ Cross ถูกเขียนไปยังไฟล์ STL เอาต์พุตพร้อมกับพิกัดของจุดสิ้นสุดของรูปหลายเหลี่ยม

รูปแบบไฟล์

มีสองรูปแบบไฟล์เอาต์พุตสำหรับไฟล์ STL: text และ binary รูปแบบไฟล์ข้อความแสดงข้อมูลเป็นไฟล์ ASCII ของข้อความ นี่คือตัวอย่างของจุดข้อมูล STL ที่ดูเหมือนเป็นข้อความ:

ทึบ some_name

ด้านปกติ 61.678 -65.695 -675.324

วงนอก

จุดสุดยอด 65708.836 30.839 999.000 จุดสุดยอด 65708.836 61.678 1002.000 จุดสุดยอด 65730.734 30.839 1001.000

endloop

endfacet

endsolid

ในตัวอย่างข้างต้นแน่นอนว่ามีมากกว่าหนึ่งด้าน (รูปหลายเหลี่ยม) ตัวเลขสามตัวที่ตามหลัง facet normal คือพิกัดของค่าปกติถึง facet x, y และ z จุดสุดยอดแต่ละจุดเป็นพิกัดหนึ่งในสามจุดที่แทนมุมของด้านดังนั้นแต่ละจุดจึงมี x, y และองค์ประกอบ z

รูปแบบไฟล์ไบนารี STL มีขนาดเล็กกว่ารูปแบบข้อความมาก นอกจากนี้ยังเป็นการยากที่จะเข้าใจว่าคุณไม่ได้ทำเลขฐานสอง ในรูปแบบไบนารีตัวเลขแต่ละตัวจะถูกจัดเก็บเป็นตัวเลขทศนิยม 32 บิตที่มีความแม่นยำเดียว ไฟล์เริ่มต้นด้วยส่วนหัว 80 ไบต์คงที่ซึ่งสามารถมีอะไรก็ได้ แต่มักจะมีคำอธิบายสั้น ๆ ของไฟล์ ถัดไปเป็นจำนวนเต็ม 32 บิตเดียวที่เก็บค่าของจำนวนสามเหลี่ยมที่มีอยู่ในไฟล์ ต่อไปนี้เป็นตัวเลขสี่จุดสามชุด ชุดแรกของการลอยตัวเป็นเรื่องปกติของพื้นผิว x, y และ z หลังจากนั้นจุดสามจุดที่อธิบายมุมของสามเหลี่ยมและแต่ละจุดมีจุดลอยตัว 32 บิตสามตัวคือ x, y และ z

ข้อสรุป

ซอร์สโค้ดสำหรับ SRTM2STL นั้นมีอยู่ใน GitHub มันได้รับการเผยแพร่ภายใต้ใบอนุญาต GNU ฉันหวังว่าคนอื่นจะแก้ไขและขยายซอฟต์แวร์ ฉันยังหวังว่าแผนที่บรรเทาทุกข์ที่สร้างด้วยแผนที่นี้จะถูกใช้เพื่อให้ความรู้และมีเสน่ห์

ด้านล่างนี้เป็นภาพหน้าจอจากซอฟต์แวร์การรับชม 3D พร้อมกับชิ้นส่วนที่พิมพ์ 3 มิติ ยิ่งความละเอียดของเครื่องพิมพ์ดีขึ้นเท่าใด

ธารน้ำแข็ง Perito Moreno - อาร์เจนตินา

Mount Saint Helens - ออริกอน

ปล่องภูเขาไฟโอเรกอน

หุ้น

แสดงความคิดเห็น