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

ตามวิธี SAT อธิบายข้างต้นสี่เหลี่ยมจะโผล่ออกมาจากสามเหลี่ยมตั้งฉากกับด้านตรงข้ามมุมฉากของมัน:

อย่างไรก็ตามตามความเป็นจริงสี่เหลี่ยมควรหยุดที่มุมล่างขวาของรูปสามเหลี่ยมซึ่งจะเป็นจุดที่เกิดการชนครั้งแรกถ้ามันเคลื่อนไหวอย่างต่อเนื่องตามเวกเตอร์การกระจัด:

ตอนนี้สิ่งนี้อาจไม่สำคัญในระหว่างการเล่นเกม แต่ฉันชอบที่จะรู้ว่ามีวิธีการที่มีประสิทธิภาพ ฉันเก็บสมองของฉันไว้สองสามวันที่ผ่านมาและฉันยังไม่อยากยอมแพ้!
(ข้ามโพสต์จาก StackOverflow หวังว่าจะไม่ผิดกฎ!)
ขั้นตอนที่ 1:สำหรับแต่ละรูปหลายเหลี่ยมให้หาจุดที่ไกลที่สุดสองจุดไปตามเส้นโครงของรูปหลายเหลี่ยมนั้นลงบนเส้นตั้งฉากกับเวกเตอร์เคลื่อนที่
ขั้นตอนที่ 2:แบ่งแต่ละรูปหลายเหลี่ยมตามเส้นเชื่อมต่อจุดเหล่านี้ ครึ่งหนึ่งของรูปหลายเหลี่ยมที่หันหน้าไปทางรูปหลายเหลี่ยมอื่น ๆ ตามการเคลื่อนที่ของเวกเตอร์คือ "ตัวเรือเดินหน้า" นี่เป็นเพียงส่วนเดียวของรูปหลายเหลี่ยมที่อาจชนกันได้
ขั้นตอนที่ 3:ฉายเวกเตอร์จากแต่ละจุดใน "ฮัลล์ไปข้างหน้า" ของรูปหลายเหลี่ยมตามเวกเตอร์ที่เคลื่อนไหวไปยังรูปหลายเหลี่ยมที่ตรงกันข้ามและตรวจสอบการตัดกันกับขอบของ "ฮัลล์ไปข้างหน้า" ของรูปหลายเหลี่ยมที่ตรงกันข้าม (อาจช้า แต่คอมพิวเตอร์ค่อนข้างเร็วทุกวันนี้ใช่ไหม?) (ขออภัยเกี่ยวกับลูกศรเอียงลูกศรทั้งหมดควรขนานกัน)
ขั้นตอนที่ 4:ใช้เวกเตอร์ที่สั้นที่สุด นี่คือระยะการชนที่แน่นอน
ขั้นตอนที่ 5: Voila!
