ฉันจะสร้างตาข่ายนำทางแบบ 2d ในสภาพแวดล้อมแบบไดนามิกที่รันไทม์ได้อย่างไร


9

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

ฉันเข้าใจแนวคิดของ "วิธี" ตาข่ายทำงาน (ค้นหาเส้นทางผ่านโหนดบนจุดยอดและ / หรือศูนย์กลางของขอบของรูปหลายเหลี่ยม)

เกมของฉันใช้สิ่งกีดขวางแบบไดนามิกที่สร้างขึ้นตอนรันไทม์

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

การนำทางตาข่าย

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

ฉันใช้จาวาสคริปต์ใน nodejs ถ้ามันสำคัญ


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

@ Matewew โลกของฉันประกอบด้วยอุปสรรคหลายเหลี่ยมนูนไม่มีเส้นโค้งและไม่มีรูปหลายเหลี่ยมเว้า สิ่งกีดขวางแต่ละอันจะถูกเก็บไว้เป็นวัตถุรูปหลายเหลี่ยมที่มีจุดยอดที่วัตถุเวกเตอร์แสดง
Stephen

1
สำหรับสิ่งที่คุ้มค่าฉันกำลังทำงานกับโซลูชันโดยอ้างอิงจากเอกสารนี้: gradworks.umi.com/3493710.pdfหากฉันประสบความสำเร็จฉันจะโพสต์โซลูชันของฉัน
Stephen

1
ตาข่ายนำทางไม่ได้อยู่ที่นั่น 100% บอกคุณว่าคุณสามารถไปที่ใดที่หนึ่งได้หรือไม่มันเป็นเพียงโครงร่างพื้นฐานของพื้นที่ที่เดินได้คุณยังต้องทำการตรวจสอบการชนกับวัตถุแบบไดนามิกแก้ไข: สวยมากที่เรย์พูด
dreta

@Stephen - ดูคำตอบความคิดเห็นยาว
Matthew R

คำตอบ:


3

@ สตีเฟ่น - ความคิดเห็นที่ยาวนาน - กระดาษนั่นดูเหมือนว่ามันอาจจะคุ้มค่าที่จะอ่านเมื่อฉันมีเวลา โดยทั่วไปสิ่งที่ฉันอยากจะแนะนำคือบางสิ่งบางอย่างตามแนวของอัลกอริทึมของ Hertel-Mehlhorn ซึ่งถูกกล่าวถึงในบทความ (การอ้างอิงสำหรับอัลกอริทึมเฉพาะนี้สามารถพบได้ที่นี่http://www.bringyou.to/compgeom/ ) ด้วยการเพิ่ม ของการแบ่งย่อยด้านแผนที่ (นอกขอบเขตของพื้นที่เล่น) บางครั้งเพื่อลดการเกิดขึ้นของสามเหลี่ยมเล็ก ๆ ที่เกิดขึ้นในหลายมุม สามเหลี่ยมเล็ก ๆ เหล่านั้นอาจเป็นปัญหาได้เพราะพวกมันสามารถมีขนาดเล็กกว่าสิ่งที่คุณ preforming หาเส้นทาง Hertel-Mehlhorn มีไว้สำหรับการลดรูปหลายเหลี่ยมที่เกิดจากการแบ่งพาร์ติชันแบบสามเหลี่ยมถ้าคุณสนใจที่นี่มากขึ้นเกี่ยวกับการหารูปสามเหลี่ยม:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm

นอกจากนี้ถ้าคุณไม่ต้องการบูรณาการล้อผมคิดว่าห้องสมุดนี้จริงจะทำทุกอย่างที่คุณต้องการ: http://code.google.com/p/polypartition/ มัน preforms triangulations และลดกับหนึ่งในตัวเลือกต่าง ๆ รวมถึง Hertel-Mehlhorn มันเป็นสิทธิ์การใช้งานของ MIT ซึ่งหมายความว่ามันสามารถใช้สำหรับโครงการโอเพนซอร์ซและเชิงพาณิชย์หากเป็นปัญหา

หากคุณตัดสินใจที่จะทำงานต่อไปในการใช้งานของคุณเองฉันชอบที่จะเห็นสิ่งที่คุณเกิดขึ้น


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

@Stephen ชอบที่จะเห็นงานนี้
kevzettler

@Stephen ฉันกำลังมองหาเวอร์ชันจาวาสคริปต์ด้วย
Apolo

6

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

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

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

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

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


1
ฉันควรอธิบายเพิ่มเติม: เกมของฉันไม่ได้อยู่ในแนวเดียวกันกับกริด ฉันกำลังสร้างกริดในพื้นที่ 800 x 600 พิกเซลแต่ละพิกเซลเป็นหนึ่งในพื้นที่บนกริด (ฉันยังคงหา A * ดังนั้นฉันยังไม่ได้คิดถึงประสิทธิภาพของสิ่งนี้) ฉันมีอุปสรรคที่ไม่ง่ายอย่างที่เป็นในภาพตัวอย่างด้านบนฉันแค่พยายามอธิบายปัญหา เห็นได้ชัดว่าสนามเด็กเล่นจำเป็นต้องได้รับการแก้ไขและหลังจากการวิจัยบางอย่างฉันคิดว่าตาข่ายนำทางจะเป็นวิธีที่เหมาะสมในการไป
สตีเฟ่น

3

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

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

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