ขั้นตอนการสร้างแม่น้ำหรือถนนเพื่อภูมิประเทศที่ไม่มีที่สิ้นสุด


28

ฉันควรจะบอกว่าเส้นทางไม่ใช่ถนนอย่างที่ฉันคิดในยุคกลาง ยังไม่ได้มองหาสัจนิยม คำตอบที่ฉันกำลังมองหาจะเหมาะกับแม่พิมพ์ที่ฉันอธิบายมากกว่าความสมจริง

ฉันกำลังมองหาวิธีในการสร้างถนน / แม่น้ำตามขั้นตอนในแบบโค้ง แต่ฉันต้องการทำเช่นนั้นสำหรับระบบภูมิประเทศแบบไม่ จำกัด เช่นเดียวกับที่เสียงเพอร์ลินสร้าง blobs ฉันต้องการสร้างเซ็กเมนต์ความยาวแบบสุ่ม (อาจเป็นความยาวไม่ จำกัด )

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

ฉันไม่ต้องการที่จะต้องสร้างภูมิประเทศล่วงหน้า ที่มีความสูง (เช่นใช้สำหรับการจำลองปริมาณน้ำฝนหรือคล้ายกัน) ฉันไม่ต้องการจุดเริ่มต้น / สิ้นสุด

มีอัลกอริธึมดังกล่าวหรือปรับแต่งอัลกอริธึมเสียงรบกวนที่บางคนอาจรู้เพื่อบรรลุสิ่งที่ฉันพยายามอธิบายหรือไม่

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

นี่คือภาพสิ่งที่ฉันมีในแบบ 2D แต่มีความถี่สูงมากเพื่อแสดงรายละเอียดเพิ่มเติม:

ป้อนคำอธิบายรูปภาพที่นี่


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

ถนนอาจมีความท้าทายมากกว่านี้เล็กน้อยฉันคิดว่าการสร้างถนนตามการใช้งานหากผู้เล่น / ผู้เล่นทุกคนเดินข้ามภูมิประเทศเป็นประจำมันจะกลายเป็นเส้นทาง
สงคราม

1
@ user19142 ตกลงไม่ใช่รายการที่ซ้ำกัน คุณอาจพบการใช้งานจากคำถาม / คำตอบนี้เช่นกัน: gamedev.stackexchange.com/questions/53400/และฉันจะรวมลิงก์ก่อนหน้านี้อีกครั้งเป็น "ที่เกี่ยวข้อง" gamedev.stackexchange.com/questions/45403/… gamedev stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
Michaelhouse

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

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

คำตอบ:


11

แค่ความคิดของฉันที่จะเก็บสิ่งนี้ไว้ในสิ่งที่คุณต้องการโดยไม่ต้องมี precomputation (มาก) และความเป็นไปได้สำหรับโลกที่ไม่มีที่สิ้นสุด

pice แรกของขั้นตอนวิธีการใช้งานของVoronoi-Diagramms คุณแบ่งโลกของคุณออกเป็นกริดแต่ละตารางจะมีที่อยู่ในรูปแบบ (xgrid, ygrid) สำหรับมือถือในที่ที่คุณจำเป็นต้องสร้างถนนที่คุณใส่ Xgrid และ ygrid ตัวแปรเป็นฟังก์ชันแฮชซึ่งจะส่งกลับจำนวนแต่ละCellSeed คุณใช้CellSeedเป็นเมล็ดสำหรับตัวสร้างตัวเลขสุ่มซึ่งสร้างพิกัดของจุดสำหรับ Voronoi Diagramm

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

หลังจากขั้นตอนนี้คุณสามารถค้นหาเส้นทางผ่านเครือข่ายที่ถูกต้อง

สำหรับเส้นทางที่ถูกต้องตอนนี้คุณสามารถสร้างถนนได้ (พวกมันมีขอบที่คมชัด)

หมายเหตุ : คุณต้องสร้างพิกัดของไดอะแกรม Voronio สำหรับเซลล์ neightbor ทั้งหมดดังนั้นคุณจึงไม่มีขอบที่ขอบของเซลล์

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

เกี่ยวกับการใช้ Voronoi-Diagramms

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

สำหรับเขตเพิ่มเติมเช่นถนนคะแนนจะต้องไม่มีการเรียงลำดับมากขึ้น

แผนภาพจากวิกิพีเดีย

เกี่ยวกับฟังก์ชัน Pseudo Random เพื่อสร้างตำแหน่งของคะแนนสำหรับ Voronoi-Diagramms

มันอาจเป็นฟังก์ชั่นสุ่มปกติหรือแฮมเมอร์สลีย์ที่ตั้งค่าไว้เพื่อการกระจายจุดที่ไม่สม่ำเสมอกันมากขึ้น


คุณมีตัวอย่างของฟังก์ชันแฮชหรือไม่? ฉันมีเป้าหมายเดียวกัน (โลกที่ไม่มีที่สิ้นสุดซึ่งใช้ voronoi สำหรับถนน) แต่ฉันไม่สามารถจัดการกับสิ่งที่ควรทำ ทุก voronoi lib ที่ฉันสามารถหาพิกัดที่คาดหวังของกล่องขอบเขตที่เอาชนะวัตถุประสงค์ได้ทันที
BotskoNet

ไม่ฟังก์ชันแฮชใช้สำหรับกำหนด starteed ให้กับเซลล์เท่านั้น สามารถเป็นเรื่องเล็กน้อยได้เช่น x * prime1 + y * prime2 + z * prime3 ในกรณีที่จำนวนเฉพาะไม่เท่ากันและมีขนาดใหญ่คุณควรคำนวณที่นี่ด้วยจำนวนเต็ม 64 บิต / ไม่ได้ลงนาม มันไม่ใช่ปัญหาถ้า lib ใช้กล่อง bounding เพราะสำหรับแต่ละเซลล์คุณต้องรวบรวมทุกจุดในเซลล์และจุดทั้งหมดของเซลล์ที่อยู่ใกล้เคียง (ซึ่งคือ 8 เซลล์ที่อยู่ใกล้เคียง)
Quonux

คุณจะพบปัญหาที่มีความแม่นยำด้วยความแม่นยำเดียวหาก lib ใช้ความแม่นยำเดียวหรือถ้าคุณใช้ precsion เดียว หากต้องการข้ามปัญหาหาก lib เพิ่งใช้ความแม่นยำเดียวและคุณไม่ได้ทำดังนี้: ก่อนที่จะแปลงตำแหน่งเป็นความแม่นยำเดียวลบตำแหน่งส่วนกลางของเซลล์กลางจากพวกเขาแล้วใส่สิ่งนี้เป็นลอยใน lib จากนั้นเปลี่ยน ผลลัพธ์กลับมา
Quonux

จริงๆแล้วฉันไม่เคยใช้อัลกอริทึมนี้ แต่ฟังก์ชั่นแฮชอาจเป็นเรื่องเล็กน้อย
Quonux

8

สำหรับการสร้างถนน (และเมือง) กระดาษที่ดีที่สุดที่ฉันพบคืออันนี้:

แบบจำลองขั้นตอนของเมืองโดย Y Parish และ P Müller

สิ่งนี้ใช้ L-System และสามารถสร้างรูปแบบถนนของสหรัฐอเมริกาและสหภาพยุโรปได้ หากคุณไม่ต้องการสร้างถนนทั้งเมืองคุณสามารถสร้างถนนสายหลักได้ สามารถใช้แผนที่ความสูงแผนที่น้ำและแผนที่ความหนาแน่นของประชากรในอินพุต


+1 เพียงเพราะฉันชอบกระดาษ ไม่สอดคล้องกับวิธีที่ฉันต้องการพยายามสร้างถนน / เส้นทาง / แม่น้ำในขณะที่สร้างภูมิประเทศแบบไดนามิก
Mythics

6

http://vterrain.org/Culture/Roads/ส่วน "การสร้างถนน 3 มิติ" มีบางส่วนข้อมูลเกี่ยวกับการสร้างถนน

ปัญหาเกี่ยวกับถนนคือพวกเขาเชื่อมต่อจุดสังเกต (แม้ว่าพวกเขามักจะตามภูมิประเทศแทนที่จะไปตรงจาก A ถึง B)

โดยส่วนตัวแล้วฉันสร้างภูมิประเทศแล้ววางแม่น้ำ (อาจใช้การกัดเซาะดูhttp://vterrain.org/Water/ส่วน "อุทกธรณีวิทยา") จากนั้นวางเมืองในสถานที่ที่เหมาะสม (เช่นใกล้แม่น้ำหรืออื่น ๆ แหล่งที่มาของน้ำหรือในสถานที่ที่น้ำสามารถส่งไปใช้ท่อระบายน้ำหรือหอคอยและท่อน้ำ) และในที่สุดก็สร้างถนนระหว่างเมือง

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


4

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

อาจดูชัดเจน แต่ดูที่ Google maps ในภูมิประเทศและถนนหลายประเภท คุณจะได้รับความรู้สึกที่ดีขึ้นว่าพวกเขาควรมีลักษณะอย่างไร


1
ฉันแก้ไขคำถามอีกครั้งเพื่อให้เข้าใจมากขึ้นว่าฉันไม่สนใจสัจนิยมใด ๆ ใกล้เท่าที่ฉันเป็นในวิธีที่อัลกอริทึมจะต้องทำงาน ฉันรู้สึกซาบซึ้งกับคำตอบอย่างไรก็ตามส่วนใหญ่สำหรับคำศัพท์ที่ใช้ พยายามนึกถึงความปรารถนาของฉันมากขึ้นเช่น squiggles ความยาวสุ่มที่ไม่ จำกัด ที่สามารถสร้างขึ้นด้วยข้อมูลที่น้อยที่สุด (เช่นแผนที่ความสูง)
Mythics
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.