เราจะสร้าง Navigation Grid สำหรับโลก 3 มิติได้อย่างไร


11

ฉันพยายามค้นหาวิธีแก้ไขปัญหานี้ ฉันกำลังพยายามสร้างตาข่ายนำทางในรูปแบบของตารางของจุดยอดที่ล็อค x, y พิกัดพื้นในรูปสี่เหลี่ยมสำหรับพื้นที่ 3D แต่ฉันมีปัญหาในการพยายามหาวิธีที่จะไปเกี่ยวกับเรื่องนี้

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

ความคิดต่อไปของฉันคือการทำสิ่งที่ Unreal Engine 3 เคยทำ

https://udn.epicgames.com/Three/NavigationMeshReference.html

ซึ่งก็คือการใช้ raycasts เพื่อสร้างตาข่าย ฉันไม่สามารถหาวิธีที่จะให้ raycasts หยุด

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

ปัญหาหลักของฉันคือ ... นี่ดูเหมือนจะไม่เหมาะสมที่สุด โดยไม่ต้องคิดเลยเมื่อกระบวนการประมาณ O (N ^ 3) สำหรับระดับหลายชั้น ซึ่งจะได้รับที่น่ารังเกียจสวย

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

ดังนั้นคำถามคือ ...

อะไรจะเป็นวิธีที่มีประสิทธิภาพในการสร้าง navmesh ที่คาดเอวนี้ และจะเป็นวิธีที่ดีในการสร้างกระเบื้องได้อย่างไร


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

@ Niels ฉันวางแผนก่อนสร้างแล้วโหลดลงในเกม
moonshineTheleocat

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

ระดับของคุณใหญ่แค่ไหน? เราใช้การทำใหม่ในเกมขนาดใหญ่และไม่มีปัญหา - คุณเพียงแค่ต้องปรับค่า tiie เป็นต้น
Steven

ฉันคิดว่าคุณไม่มีบิต "gridded" ซึ่งไม่เหมือนกับกระเบื้องที่ใช้ใหม่ ฉันกำลังพยายามหาวิธีเปลี่ยนโฉมใหม่ให้ทำสิ่งนั้น แต่มันก็เป็นฝันร้าย
moonshineTheleocat

คำตอบ:


1

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

นั่นจะเป็นทางออกที่ง่าย มีอัลกอริทึมมากมายสำหรับการค้นหาเส้นทางและสร้าง navmesh

ฉันต้องการแบ่งปันบางอย่างที่ฉันได้อ่านมานานแล้ว

Example01

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

Example02

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

สำหรับคำถามฉันขอแนะนำให้คุณไปดูคำตอบของ Kromsterในรายการ navmesh ที่สร้างอัลกอริทึม

ตรวจสอบระบบ AI ของ Left 4 Deadซึ่งตัวอย่างเป็นส่วนหนึ่งของ หัวข้อที่น่าสนใจอื่น ๆ อีกมากมายครอบคลุม

โชคดี.


0

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


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

0

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

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


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

-2

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


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