Bagaimana cara menghitung sudut dan kecepatan tembakan untuk mengenai target yang bergerak?


11

Saya sedang mengembangkan game Android 2D dan saya membuat algoritma yang bertujuan untuk proyektil AI untuk mengenai musuh baik mengikuti jalan, atau bergerak bebas. Saat ini ia hanya menghitung di mana target akan berada setelah jarak dan menembakkan proyektil untuk mencapainya pada jarak itu. Tentu saja ini berarti memvariasikan kecepatan proyektil untuk memenuhi target.

Adakah yang punya tips untuk algoritma ish-sederhana (optimal-ish) untuk menghitung kapan proyektil perlu ditembakkan dan di mana ia perlu membidik jika hanya dapat bergerak dengan kecepatan konstan? Katakanlah proyektil berjalan dua kali kecepatan target?

Satu-satunya cara saya bisa memikirkan melibatkan pencarian dan tampaknya cukup besar.



@ JohnMcDonald: tidak terlalu terkait mengingat itu tentang proyektil parabola, tidak linier. Ini jauh lebih dekat: gamedev.stackexchange.com/questions/4995/…
e100

Jawaban:


13

Dalam permainan menara pertahanan yang saya buat, saya menggunakan persamaan kuadrat untuk memprediksi persimpangan dan dengan demikian titik tujuan. Cuplikan kode bertujuan berikut ini mengasumsikan bahwa musuh bepergian dengan kecepatan dan arah yang konstan. Ini juga mengasumsikan proyektil akan bepergian dengan kecepatan konstan yang diketahui (bisa berupa kecepatan apa pun tetapi harus diketahui oleh algoritme).

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Karena itu juga menentukan waktu tumbukan, saya hanya menunggu sampai waktu yang disisipkan untuk memanggil tumbukan grafik pada posisi target pada waktu itu ... tidak perlu deteksi tabrakan untuk menentukan hit.


"Tidak perlu deteksi tabrakan untuk menentukan klik." - Jika target dibatasi untuk mempertahankan kecepatan dan arahnya. --- Jika, bagaimanapun, mereka memiliki AI aktif, atau lebih buruk, adalah pemain, dan dapat bergerak setelah penembak melepaskan tembakan, maka mendasarkan hits Anda tepat waktu daripada pendeteksian tabrakan akan menghasilkan apa yang menjadi basis pemain Anda akan dianggap sebagai beberapa bug / gangguan jahat.
XenoRo

@TheLima ya, persis seperti yang tertulis di kalimat ke-2 dari jawabannya. ;-)
Steve H

Ini hampir sempurna untuk skenario saya, tetapi bagaimana Anda memfaktorkan 2 variabel tambahan ini: akselerasi untuk proyektil, pergerakan menara itu sendiri?
Jack

Apa aitu 0? Ini akan menghasilkan pembagian dengan pengecualian nol, tetapi apa artinya ini dalam hal variabel t? haruskah itu dianggap 'angka yang sangat besar' atau apa kasus terbaiknya?
firelynx

Apakah ada buku bagus yang membahas intuisi di balik ini? Saya ingin tahu bagaimana Anda tahu untuk mencari matematika ini ...
davidkomer

4

masukkan deskripsi gambar di sini

AI, lokasi target selama proyektil ditembakkan, dan lokasi akhirnya target pada titik kematian membentuk segitiga. Berikut adalah apa yang harus Anda ketahui:

  1. Panjang sisi a, yang merupakan kecepatan proyektil
  2. Panjang sisi b, yang merupakan kecepatan target
  3. Sudut gerak target gerak target.

Anda memiliki tiga bagian segitiga, kotak SSA, jadi selesaikan seperti ini

  1. Temukan sudut B berdasarkan sudut gerak dan lokasi AI
  2. Gunakan hukum sinus untuk menemukan sudut A

Sudut A harus memungkinkan Anda untuk menentukan sudut di mana proyektil harus diluncurkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.