การใช้แผนที่ / ภูมิประเทศแบบเรียงต่อกันที่มีความสูงแตกต่างกันของแผ่นกระเบื้องข้างเคียง


10

Ahoy!

ฉันกำลังมองหาข้อมูลบางอย่างเกี่ยวกับแผนที่ย่อยหรือค่อนข้างที่เรียกว่าแผนที่ประเภทเฉพาะ

ฉันสนใจชนิดของการใช้งานที่ใช้ในเกม tycoon หรือเกมการขนส่งที่มีผู้ประกอบการและได้รับการดูลงในภูมิประเทศเวกเตอร์ฟิลด์และภูมิประเทศแผนที่ความสูง แต่ฉันไม่แน่ใจว่าพวกเขาเหมาะสมกับสิ่งที่ฉันต้องการ พัฒนา.

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

ฉันแค่พยายามค้นหาคำศัพท์ที่เหมาะสมเพื่อค้นหา google และ stackoverflow เพื่อหาแหล่งข้อมูลเพื่อช่วยฉันตัดสินใจเลือกเส้นทางที่จะดำเนินการต่อไป

จนถึงตอนนี้ฉันได้จัดการแผนที่แบบพื้นฐานโดยไม่ใช้ส่วนประกอบความสูง / y ที่เก็บไว้ใน VBO และแสดงผลเป็นแบบโครงลวด สิ่งนี้ดูดีมาก แต่ฉันคิดว่าฉันจะพบปัญหาเมื่อพยายามใช้จุดสุดยอดเดียวเพื่อสร้างหน้าผาและเนินเขาโดยไม่กระทบกับกระเบื้องข้างเคียง

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

หากใครก็ตามที่สามารถปลดปล่อยแสงนี้ให้ฉันได้โปรดความช่วยเหลือจะได้รับการชื่นชมอย่างมาก :)

ปรับปรุง

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

แผนที่ย่อย 2.5D

ภาพที่ยืมมาจากวิธีสร้างภาพวาดสามมิติแบบเอียง (สูง)

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

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

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

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

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

อีกครั้งฉันแค่มองหาการผลักไปในทิศทางที่ถูกต้องกับสิ่งนี้ มีการใช้งาน tilemap / ภูมิประเทศเฉพาะประเภทใดบ้างที่จะรองรับแผนที่ 3 มิติที่จะถูกทำให้เสียรูปโดยทั้งตัวแก้ไขแผนที่และระหว่างการเล่นเกมหรือฉันต้องม้วนตัวเองเพื่อพูด? ฉันไม่ได้พยายามคิดค้นล้อใหม่ที่นี่ แต่ฉันพยายามหาแหล่งข้อมูลเนื่องจากฉันไม่แน่ใจว่าจะค้นหาอะไร

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

ขอบคุณที่อ่าน!

คำตอบ:


2

ถ้าฉันเป็นคุณฉันจะดู voxels โดยเฉพาะอย่างยิ่งการแสดงผลคิวบ์Minecraft -type ต่างจากความสูงของแผนที่พวกเขาสามารถจัดการสิ่งที่แขวนอยู่ถ้ำอาคารที่มีหลายชั้น ฯลฯ

คุณจะเก็บภูมิประเทศของคุณเป็นจำนวนเต็มแบบสามมิติโดยที่ตัวเลขจะถูกแมปกับภูมิประเทศบางประเภท: 0 = อากาศ, 1 = ดิน, 2 = น้ำ ฯลฯ จากนั้นเพื่อสร้างตาข่ายเพื่อแสดงผลคุณจะต้อง สร้างใบหน้าของคิวบ์สำหรับแต่ละ voxel ที่ไม่ว่างเปล่า

บทช่วยสอนนี้เป็นคำอธิบายที่ดีเกี่ยวกับวิธีการทำเช่นนี้ใน C ++ โดยใช้ Ogre3D ฉันคิดว่าคุณจะต้องใช้เลเวลต่ำ ๆ ใน OpenGL นิดหน่อย

หลังจากสร้างลูกบาศก์คุณจะต้องการทำให้ขอบเรียบเพื่อสร้างภูมิประเทศของของเหลวที่แสดงในภาพของคุณ ฉันเชื่อว่าPolyVox (ใน C ++) ทำเช่นนี้ คุณสามารถดูรหัสของพวกเขา ฉันคิดว่าคุณทำในรูปแบบ 3 มิติตามที่ภาพแสดงในแบบ 2D: เฉลี่ยตำแหน่งลูกบาศก์โดยรอบเพื่อทราบว่าจะวางจุดสุดยอดแต่ละจุดอย่างไร

แก้ไข:

  • สร้างใบหน้าสำหรับก้อนที่อยู่ติดกับน้ำราวกับว่าแผ่นน้ำว่างเปล่าและทำให้น้ำใบหน้าใส
  • ใบหน้าที่ "ขอบ" สามารถสร้างได้เหมือนใบหน้าปกติหากคุณคิดว่า voxels นอกโลกจะว่างเปล่า
  • ฟิสิกส์: คุณสามารถป้อนตาข่ายที่แสดงผลไปยังเครื่องมือฟิสิกส์ของคุณเป็นวัตถุคงที่ได้
  • ตัวแก้ไขแผนที่: คุณต้องการแก้ไขข้อมูล voxel พื้นฐานไม่ใช่ตาข่าย! (mesh ควรทำมิเรอร์ข้อมูลดังนั้นการแก้ไข voxels ควรสร้างการเปลี่ยนแปลงใน mesh ของคุณ) คุณอาจต้องการค้นหา Model, View, Controller (MVC) หากคุณไม่คุ้นเคย

หากคุณมีคำถามเพิ่มเติมอย่าลังเลที่จะแสดงความคิดเห็น ยินดีต้อนรับสู่ gamedev.SE!


นี่เป็นวิธีแก้ปัญหาที่ซับซ้อนมากสำหรับปัญหาที่ค่อนข้างง่าย มีเกมมากมายที่ทำในสิ่งที่ OP กำลังขอโดยไม่มีความซับซ้อนของ voxels
Sean Middleditch

ฉันยอมรับว่า voxels นั้นซับซ้อน คุณช่วยลิงค์ไปที่เกมเหล่านี้ได้ไหม? ฉันสนใจที่จะฟังว่าพวกเขาทำได้อย่างไร
Wackidev

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

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

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

6

นี่: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.pngเป็นตัวอย่างแผนที่ที่ฉันเคยทำมาแล้ว

ฉันมี XML ที่แสดงถึงแผนที่และไทล์ประเภทต่าง ๆ แต่ละประเภทจะมีแอตทริบิวต์น้อย:

  • ความสูง
  • ตำแหน่ง
  • ประเภทการผสาน: การผสานประเภทนี้จะทำอย่างไรALL(หากควรผสานกับไทล์รอบ ๆ ), EQUAL(ผสานเฉพาะกับไทล์ประเภทเดียวกัน), NONE(ไม่รวมกัน)
  • การผสานความสูง: ความสูงสูงสุดสำหรับความลาดชัน (ดีสำหรับการแขวน) สมมติว่าคุณต้องการให้กระเบื้องผสานเฉพาะกับกระเบื้องที่มีความสูงเท่ากันหรือต่างกัน 1 ซึ่งจะเป็นค่าเดียว

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

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

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

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

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


+1 ขอบคุณสำหรับข้อมูลของคุณในสิ่งนี้ คุณยกประเด็นที่ดีเกี่ยวกับการฝังรากลึกเกี่ยวกับ "น้ำพุ" ที่ฉันไม่เคยคิดมาก่อน ฉันจะมองเข้าไปในการปรับเปลี่ยน VBO ได้ทันทีว่าตอนนี้ฉันรู้ว่ามันเป็นไปได้ :)
CaptainRedmuff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.