อัลกอริทึมตรวจจับการชนกันของเฟสแคบ


10

การตรวจจับการชนมีสามขั้นตอน

  1. Broadphase : มันวนลูประหว่าง objec ทั้งหมดที่สามารถโต้ตอบบวกได้รับอนุญาตถ้ามันจะเร่งความเร็ววน

  2. Narrowphase : พิจารณาว่าพวกเขาชนกันและบางครั้งอย่างไรไม่มีผลบวกปลอม

  3. การแก้ไข : แก้ไขการชน

คำถามที่ฉันถามเป็นเรื่องเกี่ยวกับเฟสแคบ มีอัลกอริธึมหลายอย่างแตกต่างกันในความซับซ้อนและความแม่นยำ

  1. Hitbox intersection : นี่เป็นอัลกอริทึม a-posteriori ที่มีความซับซ้อนต่ำที่สุด แต่ก็ไม่แม่นยำเกินไป

  2. จุดตัดสี : จุดตัด Hitbox สำหรับแต่ละพิกเซล, a-posteriori, พิกเซลสมบูรณ์แบบ, ไม่แม่นยำในเรื่องของเวลา, ความซับซ้อนสูงขึ้น

  3. การแยกทฤษฎีบทแกน : มันถูกใช้บ่อยกว่า, แม่นยำสำหรับรูปสามเหลี่ยมอย่างไรก็ตาม, a-posteriori, เนื่องจากมันหาขอบไม่ได้, เมื่อพิจารณากรอบสุดท้ายในบัญชี, มันมีเสถียรภาพมากขึ้น

  4. Linear raycasting : อัลกอริทึม A-Priori ซึ่งเป็นประโยชน์สำหรับฟิสิกส์กึ่งที่สมจริงมองหาจุดตัดที่แม่นยำยิ่งกว่า SAT แต่มีความซับซ้อนมากขึ้น

  5. การแก้ไขเส้นโค้ง: A-Priori, แม่นยำยิ่งขึ้นกว่ารังสีเชิงเส้น, coplexity มากยิ่งขึ้น

อาจมีอีกมากมายที่ฉันลืมไป คำถามคือเมื่อไรจะดีกว่าถ้าใช้ SAT เมื่อรังสีเมื่อเส้นโค้งและไม่ว่าจะมีอะไรที่ดีกว่า

คำตอบ:


6

สองสิ่งที่คุณหายไปซึ่งทำให้ฉันโดดเด่นในทันทีคือ GJK และ MPR

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

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

MPR เป็นหนึ่งในเกมยอดนิยม มันมีประสิทธิภาพมากมีเสถียรภาพตัวเลขและใช้งานง่าย

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

ดู:


3

ฉันอยากจะบอกว่าการทดสอบแกนแยกของมันไม่ใช่ทฤษฎีบท

คุณจะใช้ SAT กับรูปหลายเหลี่ยมที่ไม่เคลื่อนไหว (2D) แม้ว่าคุณจะสามารถขยายออกเพื่อรับมือกับการเคลื่อนที่เชิงเส้นแบบสัมพัทธ์

http://elancev.name/oliver/2D%20polygon.htm#tut3

อย่าใช้ GJK ในแบบ 2D ฉันพบว่ามันช้ากว่าการบังคับให้ SAT อย่างเดียวดาย

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

สำหรับการเคลื่อนย้ายและการหมุนรูปหลายเหลี่ยม (และรูปหลายเหลี่ยม) คุณสามารถใช้ Conservative Advancement เพื่อค้นหาเวลาและจุดติดต่อที่แน่นอน

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเทคนิคเหล่านี้ในโพสต์บล็อกนี้ซึ่งฉันเขียนกลับมาในขณะที่:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

หวังว่าจะช่วย!

ไชโยพอล


2
ทฤษฎีแกนแยก: แกนมีอยู่ตามที่การคาดการณ์ของวัตถุนูนสองชิ้นจะแยกออกจากกันถ้าวัตถุนั้นแยกกัน การทดสอบแกนที่แยก: นำทฤษฎีบทดังกล่าวมาใช้ในทางปฏิบัติฉันเดา
Eric

0

มันขึ้นอยู่กับประเภทของเกมที่คุณมี แต่ละวิธีข้างต้นมีการแลกเปลี่ยนของตัวเอง

อย่างไรก็ตาม SAT เป็นมาตรฐานที่ค่อนข้างใช้ในประสบการณ์ของฉันสำหรับนักฟิสิกส์ฟิสิกส์ทั่วไปเช่น Box2D ใช้มันอย่างกว้างขวาง (Angry Birds และเกมอื่น ๆ ใช้ Box2D)

ชุดรูปแบบของการตัดกันสีผสมกับการแยก SAT หรือ Hitbox ใช้ในเกมเช่น Sonic, Megaman ที่ให้ผลลัพธ์ที่ดี

ฉันไม่รู้อะไรเกี่ยวกับ # 4 และ # 5 มาก

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