Як обчислити кут і швидкість пострілу для удару рухомої цілі?


11

Я розробляю 2D гру Android, і я створюю алгоритм націлювання для AI снарядів для ударів по ворогах або слідом, або вільним рухом. Наразі він просто розраховує, де буде мета на відстані після відстані, і вистрілює снаряд для зустрічі на цій відстані. Звичайно, це означає зміну швидкості снаряду для досягнення мети.

Хтось має поради щодо простого алгоритму іші (оптимально-іш) для розрахунку, коли снаряд повинен стріляти і куди він повинен прицілитися, якщо він може рухатись лише з постійною швидкістю? Скажіть, снаряд іде вдвічі швидше від цілі?

Єдиний спосіб, який я можу придумати, включає пошук і здається досить великим.



@JohnMcDonald: не дуже пов'язане з огляду на те, що йдеться про параболічні снаряди, не лінійне. Це набагато ближче: gamedev.stackexchange.com/questions/4995 / ...
e100

Відповіді:


13

У грі на захист башти, яку я зробив, я використовував квадратичне рівняння для прогнозування перетину і, таким чином, цілі точки. Наступний фрагмент коду цілі передбачає, що противник рухається з постійною швидкістю та напрямком. Він також передбачає, що снаряд рухатиметься з відомою постійною швидкістю (може бути будь-якої швидкості, але повинен бути відомий алгоритму).

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

Оскільки це також визначає час удару, я просто дочекався, коли час, що вставлений, викликати графіку удару у позицію цілі в той час ... не було потреби виявлення зіткнення для визначення влучень.


"для визначення ударів не потрібно виявляти зіткнення." - Якщо ціль (и) обмежені у підтримці своєї швидкості та напрямку. --- Якщо ж у них активний AI, або ще гірше, він є гравцем, і він може рухатися після того, як стрілець вистрілив, то базування своїх ударів вчасно, а не виявлення зіткнення призведе до того, що ваша база гравця сприйме як деякі неприємні помилки / глюки.
XenoRo

@TheLima yup, як це сказано у другому реченні відповіді. ;-)
Стів Х

Це майже ідеально підходить для мого сценарію, але як би ви врахували ці 2 додаткові змінні: прискорення для снаряду, рух самої вежі?
Джек

Що aтаке 0? Це дасть поділ за нульовим винятком, але що це означає з точки зору змінної t? чи слід вважати це "дуже великою кількістю" або що було б найкращим?
firelynx

Чи є за цим гарна книга, яка впадає в інтуїцію? Мені цікаво, як ви знали шукати цю математику ...
davidkomer

4

введіть тут опис зображення

ШІ, місце розташування цілі під час вистрілення снаряда, а можливе розташування цілі в точці загибелі утворюють трикутник. Ось, що ви вже повинні знати:

  1. Довжина сторони a, яка є швидкістю снаряда
  2. Бічна довжина b, яка є цільовою швидкістю
  3. Кут руху мішені руху цілі.

У вас є три частини трикутника, справа SSA, тому вирішіть його так

  1. Знайдіть кут В на основі кута руху та місця розташування ШІ
  2. Використовуйте закон синусів, щоб знайти кут А

Кут А повинен дозволяти визначити кут, під яким снаряд повинен бути запущений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.