Saya mencoba menerapkan sistem tabrakan dalam game 2D yang saya buat. Teorema sumbu pemisah (seperti yang dijelaskan oleh tutorial tabrakan metanet ) sepertinya merupakan cara yang efisien dan tangguh dalam menangani deteksi tabrakan, tapi saya tidak terlalu menyukai metode respons tabrakan yang mereka gunakan. Dengan memindahkan secara membabi buta di sepanjang sumbu tumpang tindih paling sedikit, algoritma hanya mengabaikan posisi sebelumnya dari objek bergerak, yang berarti bahwa itu tidak bertabrakan dengan objek stasioner sebanyak itu masuk dan kemudian memantul.
Berikut adalah contoh situasi di mana ini penting:

Menurut metode SAT yang dijelaskan di atas, persegi panjang hanya akan keluar dari segitiga tegak lurus dengan sisi miringnya:

Namun, secara realistis, persegi panjang harus berhenti di sudut kanan bawah segitiga, karena itu akan menjadi titik tabrakan pertama jika bergerak terus menerus sepanjang vektor perpindahannya:

Sekarang, ini mungkin tidak terlalu penting selama bermain game, tapi saya ingin tahu apakah ada cara yang efisien dan umumnya mendapatkan perpindahan akurat dengan cara ini. Saya telah memeras otak saya selama beberapa hari terakhir, dan saya belum mau menyerah!
(Diposting silang dari StackOverflow, harap itu tidak melanggar aturan!)
Langkah 1: Untuk setiap poligon, temukan dua titik terjauh sepanjang proyeksi poligon itu ke garis yang tegak lurus dengan vektor gerakan.
Langkah 2: Bagilah setiap poligon di sepanjang garis yang menghubungkan titik-titik ini. Setengah dari poligon yang menghadap poligon lain di sepanjang vektor gerak adalah "lambung depan". Ini adalah satu-satunya bagian dari poligon yang dapat bertabrakan.
Langkah 3:Proyeksikan vektor dari setiap titik pada "lambung maju" setiap poligon di sepanjang vektor gerakan ke arah poligon yang berlawanan, dan periksa untuk persimpangan dengan setiap tepi "lambung maju" poligon yang berlawanan. (Mungkin lambat, tetapi komputer saat ini cukup cepat - bukan?) (Maaf tentang panah miring. Semua panah harus paralel.)
Langkah 4: Ambil vektor terpendek. Ini adalah jarak tumbukan yang tepat.
Langkah 5: Voila!
