Di salah satu proyek saya, saya memiliki area permainan dalam bentuk lingkaran. Di dalam lingkaran ini, lingkaran kecil lainnya bergerak. Yang ingin saya lakukan adalah menjaga lingkaran kecil agar tidak bergerak di luar lingkaran yang lebih besar. Di bawah ini Anda dapat melihat bahwa dalam bingkai 2 lingkaran kecil sebagian di luar, saya perlu cara untuk memindahkannya kembali tepat sebelum akan pindah ke luar. Bagaimana ini bisa dilakukan?
Juga, saya membutuhkan titik tumbukan di sepanjang busur lingkaran besar sehingga saya dapat memperbarui kecepatan lingkaran kecil itu. Bagaimana cara menghitung poin ini?
Apa yang ingin saya lakukan adalah sebelum memindahkan lingkaran kecil, saya memprediksi posisi berikutnya dan jika berada di luar saya menemukan waktu tabrakan antara t = 0 dan t = 1 (t = 1 langkah waktu penuh). Jika saya memiliki waktu t tabrakan maka saya hanya memindahkan lingkaran kecil selama t bukannya langkah waktu penuh. Tetapi sekali lagi, masalahnya adalah saya tidak tahu cara mendeteksi pada saat itu tabrakan terjadi ketika datang ke dua lingkaran dan satu berada di dalam yang lain.
EDIT:
Contoh titik tumbukan (hijau) yang ingin saya temukan. Mungkin gambarnya sedikit salah tetapi Anda mendapatkan idenya.
sumber
B
, dank=0
. Sekarang jika resolusi tabrakan yang Anda inginkan, saya belum membahasnya dalam jawaban saya karena akan membutuhkan pengetahuan tentang sifat fisik objek. Apa yang seharusnya terjadi? Haruskah lingkaran dalam memantul di dalam? Atau berguling? Menyapu?V
, buat lingkaran dalam bergerak diV*t
sepanjang kelilingR-r
lingkaran. Ini berarti rotasi sudutV*t/(R-r)
radian di sekitar titikA
. Dan vektor kecepatan dapat diputar dengan cara yang sama. Tidak perlu tahu yang normal (yang selalu berorientasi pada pusat lingkaran) atau untuk memperbarui kecepatan dengan cara lain.Katakanlah lingkaran besar itu lingkaran A dan lingkaran kecil itu lingkaran B.
Periksa untuk melihat apakah B ada di dalam A:
Jika dalam frame
n-1
B berada di dalam A dan dalam framen
B di luar A dan waktu antara frame tidak terlalu besar (alias B tidak bergerak terlalu cepat) kita dapat memperkirakan titik tabrakan dengan hanya menemukan koordinat Cartesian dari B relatif ke A:Kami kemudian dapat mengonversi poin ini ke sudut:
Jika Anda ingin tahu lebih tepat pada apa
t
B di luar A untuk pertama kalinya Anda bisa melakukan persimpangan lingkaran-ray setiap frame dan kemudian membandingkan jika jarak dari B ke titik tabrakan lebih besar maka jarak B dapat melakukan perjalanan mengingat itu kecepatan saat ini. Jika demikian, Anda dapat menghitung waktu tumbukan yang tepat.sumber
Biarkan (Xa, Ya) posisi lingkaran besar dan jari-jari R, dan (Xb, Yb) posisi lingkaran kecil dan jari-jari r.
Anda dapat memeriksa apakah kedua lingkaran ini bertabrakan jika
Untuk mengetahui posisi tabrakan, temukan momen waktu yang tepat ketika lingkaran bertabrakan, dengan menggunakan pencarian biner tetapi dengan sejumlah langkah tetap. Bergantung pada bagaimana permainan Anda dibuat, Anda dapat mengoptimalkan bagian kode ini (saya memberikan solusi ini untuk tidak tergantung pada bagaimana bola kecil berperilaku. Jika memiliki akselerasi konstan, atau kecepatan konstan, bagian kode ini dapat dioptimalkan dan diganti dengan formula sederhana).
Setelah Anda mengetahui waktu tumbukan, hitung posisi kedua lingkaran pada waktu terakhir dan titik tumbukan akhir adalah
sumber
Saya telah mengimplementasikan demo bola memantul di jsfiddle menggunakan algoritma yang dijelaskan oleh Sam Hocevar :
http://jsfiddle.net/klenwell/3ZdXf/
Inilah javascript yang mengidentifikasi titik kontak:
sumber