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

19

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

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

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

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

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

Ответы:

15

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

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

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

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

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

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

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

tenpn
источник
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.

Однако с этим может быть трудно осуществить остановку на цели.

zacharmarz
источник
3
-1 Похоже, Петтери Хиетавирта знает, как использовать базовую физическую систему. Итак, ваш ответ на этот вопрос заключается в том, что остановиться на цели слишком сложно?
AttackingHobo