EDIT / PEMBARUAN: Pertanyaan terbesar saya saat ini adalah apakah persamaan "t = ..." langkah 3 adalah ide yang bagus atau ada cara yang lebih baik untuk melakukannya. Sebagian besar masalah lain telah ditangani sebagian atau seluruhnya, tetapi tidak ada komentar atau jawaban yang benar-benar menyentuh masalah ini. Sekali lagi, solusi analitik mungkin diperlukan, kecepatan dan jarak terlalu besar, dan benda-benda terlalu kecil, untuk setiap solusi iteratif / rekursif (beberapa disarankan di bawah ini di komentar) yang dapat saya pikirkan (walaupun jika ada solusi iteratif / rekursif khusus yang akan menangani situasi semacam ini baik-baik saja maka saya pasti terbuka untuk itu). Terima kasih banyak atas bantuan Anda sejauh ini, Anda semua luar biasa dan saya sangat menghargai pikiran dan bantuan Anda!
Saya mencoba mendeteksi tabrakan antara benda-benda kecil berkecepatan tinggi. Ini adalah situasi di mana tunneling dapat terjadi dengan sangat mudah, bahkan pada kecepatan yang relatif rendah.
Ray casting tidak akan berfungsi, karena ini mendeteksi tabrakan antara dua objek berkecepatan tinggi, bukan antara satu objek dan dinding stasioner. (Kecuali jika saya salah paham tentang pengecoran sinar?) Kinerja SANGAT BANYAK pertimbangan; jika mungkin, saya ingin menghindari hit kinerja besar. Saya sudah memiliki quadtree yang fungsional dan sangat efektif ( http://en.wikipedia.org/wiki/Quadtree ) diimplementasikan, jadi saya akan memodifikasi dan menggunakannya seperti dijelaskan di bawah ini.
Sunting: Mengurangi interval waktu tidak akan berfungsi. Kecepatannya terlalu tinggi untuk solusi ini, yang berarti bahwa hit kinerja akan terlalu besar, sementara masih kehilangan sebagian besar tabrakan tunneling . (Misalnya, saya mungkin memiliki objek dengan ukuran sekitar 1 unit dengan kecepatan yang diukur dalam jutaan unit per interval waktu ...)
SOLUSI YANG DIUSULKAN:
Langkah 1:
Buat kotak di sekitar pergerakan setiap objek, lalu masukkan kotak-kotak itu ke dalam quadtree untuk menghasilkan daftar awal kemungkinan tabrakan. Lihat gambar berikut (gambar ini menunjukkan objek lingkaran yang bergerak dari satu posisi ke posisi lain, dan gerakan menghasilkan persegi panjang, yang akan dimasukkan ke dalam quadtree):
Langkah 2: (mungkin ingin melewati langkah ini?)
Periksa daftar kemungkinan tabrakan yang dihasilkan oleh quadtree. Lihat apakah persegi panjang berpotongan di setiap kemungkinan tabrakan. Jika demikian, lanjutkan ke langkah 3.
SUNTING: Di bawah ini, Sean Middleditch menyarankan menggunakan volume sapuan / persimpangan kapsul (jika objeknya lingkaran). Itu menyisakan tiga opsi: 1) lewati langkah 2 seluruhnya. 2) Lakukan langkah 2 dengan cara saya. 3) Lakukan dengan cara Sean. Cara Sean akan lebih mahal secara komputasi daripada ide kotak saya, namun itu akan menghilangkan lebih banyak hal positif yang salah daripada cara saya, mencegah mereka mencapai langkah terakhir.
Adakah yang bisa berbicara dari pengalaman tentang mana dari 3 pilihan ini yang terbaik? (Saya bermaksud menggunakan mesin fisika ini untuk beberapa hal yang berbeda, jadi saya mencari solusi "umumnya terbaik" yang bekerja paling cepat di berbagai situasi terluas, bukan hanya satu kasus uji khusus di mana saya dapat dengan mudah mengukur solusi mana tercepat).
Langkah 3:
Gunakan persamaan t = di bawah ini, jika diskriminan (yaitu bagian di bawah akar kuadrat) negatif atau 0, tidak ada tabrakan, jika positif maka gunakan nilai t sebagai waktu tabrakan (setelah itu mudah untuk menyesuaikan posisi sesuai. ..Jika kedua objek terus ada setelah tabrakan). Persamaan:
t = (-1/2 sqrt ((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz) ^ 2-4 (w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - a + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .
Di mana (1 dan 2 digunakan untuk menunjukkan objek 1 dan 2):
t adalah nilai waktu negatif antara 0 dan -1, di mana 0 adalah frame saat ini, dan -1 adalah frame sebelumnya;
a = x posisi 1;
b = y posisi 1;
c = x posisi 2;
d = posisi y 2;
w = x kecepatan 1;
x = x kecepatan 2;
y = y kecepatan 1;
z = y kecepatan 2;
r = radius 1;
s = radius 2;
Derivasi: (^ 2 berarti kuadrat)
Ambil persamaan parametrik (misalnya, newxpos1 = a + t w) untuk gerakan objek dan hubungkan ke rumus jarak (mengkuadratkan kedua sisi): rumus jarak kuadrat = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2. Ingat, t akan menjadi negatif. Untuk menemukan waktu tabrakan untuk dua objek melingkar kami mengatur sisi kiri sama dengan (r + s) ^ 2. Memecahkan untuk t menggunakan persamaan kuadratik (dan banyak aljabar yang sangat membosankan), kita mendapatkan persamaan "t = ..." di atas.
Pertanyaan saya:
1) Apakah ini cara yang baik untuk melakukannya? Apakah ini akan berhasil? Apakah saya akan mengalami masalah yang tidak terduga? (Saya tahu saya akan mengalami masalah ketika lebih dari 2 objek pada suatu waktu bertabrakan, tetapi saya tidak peduli karena satu-satunya kasus yang saya benar-benar keberatan adalah ketika mereka memiliki kecepatan relatif rendah (jika kecepatan relatif tinggi) maka solusi "konyol" yang diberikan algoritma akan "cukup baik", dan tidak mungkin bagi manusia untuk melihat kesalahan), dan jika lebih dari 2 bertabrakan dengan kecepatan relatif rendah dalam langkah waktu yang sama, sebagian besar solusi akan cukup dekat saja, karena saya tidak berencana untuk memiliki banyak tabrakan inelastik)
2) Apakah kinerja saya akan banyak menderita? Saya pikir itu tidak akan terjadi, tetapi jika ya, apakah ada cara yang lebih baik untuk melakukannya?
3) Haruskah saya melewati langkah 2 dan langsung dari langkah 1 ke 3? Jelas langkah 2 tidak penting, tetapi mungkin membantu kinerja (ATAU mungkin lebih banyak waktu CPU daripada menghemat).
Semua komentar, saran, atau kritik lainnya sangat kami harapkan. Terima kasih untuk bantuannya!