Як ви робите шлях ШІ, слідуючи в 2d фізиці двигуна, як farseer / box2d?


12

Я зараз пересуваю гру з 2d зверху вниз, над якою працював у належному двигуні фізики тіла, як Farseer. До сих пір я просто ламав разом власний фізичний код, де це було потрібно.

Я намагаюся навчитися правильному способу роботи тут.

Який правильний спосіб змусити AI слідувати заданому шляху, коли ви зробили їх жорсткими тілами всередині двигуна фізики?

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

Але тепер вони є жорсткими тілами і піддаються зіткненням і будь-яким силам, які можуть вдарити їх і вибити їх з шляху.

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

Тому я думаю, що мені потрібно піти з детермінованого світу, де я змушую ШІ суворо слідувати шлях до недетермінованого світу, де вони можуть стукатись у будь-якому напрямку, якщо потраплять, і я просто підштовхую їх до наступного вузла на шляху щоб змусити їх рухатися.

Це так? Так це роблять інші люди?

Це викликає деякі питання про те, як потім уникнути того, щоб ваш ШІ застряг у куточках пейзажу тепер, коли вони не йдуть точним шляхом, як ви, хлопці, впораєтеся з таким видом речі?

Або краще якось змішати це два, і все-таки ваш ШІ піде за фіксованим шляхом, встановивши їх положення вручну, і лише реагуючи на інші сили, за певних обставин ви можете легко контролювати?

Дякую за будь-які поради, хлопці.


1
+1 Мені теж цікаво дізнатися про це.
Девід Гувейя

Відповіді:


7

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

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

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


Дивовижна стаття, дякую за обмін. Врятував мені день.
Рікардо Санчес-Саес

0

Я б сказав, що ви на правильному шляху, ви можете переглянути цю статтю:

http://www.policyalmanac.org/games/aStarTutorial.htm

Він пояснює деякі основні уникнення зіткнень та пошук шляху за допомогою алгоритму A *.

Редагувати:

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


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

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

:) Я змінив назву, щоб очистити речі. Однозначно зацікавлений у слідуванні шляху, а не в пошуку.
TerryB

0

Судячи з того, що @davidluzgouveia прокоментував анонімний пост, я підберу проект. Дослідження шляхів та пошук шляхів дуже різні. Пошук шляху - це більше те, що анонімно публікував, і для пошуку шляху я заглянув у алгоритм Діккстри. Для наступного шляху я повністю використовую вибраний вами двигун фізики. Як я це налаштував, це те, що кожне місце розташування підрозділу класу одиниць встановлюється в його підкласі маршруту через 2D зміщення, так, вони 2D, а не 3D це через те, що я мою фізику налаштував у своїй грі .

3D-пояснення: у кожному блоці є лише один головний колайдер, який призначений виключно для зіткнення з місцевістю та світовими об'єктами. Це форма капсули, має радіус і висоту програмно кажучи. Він побудований в центрі моделі і повинен простягатися прямо повз передню і верхню частину моделі. Але у мене також є зміщення поверхні для того, наскільки воно далеко від землі в усі часи, і поплавок того, наскільки дозволяється ковзати вниз, перш ніж трохи підстрибувати вгору. Це звучить так, що я застосовую якесь викручене виправлення для проблеми зіткнення місцевості, але у мене є свої причини.

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

Саме так ви повинні це зробити. Судячи з того, що ви просите, що це таке. Якщо ви хочете залишити деякі функції, це, очевидно, добре, особливо якщо це RTS або FPS, і ніхто ніколи не побачить одиниці ніг або догляд у будь-якому разі. Але загалом у підрозділі повинен бути один ОСНОВНИЙ зіткнення об'єкт, який працює з рухом персонажа майже виключно.

Зокрема, 2D: Ви все ще повинні мати головну точку чи просто якусь орієнтир, щоб двигун пересувався, що є для руху агрегату. Ви можете дати кожному підрозділу підклас контуру, який має декілька місцеположень, які йому потрібно пройти, ви можете вказати його в коді рівня (наприклад, location1 (x, y) location2 (x, y) і т.д.) найкращим способом (я розумію я не знаю, над якою грою ви працюєте), ймовірно, було б вказати місця на рівні, і кожне підрозділ буде обробляти їх у порядку, визначеному рівнем, і після досягнення кожного місця, чи замінить його бажаним місцем на наступний, до якого потрібно дістатися.

Існує багато способів, як ви могли це змінити, як, наприклад, перелік локацій в першу чергу для кожної одиниці, оскільки це означало б, що не всі одиниці повинні їхати в ті самі місця. Однак, таким же чином, ви можете зробити це і в коді рівня (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) що завгодно)

Всього кілька ідей! Я пропоную вам прочитати тривимірну версію, хоча вона набагато менш актуальна.

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

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