Як обчислити вектор перехоплення?


11

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

Привітний корабель хоче потрапити до вогневого поля, щоб битися з ворогом.

Насправді я встановлюю лише прямий вектор для фактичного положення судна, що рухається, і перераховую його на кожен кадр, в результаті чого виникає якась "кругла" смуга польоту.

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

В якості першої та "простої" реалізації було б досить, якщо ми припустимо, що друг може швидко прискорити від 0 до максимуму.

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

Відповіді:


5

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

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

Я виявив, що це працює так добре, що мені не потрібно було виявляти зіткнення для пострілу ... Мені вдалося розраховувати на кожен постріл, який потрапив у око бика, незалежно від відстані / напрямку / швидкості цілі, доки ці фактори залишалися стійкими.


З вашого опису, здається, це те, що я шукаю, принаймні простий спосіб припускати миттєве прискорення до максимальної швидкості. Я детальніше ознайомлюсь із цим увечері. Я припускаю, що Vector.Dot повертає докторський продукт векторів?
NobbZ

Хммм ... я це робив у рубіні зараз, але здається, що щось не так. Кожен раз, коли я намагаюся, викидається виняток, оскільки вираз у sqrt оцінює щось негативне, і тому знаходиться поза межами. Як я можу це впоратися. Вибачте за запитання, але я можу лише скористатися цим, але не розумійте сюди, поки хтось не дасть мені поради.
NobbZ

Приклад із цієї книги: amazon.com/…
Стів Х

1
не знаю, чи це допомагає, але ось якийсь код python, який виконує те саме. moddb.com/mods/wicmw/tutorials/…
Стів H

Гаразд, я все ще не розумію математики дірок позаду, але thx для коду python, документація мені сказала, що якщо всередині sqrt є негативне значення, то мій друг повинен повільно наздогнати. Після налаштування тестових значень я отримую деякі результати. Thx за вашу допомогу.
NobbZ

6

Я пропоную вам розібратися в рульовій поведінці. Особливо переслідування . Вихідний код можна знайти у впровадженні OpenSteer або знайти книгу на зразок " Програмування AI на прикладі " (ISBN 13: 978-1556220784)


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

Так, те, що ви описуєте, - це переслідування. Він не знає цілі. Він робить прогноз, виходячи з поточного місця розташування, швидкості та напрямку "ворогів"
bummzack

Тоді я неправильно зрозумів опис, я детальніше розберуся завтра.
NobbZ

Щойно я закінчив читати документ кілька хвилин тому, переслідуючи НЕ, що я шукаю. Це як моя реальна реалізація, за винятком того, що вона орієнтована на позицію наступного кадру, я все одно повинен перерахувати новий курс на кожен кадр, і курс призводить до деякої кривої. Але я хочу, щоб пряма лінія передбачала, що ворог не змінює швидкості чи курсу, поки обидва не зустрінуться. Якщо це все ще недостатньо зрозуміло, я намагаюся намалювати те, що хочу після роботи. Але дякую за посилання все одно. Я думаю, що можу це використати десь ще в проекті.
NobbZ

@NobbZ Вибачте, моя відповідь не була корисною. Ви можете, відповідно, відредагувати своє запитання, оскільки такі твердження, як: "Я знаю, що у випадку зміни швидкості чи ходу ворога кожен розрахунок повинен бути повторений", можуть ввести в оману .. поведінку рульового керування.
bummzack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.