Saya memiliki dua AABB yang bergerak, apa cara tercepat untuk memeriksa apakah mereka akan berpotongan di bawah bingkai?
Dengan memindahkan maksud saya bukan hanya untuk memeriksa dengan metode persimpangan persegi panjang yang biasa, maksud saya semacam tes mudah disapu sederhana yang hanya mengembalikan boolean, tidak ada waktu hit atau apa pun.
Apa yang saya pikirkan adalah melakukannya seperti ini:
Tetapi Hexagon itu cukup kompleks dan saya tidak tahu bagaimana cara menghitung persimpangan AABB - Polygon, apakah mungkin ada cara yang lebih mudah?
Bahasa pemrograman apa pun yang paling Anda sukai, saya dapat dengan mudah porting itu.
Terima kasih.
Jawaban:
Gunakan jumlah Minkowski
Cara yang baik untuk menyelesaikan masalah ini adalah dengan mempertimbangkan persimpangan antara garis gerak ( v ) yang diterjemahkan ke titik asal ( v ' ) dan jumlah Minkowski dari A yang diputar 180 derajat pada titik asal ( A' ) dan rintangannya (hanya B dalam kasus ini): A' ⊕ B .
Dalam gambar berikut saya tempat A smack-dab di asal sewenang-wenang sistem koordinat. Ini menyederhanakan pemahaman karena memutar A sebesar 180 derajat menghasilkan A ' , dan v yang diterjemahkan ke asal sama dengan v' .
Jumlah Minkowski adalah persegi panjang hijau, dan titik persimpangan A bergerak dan B stasioner dapat ditemukan dengan melakukan persimpangan garis-AABB . Titik-titik ini ditandai dengan lingkaran biru.
Dalam gambar berikut asal yang berbeda digunakan dan titik persimpangan yang sama ditemukan.
Beberapa AABB bergerak
Untuk membuat karya ini untuk dua AABBs bahwa langkah secara linear selama periode waktu tertentu Anda akan kurangi B 's kecepatan vektor dari A ' vektor kecepatan dan penggunaan yang sebagai segmen garis untuk persimpangan line-AABB.
Kode palsu
Respon tabrakan
Bergantung pada gameplay Anda akan melakukan deteksi tabrakan lebih halus (mungkin AABB mengandung jerat), atau bergerak maju ke fase berikutnya: respon tabrakan.
Ketika ada tabrakan, algoritma garis-AABB-persimpangan akan mengembalikan 1 atau 2 titik persimpangan tergantung pada apakah A mengakhiri gerakannya di dalam B atau melewatinya, masing-masing. (Ini mengabaikan kasus yang merosot di mana A menyerempet B di sepanjang sisinya atau di salah satu sudutnya masing-masing.)
Either way, titik persimpangan pertama sepanjang segmen garis adalah titik tumbukan, Anda akan menerjemahkan ini kembali ke posisi yang benar dalam sistem koordinat dunia (lingkaran biru muda pertama di gambar kedua sepanjang v asli , sebut saja p ) dan kemudian memutuskan (misalnya, untuk tumbukan elastis dengan merefleksikan v sepanjang tumbukan normal pada p ) apa posisi sebenarnya untuk A pada akhir bingkai akan ( Pada +1 ).
Jika ada lebih dari 2 colliders, ini akan menjadi sedikit lebih rumit, karena Anda ingin melakukan deteksi tabrakan untuk bagian kedua, yang direfleksikan, dari v juga.
sumber
OBB - Kotak pembatas yang berorientasi. Ini tutorialnya
Secara efektif, kotak pembatas selaras dengan vektor Velocity objek A sebagai sumbu y (atas). Lebar dan tingginya dapat dihitung dengan titik awal dan akhir objek A. Anda kemudian membandingkannya dengan AABB objek B (memperlakukannya sebagai OOBB), dan emas Anda.
Jika Anda hanya mencari tes persimpangan cepat untuk melihat JIKA mereka BISA mungkin berpotongan, Anda bisa membuat AABB yang mengelilingi AABB objek A di posisi awal dan akhir. Jika AABB tidak-berpotongan dengan ini semua mencakup AABB, maka tidak ada persimpangan; Namun, ini bisa mengarah ke positif palsu, jadi Anda hanya boleh menggunakannya sebagai tes awal.
sumber
Anda tidak perlu OOB dan Anda tidak perlu menggunakan deteksi tabrakan stepping time. Cukup gunakan tes menyapu AABB normal, lihat tautan ini . Pada dasarnya itu tidak persis apa yang Anda miliki dalam diagram Anda: AABB bergerak adalah "menyapu" dari titik awal ke titik akhir dan kemudian yang digunakan untuk deteksi tabrakan terhadap AABB statis lainnya.
Jika Anda khawatir tes sapuan ini lebih mahal karena mengembalikan "waktu tumbukan", saya pikir Anda mengoptimalkan secara prematur.
Informasi lebih mendalam tentang tes sapu dapat ditemukan dalam buku yang sangat baik: Deteksi Tabrakan Real-Time oleh Christer Ericson.
sumber
Anda harus menguraikan gerakan menjadi langkah-langkah yang lebih kecil dan menggunakan informasi itu untuk menghitung AABB tingkat tinggi. Jika AABB besar berpotongan, Anda kemudian dapat memeriksa langkah-langkah kecil agar lebih akurat.
Memperkirakan apakah mungkin ada tabrakan dengan memeriksa AABB (atau OOBB) hanya dengan menggunakan posisi awal dan akhir dapat melewatkan tabrakan jika salah satu objek berputar dengan cepat dan lebih lama dalam satu dimensi daripada yang lain.
Untuk menghitung estimasi AABB yang lebih akurat, dekomposisi pergerakan menjadi langkah-langkah yang lebih kecil, dan hanya menggunakan AABB awal (bukan mesh objek), putar AABB (sekarang hanya sebuah kotak, bukan sumbu yang disejajarkan) karena objek akan berputar dan bergerak di setiap langkah. Maks dan titik min untuk setiap sumbu akan memberi Anda AABB yang melingkupi seluruh gerakan objek.
Jika ada persimpangan dengan AABB yang lebih besar, Anda kemudian dapat menggunakan AABB yang lebih kecil yang sudah dihitung untuk menentukan di mana tabrakan mungkin. Untuk masing-masing AABB kecil yang bersinggungan dengan objek lain, Anda dapat melakukan deteksi persimpangan jala yang lebih mahal.
sumber
Anda harus menguraikan gerakan menjadi langkah-langkah gerakan yang lebih kecil. Sebagai contoh:
Anda ingin menguraikan gerakan menggunakan komponen yang lebih besar (dalam hal ini, sumbu X), dan kemudian memeriksa tabrakan di setiap langkah.
Ini mungkin terlihat terlalu mahal, tetapi pertimbangkan bahwa suatu objek bergerak lebih cepat dari lebar sendiri setiap siklus akan sangat LUAR BIASA, jadi skenario ini tidak seperti yang biasa Anda pikirkan.
sumber
Anda juga harus menggunakan kecepatan relatif untuk pemeriksaan tabrakan sehingga satu AABB "statis" dan yang lainnya bergerak dengan kecepatan kecepatannya sendiri dikurangi kecepatan "statis".
Cara tercepat untuk melihat apakah mereka mungkin berpotongan adalah untuk hanya memperluas AABB bergerak dengan kecepatan.
misalnya AABB bergerak ke kanan dengan bingkai 0,1 x /, maka Anda memperpanjangnya sehingga tepi kiri tetap sama dan tepi kanan 0,1 lebih lanjut. Kemudian Anda dapat memeriksa dengan AABB baru. Jika salah maka tidak ada tabrakan. (pengembalian awal dan akurat untuk kecepatan kecil).
Kemudian Anda dapat memeriksa apakah ujung dan mulai AABB dari objek yang bergerak bersinggungan. jika benar maka kembalikan benar.
Kalau tidak, Anda perlu memeriksa apakah diagonal memotong ABB statis.
Ini melibatkan mendapatkan koordinat diagonal di mana x = tepi kiri statis dan tepi kanan melihat apakah y berada di dalam bagian bawah dan atas. (ulangi sebaliknya)
sumber