Jak obliczyć kąt strzału i prędkość, by trafić w ruchomy cel?

11

Tworzę grę 2D na Androida i tworzę algorytm celowania dla pocisków AI, by trafiały wrogów zarówno ścieżką, jak i swobodnym ruchem. W tej chwili po prostu oblicza, gdzie będzie cel na odległość i wystrzeliwuje pocisk, aby go pokonać na tej odległości. Oczywiście oznacza to zmianę prędkości pocisku, aby osiągnąć cel.

Czy ktoś ma jakieś wskazówki dotyczące prostego algorytmu (optymalnego) do obliczania, kiedy pocisk musi wystrzelić i dokąd musi wycelować, jeśli może poruszać się tylko ze stałą prędkością? Powiedz, że pocisk leci dwa razy szybciej niż cel?

Jedyny sposób, w jaki mogę myśleć, to wyszukiwanie i wydaje się dość duży.

Guen
źródło
@JohnMcDonald: niezbyt związany, ponieważ dotyczy pocisków parabolicznych, a nie liniowych. Jest o wiele bliżej: gamedev.stackexchange.com/questions/4995/…
e100

Odpowiedzi:

13

W stworzonej przeze mnie grze w obronę wieży użyłem równania kwadratowego, aby przewidzieć przecięcie, a tym samym celować. Poniższy fragment kodu celowania zakłada, że ​​wróg jedzie ze stałą prędkością i kierunkiem. Zakłada również, że pocisk będzie podróżował ze znaną stałą prędkością (może to być dowolna prędkość, ale musi być znana algorytmowi).

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

Ponieważ określa on także czas uderzenia, po prostu czekałem, aż minie czas na wywołanie grafiki uderzenia w miejscu celu w tym czasie ... nie ma potrzeby wykrywania kolizji w celu ustalenia trafień.

Steve H.
źródło
„nie ma potrzeby wykrywania kolizji w celu ustalenia trafień”. - Jeśli cele są ograniczone do utrzymania ich prędkości i kierunku. --- Jeśli jednak gracz ma aktywną AI lub, co gorsza, jest graczem i może poruszać się po wystrzeleniu strzelca, to oparcie trafień na czasie zamiast wykrycia kolizji doprowadzi do tego, co twoja baza graczy będą postrzegane jako pewne paskudne błędy / usterki.
XenoRo,
@ TheLima tak, tak jak napisano w drugim zdaniu odpowiedzi. ;-)
Steve H
Jest to prawie idealne dla mojego scenariusza, ale jak byś wziął pod uwagę te dwie dodatkowe zmienne: przyspieszenie pocisku, ruch samej wieży?
Jack
Co to ajest 0? Spowoduje to podział przez zero wyjątku, ale co to oznacza w odniesieniu do zmiennej t? czy należy to uznać za „bardzo dużą liczbę”, czy jaki byłby najlepszy przypadek?
firelynx
Czy kryje się za tym dobra książka? Ciekawe, skąd wiedziałeś, aby szukać tej matematyki ...
Davididkomer,
4

wprowadź opis zdjęcia tutaj

Sztuczna inteligencja, położenie celu podczas wystrzeliwania pocisku, a ostateczne położenie celu w punkcie śmierci tworzy trójkąt. Oto, co powinieneś już wiedzieć:

  1. Długość boku a, która jest prędkością pocisku
  2. Długość boku b, która jest prędkością docelową
  3. Kąt ruchu celu ruchu celu.

Masz trzy części trójkąta, przypadek SSA, więc rozwiąż go w ten sposób

  1. Znajdź kąt B na podstawie kąta ruchu i położenia AI
  2. Użyj prawa sinusów, aby znaleźć kąt A

Kąt A powinien umożliwiać określenie kąta, pod jakim pocisk powinien zostać wystrzelony.

tyjkenn
źródło