Hareketli bir hedefi vurmak için atış açısı ve hızı nasıl hesaplanır?


11

Bir 2D Android oyunu geliştiriyorum ve AI mermilerinin bir yolu takip eden veya serbest hareket eden düşmanları vurması için bir hedefleme algoritması yapıyorum. Şu anda, bir mesafeden sonra hedefin nerede olacağını hesaplar ve o mesafeden karşılamak için bir mermiyi ateşler. Tabii ki bu hedefe ulaşmak için mermi hızını değiştirmek anlamına gelir.

Merminin ne zaman ateş etmesi gerektiğini ve sadece sabit bir hızda gidebiliyorsa nereye nişan alması gerektiğini hesaplamak için basit-ish algoritması (optimal-ish) için herhangi bir ipucu var mı? Merminin hedefin hızının iki katına çıktığını mı söylüyorsunuz?

Düşünebilmemin tek yolu araştırmayı içeriyor ve oldukça büyük görünüyor.



@JohnMcDonald: Parabolik mermilerle ilgili olduğu için çok ilgili değil, doğrusal değil. Bu çok daha yakın: gamedev.stackexchange.com/questions/4995/…
e100

Yanıtlar:


13

Yaptığım bir kule savunma oyununda kavşağı ve dolayısıyla hedef noktasını tahmin etmek için ikinci dereceden bir denklem kullandım. Aşağıdaki hedef kod pasajı, düşmanın sabit bir hızda ve yönde ilerlediğini varsayar. Ayrıca merminin bilinen bir sabit hızda hareket edeceğini varsayar (herhangi bir hız olabilir, ancak algoritma tarafından bilinmelidir).

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

Ayrıca etki süresini de belirlediğinden, o anda hedefin bulunduğu yerde etki grafiklerini çağırmak için geçen süreye kadar bekledim ... vuruşları belirlemek için herhangi bir çarpışma tespitine gerek yok.


msgstr "isabeti belirlemek için herhangi bir çarpışma tespitine gerek yok." - Hedef (ler), hızlarını ve yönlerini korumakla sınırlıysa. --- Ancak, aktif bir AI'ları varsa veya daha da kötüsü, oyuncuysa ve atıcı ateş ettikten sonra hareket edebiliyorsa, çarpışma tespiti yerine isabetlerinizi zamanında dayandırmak, oyuncu tabanınızın bazı kötü böcek / aksaklık olarak algılar.
XenoRo

@TheLima yup, cevabın 2. cümlesinde söylediği gibi. ;-)
Steve H

Bu benim senaryom için neredeyse mükemmel, ama bu 2 ek değişkeni nasıl hesaba katarsınız: mermi için hızlanma, kulenin kendisinin hareketi?
Jack

Nedir a0'dır? Bu, sıfır istisna ile bir bölünme üretecektir, ancak bu, t değişkeni açısından ne anlama gelir? 'çok büyük bir sayı' olarak mı düşünülmeli yoksa en iyi durum ne olurdu?
firelynx

Bunun arkasındaki sezgiye giren iyi bir kitap var mı? Bu matematiği nasıl arayacağınızı merak ediyorum ...
davidkomer

4

resim açıklamasını buraya girin

AI, merminin ateşlendiği sırada hedefin yeri ve hedefin ölüm noktasında nihai yeri bir üçgen oluşturur.

  1. Mermi hızı olan yan uzunluk a
  2. Hedef hız olan yan uzunluk b
  3. Hedefin hareket hedefinin hareket açısı.

Üçgenin üç kısmı, bir SSA vakası var, bu yüzden bunu böyle çöz

  1. Hareket açısına ve AI'nin konumuna göre B açısını bulun
  2. A açısını bulmak için sinüs yasasını kullanın

A açısı, merminin fırlatılması gereken açıyı belirlemenize izin vermelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.