ฉันจะใช้การตรวจจับการชนกันแบบ 2 มิติที่รวดเร็วและแม่นยำได้อย่างไร


11

ฉันตระหนักดีถึงวิธีการตรวจสอบว่ามีวัตถุสองมิติขึ้นไปชนกันหรือไม่ แต่ฉันสนใจที่จะตัดสินใจว่าจะตรวจสอบการชนกันหรือไม่ ในโครงการก่อนหน้านี้ฉันเพิ่งตรวจสอบวัตถุทุกชิ้นกับวัตถุอื่น ๆ (ฉันรู้ว่าระดับความโง่เขลา O (n ^ 2)) และมันสร้างเกมเพลย์ที่ลื่นไหลน้อยกว่า

ฟอรัมต่างๆยกย่องความยิ่งใหญ่ของ Quadtrees, B-Trees และต้นไม้หรือโครงสร้างอื่น ๆ ที่คุณนึกออก

โครงสร้างที่มีประสิทธิภาพที่สุดสำหรับการพิจารณาว่าควรตรวจสอบการชนกันคืออะไร?


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

ฉันคิดว่าgamedev.stackexchange.com/questions/14369/…สามารถช่วยคุณได้มาก เดิมทีมันมีไว้สำหรับและอัลกอริทึมสำหรับการประมวลผลแบบขนาน แต่ฉันคิดว่าอัลกอริทึมเดียวกันสามารถปรับปรุงแอปพลิเคชันเธรดเดี่ยวได้
Ali1S232

1
@ultifinitus นั่นคือสิ่งที่ฉันต้องการ ฉันจะตรวจสอบว่าวัตถุใดอยู่ใกล้เคียงโดยไม่วนซ้ำทุกวัตถุและตรวจสอบตำแหน่งของวัตถุได้
Mike Cluck

ไมค์คุณสามารถส่งอีเมลถึงฉันสำหรับรหัสเฉพาะบางอย่างที่ฉันใช้อยู่ใน c ++ - หรือฉันสามารถให้โครงสร้างพื้นฐานแก่คุณถึงแม้ว่ามันอาจจะค่อนข้างคลุมเครือและซับซ้อนเนื่องจากสิ่งนั้น
ultifinitus

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

คำตอบ:


12

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


วิธีแก้ปัญหานี้จัดการกับวัตถุที่มีเส้นขอบ 2 หรือ 4 เซลล์ตารางได้อย่างไร
ขี้เถ้า 999

1
เซลล์ใด ๆ ที่วัตถุซ้อนทับกันจะถูกพิจารณาว่าอยู่ในดังนั้นวัตถุสามารถอยู่ในหลายเซลล์ โครงสร้างข้อมูลเชิงพื้นที่ส่วนใหญ่จะจัดการกับปัญหาการทับซ้อนในลักษณะที่คล้ายกัน
Darcy Rayner

ว้าวนั่นช่างฉลาดเหลือเกิน +1 ไชโยเพื่อน
ashes999 999

1

เครื่องยนต์ฟิสิกส์ 2D เช่น Box2D และ Chipmunk ใช้ประโยชน์จากแผนที่แฮชเชิงพื้นที่อย่างหนัก

ดูhttp://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetectionสำหรับการอ้างอิง การสาธิตกระแตรวมถึง Visualizer แฮชเชิงพื้นที่ที่ดีมากซึ่งทำให้ชัดเจนจริงๆว่าพวกเขาเทคนิคการทำงาน


1

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

ความเป็นไปได้อีกอย่างหนึ่งคือการเก็บรักษารายการของวัตถุที่ใช้งาน / ไม่ใช้งานและไม่ต้องกังวลกับวัตถุแฝง (ซึ่งไม่ได้เคลื่อนที่เลย)

หากพวกเขาเป็นวัตถุขนาดกลางที่ผู้เล่นมองเห็นบนหน้าจอทุกอย่างเทียบกับทุกอย่างอาจไม่เลวร้ายนัก

นอกจากนั้นฉันกับดาร์ซีกริดสม่ำเสมอดี

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