Як обчислити рубіж повороту до ракети?


14

У мене є ракета, яку вистріляють з корабля під кутом, потім ракета повертається до цілі в дузі з заданим радіусом повороту. Як визначити точку на дузі, коли мені потрібно почати поворот, щоб ракета прямувала до цілі?

EDIT

Що мені потрібно зробити, перш ніж запустити ракети, це обчислити та намалювати шляхи польоту. Так, у прикладі прикладу ракет-носій має заголовок у 90 градусів, а цілі - за ним. Обидві ракети запускаються у відносному напрямку -45deg або + 45 градусів до заголовка ракетного апарату. Ракети спочатку повертаються до цілі з відомим радіусом повороту. Я повинен обчислити точку, в якій поворот відводить ракету до напрямку, в якому вона повернеться, щоб безпосередньо атакувати ціль. Очевидно, якщо ціль знаходиться на рівні 45 градусів або близько неї, то початкового повороту ракета просто не спрямована до цілі.

Після запуску ракети на карті також буде показано відстеження ракети на цій лінії як вказівка ​​її шляху польоту.

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

Дві ракети, спрямовані на дві цілі

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


1
Чи заголовок попередньо розрахований чи він змінюється під час траєкторії? (на кшталт самонаведеної ракети?)
Джонатан Коннелл

1
Чи не було б це просто тоді, коли (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, де (x1, y1) поточне положення ракети і (x2, y2) ціль?
Качка комуністична

Можливо, вам слід зробити малюнок того, що ви хочете.
aaaaaaaaaaaa

3
Це 2D або 3D проблема?
Стів Х

Якщо ви шукаєте щось на кшталт самонавіюваної ракети, можете це зробити, не використовуючи жодної тригонометрії. Дивіться це запитання
BlueRaja - Danny Pflughoeft

Відповіді:


9

Моя математика може бути трохи неправильною, тому я відповів на це питання.

Я припускаю, що ви хочете робити сценарій, що постійно наводиться, коли ракета Р1, що рухається зі швидкістю V1, постійно намагається повернутись до гравця Р2; але з обмеженою швидкістю повороту.

  1. Визначте вектор між гравцем та ракетою.

    V2 = P2 - P1
  2. Перетворіть їх у одиничні вектори.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Визначте кут між векторами.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Обмежте значення кута між ними (пам’ятайте, що ваші триггерні функції, ймовірно, працюють з радіанами, тому спробуйте 0,1 як швидкість повороту).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Створіть новий вектор руху.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

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


1
Ммм ... якщо пам'ять служить, я думаю, що вам потрібно зробити перехресний продукт, щоб отримати напрямок кута. Якщо ви просто робите точковий виріб, ви дізнаєтесь величину кута, але не напрямок (оскільки крапкові вироби можуть мати V3 * V4 = V4 * V3, схоже, немає ніякого способу відзначити різницю в орієнтації). Отже, зробіть крапковий добуток, а потім зробіть поперечний добуток - перевіряючи знак координати Z - щоб знайти орієнтацію.
ChrisE

@ChrisE Приклад наведений у 2D (дивлячись на 5.), тому оригінальна орієнтація та величина кута повинні бути достатніми.
Keeblebrox

Розрахунок кута між правильним, але я не впевнений, який ваш заявлений крок 5 - АБО що він створює. Скажімо, на кроці 5 додати кут a до v3, оскільки я не розумію математику.
клоти

Крок 5 @dlots повинен додати новий "обмежений кут повороту" до вектору поточного руху - в основному це змінює напрямок ракети.
Джонатан Дікінсон

Що SIGNна кроці 4?
Даніель Каплан

2

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

Я повинен припустити, що ви можете повернути з однаковим радіусом повороту в усі сторони (це спрощення, яке важко помітити в реальних ракетах).

Найпростішим рішенням є використання вигину на 90 ° : ракета подає файли, поки її траєкторія не утворює прямий кут із ціллю. якщо ви повернете рівно в точку 90 °, ви пропустите ціль точно за радіусом повороту, тому що ви повинні врахувати саме поворот. Рішення полягає в тому, щоб почати точно повертати метри (?) До "90 ° точки", перш ніж досягти точки 90 °, потім повернути, утворюючи дугу на 90 °, щоб перейти прямо до своєї цілі.

Це рішення не завжди можливо, наприклад, коли ви не бачите видимості на шляху 90 ° (будівлі чи інші перешкоди).

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

Скільки раніше? Ось чому речі на 90 ° - це найпростіше рішення ...

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

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... де семант - це зворотний косинус. Доказ тривіальний і залишається читачеві.

Серйозно, формула походить із простої геометричної побудови.

Графік точки повороту

Чорна лінія - це стрілецький шлях, тоді як тонка чорна лінія - це той самий шлях, що рухається до цілі поворотом_радіус; те ж саме для червоних, які є цільовим шляхом.

Зелені сегменти мають поворотну радіацію по довжині, тож ви повинні побачити, що:

AB - дотична 90 ° - θ °

До н.е. - семант.

Обидві зелені лінії, що йдуть від точки повороту, мають довжину повороту_радіус і перпендикулярні до двох контурів; Це означає, що радіус повороту правильний і дуга дотична до обох контурів (як це має бути, якщо ви робите поворот за фізичних обмежень).

Повідомте мене, якщо ви бачите якусь помилку.

Редагувати:

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

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

Після вибору цілі ви можете застосувати те, що я сказав вище, під правильним кутом.


Зверніть увагу, що це не система постійного оновлення. Оскільки самонаведення вимагає більше процесора (багато), це слід враховувати правильний підхід для фіксованих цілей або якщо хтось хоче реалізувати "напівглуху" ракету, звичайно. Траєкторія може бути просто параметризована через t, розбиваючи шлях на 3 субпуті, а дуга може бути апроксимована кривою Безьє.
FxIII

1

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

Працює для 2D і 3D очевидно, оскільки єдиною різницею є додатковий вимір.

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


Проблема використання шпонки тут полягає в тому, що вам потрібно буде постійно оновлювати контрольні точки, якщо ціль рухається. Просте кермове альго тут може бути обчислено дешевше.
ChrisE

Насправді я намагаюся перерахувати шлях до цілі. Те, що я працюю, є тренажером для реального обладнання, і я намагаюся імітувати реальну поведінку обладнання.
Тоні

0

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


2
Ракета в реальному світі, особливо пізніша зброя, має інерційні системи наведення або GPS або обидва в них, щоб вони запрограмовані поїхати в зону пошуку і почати шукати ціль. Горе бетіде, якщо дружнє поруч. Програмування передбачає можливість відправляти ракету в такий спосіб, який дозволяє уникнути дружніх та інших перешкод, таких як наземні маси та невинних сторонніх людей.
Тоні

0

Я думаю, що найпростіший алгоритм буде просто слідувати двом правилам:

  1. Якщо поточна ціль ближче до ракети, ніж діаметр повороту, продовжуйте рухатися прямо. Це дозволяє уникнути орбіти ракети на близьких цілях, а не реально діставатись до них.

  2. В іншому випадку поверніть до цілі, поки ви не вкажете на неї.

Для обчислення точки, де закінчується виток у 2D:

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

  2. Тепер ви можете побудувати прямий кут трикутника з прямим кутом у дотичній та двома відомими точками - P та пунктом призначення. Це дозволяє обчислити відстань від дотичної до цільової точки за допомогою Піфагора. Назвіть це D.

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

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