Управление ИИ на корабле с физической моделью


19

Я ищу идеи, как реализовать следующие в 2D пространстве. К сожалению, я пока мало что знаю об искусственном интеллекте / поиске пути / автономном управлении.

Допустим, этот корабль может свободно двигаться, но у него есть масса и импульс. Кроме того, внешние силы могут повлиять на него (взрывы и т. Д.). Игрок может установить цель для корабля в любое время, и он должен достичь этой точки и остановиться.

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

редактировать: просто чтобы прояснить, физика, связанная с математикой самого корабля не является проблемой.


Я ожидаю, что скоро столкнусь с подобной проблемой; Я с нетерпением жду ответов на это.
Билл

Ответы:


15

Посмотрите на поведение руля . Особенно поиск и прибытие могут быть интересны для ваших нужд. Это поведение также будет работать, когда некоторые другие воздействия, такие как взрыв, временно изменяют положение кораблей.


+1. Для двумерной космической игры я бы порекомендовал использовать поведение рулевого управления в качестве вашей структуры и использовать один из моих ответов в качестве компонента этой структуры.
10

Собирался предложить такую ​​же мысль, когда прочитал вопрос. Я много использовал поведение рулевого управления, это легко и позволяет использовать довольно приятный ИИ / движение.
dotminic

5

Это не легкая проблема, чтобы получить точно право. У вас есть два варианта, хотя специфика каждого решения варьируется:

Математическое решение. Если ваша физическая система достаточно проста, вы можете создать закрытую форму для вашего движения и рассчитать, когда вам нужно начать применять силу торможения, чтобы остановиться в точке. Если ваша сила торможения постоянна и у вас нет сопротивления воздуха, оно должно разложиться на квадратичное.

Эмпирическое решение. Вы можете использовать ПИД-регулятор с ручной настройкой или фактически записать тормозной путь для своего корабля в своей физической системе: на испытательном стенде тормозите корабль с максимальной скорости до остановки, записывайте пройденное расстояние и скорость с каждым небольшим временным шагом. Сохраните результирующий график расстояния / скорости в каталоге данных.

Во время выполнения восстановите график и укажите текущую скорость и целевую скорость, чтобы преодолеть дистанцию. На этом расстоянии от вашей целевой точки вы должны быть в состоянии полного торможения.

Преимущество этого подхода в том, что вы можете использовать его для торможения точно на любой скорости. Недостатком является то, что если ваши тормоза должны включаться или выключаться, вы никогда не будете точно на кривой.


1

Как уже было сказано, эта ситуация идеально подходит для поведения руля, но я бы хотел немного расширить ее. Поведение «Прибытие» идеально подходит для этого сценария. Вы также можете принять во внимание препятствия. Здесь вы также можете использовать поведение по предотвращению препятствий.

К сожалению, http://www.red3d.com/cwr/steer/ не предоставляет исходный код для поведения. Тем не менее, программирование игрового AI на примере делает и объясняет поведение в простых для понимания кусках. Если вы не можете получить книгу, вы всегда можете получить исходный код здесь: http://www.wordware.com/files/ai/

Кроме того, если вы хотите расширить свое движение, чтобы включить нахождение пути, вы можете иметь класс pathfinder, который вычисляет путь (возможно, как набор двухмерных векторов) и использовать режим управления 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.