วิธีการสร้างจักรวาลที่ไม่มีที่สิ้นสุด?


15

ฉันสงสัยว่าอะไรคือวิธีปฏิบัติที่ดีที่สุดในอุตสาหกรรมการพัฒนาเกมเพื่อสร้างจักรวาล 3 มิติ?

จะมีความเฉพาะเจาะจงมากขึ้น:

  • จุดข้อมูลจะได้รับและคงที่ แต่ละจุดมีตำแหน่งสีและขนาด
  • ชุดข้อมูลทั้งหมดมีขนาดใหญ่กว่าหน่วยความจำที่มีอยู่มาก
  • ผู้ใช้ควรสามารถ "ย่อ" เพื่อดูภาพที่ใหญ่ขึ้นในครั้งเดียว

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

ฉันกำลังมองหาวิธีแก้ปัญหาที่ไม่เชื่อเรื่องพระเจ้า


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

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

1
Zoom-out / zoom-in สำหรับinfinite universeอาจคล้ายกับการติดตามความสัมพันธ์ระหว่างจุดสองจุดบนเส้นโค้ง Mandelbrot บางส่วนหลังจากซูมไปยังระดับที่แตกต่างกัน ในบางระดับคุณอาจสูญเสียความแม่นยำและไม่สามารถแยกแยะพวกเขาหรือแม้แต่ค้นหาอีกครั้ง
user2338816

1
@AlanWolfe การประดิษฐ์ที่กำหนดเองยังคงเป็นไปได้ - ตัวอย่างที่เด่นชัดคือเกม Frontier เก่าซึ่งมีตำแหน่งดาวจริงสำหรับดาว 1,000 ดวงหรือใกล้เคียงกับโซลมากที่สุด (รวมถึงโซลและดาวเคราะห์และดวงจันทร์จริง) คุณเพียงแค่ทำให้แน่ใจว่าพวกเขาอยู่ในสถานที่ที่ไม่ได้ถูกสร้างขึ้นตามขั้นตอนและเพิ่มพวกเขาเป็น "เลเยอร์" อื่น
Luaan

@IlmariKaronen ใช่คุณพูดถูก ฉันมีระยะทางในการรับชมสูงสุดและฉันคิดว่าฉันจะรวมคะแนนระยะทางโดยทำตามคำตอบของ Ming-Tang
Anvaka

คำตอบ:


8

สิ่งนี้ขึ้นอยู่กับการเก็งกำไรและการอ่านผ่านซอร์สโค้ดของ Celestia

Celestia ช่วยให้คุณบินไปรอบ ๆ ดาวเคราะห์และซูมออกเพื่อดูกาแลคซีทั้งหมด ฉันเรียกดูซอร์สโค้ดของมันและพบว่ามันใช้ octree ซึ่งเป็นโครงสร้างที่แบ่งพื้นที่แบบเรียกซ้ำออกเป็น 8 octants

ตัวเรนเดอร์จะเรนเดอร์สภาพแวดล้อมโดยการข้ามผ่านแปดและไม่สำรวจวัตถุที่อยู่ลึก

Celestia ยังติดตามขนาดที่แน่นอนของ octant ที่ซึ่งขนาดที่แน่นอนของ octant นั้นขึ้นอยู่กับขนาดที่แน่นอนของดาวภายใน octant หาก octant อยู่ใกล้กัน Celestia จะสร้างดวงดาวเป็นเอกเทศและถ้า octant นั้นอยู่ไกลออกไป Celestia จะให้ค่า octant เป็นดาวดวงหนึ่งของขนาดของ octant

นอกจากนี้ยังสามารถมีลำดับชั้นที่มีความหมายแนบกับวัตถุ ตัวอย่างเช่นถ้าคุณอยู่ใกล้ (รัศมีที่ประกาศในฐานข้อมูล) กับดาวฤกษ์ดาวเคราะห์นั้นจะถูกแสดงผล หากดาวเคราะห์อยู่ใกล้พอ (มีการตัดพิกเซลบนหน้าจอ) โมเดล 3 มิติของมันจะถูกวาด

เกมอวกาศอื่น ๆ ที่ฉันสามารถตั้งชื่อได้คือ Orbiter และ Kerbal Space Program ซึ่งเป็นซอร์ส ฉันดูที่ Frontier Galaxy ซึ่งสร้างแผนที่ดาวแบบเป็นขั้นตอน มีเว็บไซต์ที่วิเคราะห์ว่าเกมทำงานอย่างไรโดยการถอดประกอบ: http://www.jongware.com/galaxy1.html


12

มีจำนวนชิ้นส่วนของปริศนานี้ซึ่งแต่ละชิ้นจะให้หลุมกระต่ายที่ลึกและน่าสนใจในการสำรวจ บางส่วนของพวกเขาคือ:

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

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


2

สิ่งใดก็ตามที่เป็นลำดับชั้นและ / หรือกระจัดกระจายควรช่วยคุณที่นี่

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

octree นั้นค่อนข้างดีสำหรับคุณที่สามารถสืบค้นรายการวัตถุทั้งหมดในมุมมอง frustum ซึ่งจะช่วยให้คุณได้รับรายการของวัตถุที่อยู่ในมุมมองของคุณเท่านั้นและไม่ไกลเกินไป การแก้ปัญหาแบบเบาบางอาจเป็นสิ่งที่คล้ายกับกริดแบบเบาบางซึ่งคุณสามารถขอข้อมูลเกี่ยวกับตำแหน่ง x, y, z ได้ แต่คุณต้องเก็บข้อมูลสำหรับเซลล์ที่ไม่มีพื้นที่ว่างเท่านั้น

วิธีการลำดับชั้นทั่วไปอื่น ๆ ที่ใช้รวมถึงต้นไม้ bsp (พวกเขาแบ่งพื้นที่ออกเป็น 2 ครึ่งช่องว่างแบบเรียกซ้ำ) เช่นเดียวกับต้นไม้ kd ที่ทำคล้ายกัน

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

วิธีแก้ปัญหาบางอย่าง (เช่น bsp) นั้นมีประสิทธิภาพมาก แต่ใช้เวลาในการสร้างนานจึงไม่ใช่ทางเลือกที่ดีสำหรับการเคลื่อนย้าย / เปลี่ยนวัตถุ

หวังว่าจะช่วยได้โปรดแจ้งให้เราทราบหากคุณมีข้อสงสัยเกี่ยวกับรายละเอียด!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.