AI управління для судна з фізичною моделлю


19

Я шукаю ідеї, як реалізувати наступне в 2D просторі. На жаль, я ще мало знаю про AI / пошук шляху / автономне управління.

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

Без фізики це було б просто, просто вкажіть напрямок і йдіть. Але як боротися з існуючим імпульсом і потім зупинятися на місці? Я не хочу безпосередньо змінювати розміщення корабля.

редагувати: Просто щоб зрозуміти, сама математика судна, пов'язана з фізикою, не є проблемою.


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

Відповіді:


15

Погляньте на поведінку керма . Особливо пошук та приїзд можуть бути цікавими для ваших потреб. Ця поведінка також буде діяти, коли деякі інші впливи, такі як вибух, тимчасово змінюють положення кораблів.


+1. Для 2D космічної гри я рекомендував би використовувати поведінку рульового управління як свою основу, а також використовувати один із моїх відповідей як компонент у цьому рамках.
tenpn

Збирався запропонувати те саме подумати, коли я прочитав питання. Я багато використовував поведінку в рульовому керуванні, це легко і дозволяє отримати досить приємний AI / рух.
dotminic

5

Непросто поставитись правильно. У вас є два варіанти, хоча специфіка кожного рішення відрізняється:

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

Емперське рішення. Ви можете використовувати налаштований вручну PID-контролер або фактично записувати гальмівні відстані для свого корабля у вашій фізичній системі: на випробувальному стані гальмуйте корабель від максимальної швидкості до упору, записуючи пройдену відстань та швидкість кожного невеликого кроку. Зберігайте отриманий графік відстані / швидкості в каталозі даних.

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

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


1

Як було сказано раніше, ця ситуація ідеально підходить для поведінки в рульовому управлінні, але я хотів би трохи продовжити її. Поведінка Arrive була б ідеальною для цього сценарію. Ви також можете взяти до уваги перешкоди. Тут ви також можете скористатися поведінкою уникнення перешкод.

На жаль, http://www.red3d.com/cwr/steer/ не надає вихідний код для поведінки. Однак програмування Ігри AI на прикладі робить і пояснює поведінку в легко зрозумілих шматках. Якщо ви не можете отримати книгу, ви завжди можете отримати вихідний код тут: http://www.wordware.com/files/ai/

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

Вихідний код, з яким я пов’язаний, також пропонує три різні методи комбінування цих рульових дій разом.

Сподіваюся, що це допомагає.


Посилання red3d.com не надає джерела безпосередньо , але на цій сторінці є посилання на OpenSteer ( opensteer.sourceforge.net ), яке є реалізацією рухового поведінки з відкритим кодом.
bummzack

Ах, не знав цього, дякую. Хоча, я подивився на джерело OpenSteer і виявив, що легше подивитися на більш очевидний у вашому особі код, знайдений у книзі Бакленда. Особливо при старті.
Рей Дей

1

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

Я вирішив проблему за допомогою кривої Ерміта . Встановіть p0 та m0 на положення та швидкості вашого корабля, p1 та m1 на своє цільове положення та швидкості. Це передбачає, що ви хочете, щоб судно йшло одну секунду після цілі. Обчисліть другу похідну p (0), яка дасть вам прискорення застосувати до вашого корабля.

Ось код другої похідної (у F #, сподіваюся, ви зможете адаптувати її до обраної вами мови; sq () обчислює квадрат, одиничні лапки не інтерпретуються як лапки, а як символи, вони є частиною ідентифікатора):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

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



-3

Я думаю, що ваш корабель повинен мати такі параметри, як: положення та швидкість.

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

Позиція обчислюється з останньої позиції плюс швидкості * time_step.

Однак з цим може бути важко здійснити зупинку на цілі.


3
-1 Здається, що Петтері Хіетавірта знає, як користуватися базовою фізичною системою. Отже, ваша відповідь на це питання полягає в тому, що зупинитись на цілі занадто складно?
AttackingHobo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.