Я ищу идеи, как реализовать следующие в 2D пространстве. К сожалению, я пока мало что знаю об искусственном интеллекте / поиске пути / автономном управлении.
Допустим, этот корабль может свободно двигаться, но у него есть масса и импульс. Кроме того, внешние силы могут повлиять на него (взрывы и т. Д.). Игрок может установить цель для корабля в любое время, и он должен достичь этой точки и остановиться.
Без физики это было бы просто, просто укажи направление и иди. Но как бороться с существующим импульсом, а затем останавливаться на месте? Я не хочу напрямую менять расположение корабля.
редактировать: просто чтобы прояснить, физика, связанная с математикой самого корабля не является проблемой.
physics
ai
path-finding
movement
Петтери Хиетавирта
источник
источник
Ответы:
Посмотрите на поведение руля . Особенно поиск и прибытие могут быть интересны для ваших нужд. Это поведение также будет работать, когда некоторые другие воздействия, такие как взрыв, временно изменяют положение кораблей.
источник
Это не легкая проблема, чтобы получить точно право. У вас есть два варианта, хотя специфика каждого решения варьируется:
Математическое решение. Если ваша физическая система достаточно проста, вы можете создать закрытую форму для вашего движения и рассчитать, когда вам нужно начать применять силу торможения, чтобы остановиться в точке. Если ваша сила торможения постоянна и у вас нет сопротивления воздуха, оно должно разложиться на квадратичное.
Эмпирическое решение. Вы можете использовать ПИД-регулятор с ручной настройкой или фактически записать тормозной путь для своего корабля в своей физической системе: на испытательном стенде тормозите корабль с максимальной скорости до остановки, записывайте пройденное расстояние и скорость с каждым небольшим временным шагом. Сохраните результирующий график расстояния / скорости в каталоге данных.
Во время выполнения восстановите график и укажите текущую скорость и целевую скорость, чтобы преодолеть дистанцию. На этом расстоянии от вашей целевой точки вы должны быть в состоянии полного торможения.
Преимущество этого подхода в том, что вы можете использовать его для торможения точно на любой скорости. Недостатком является то, что если ваши тормоза должны включаться или выключаться, вы никогда не будете точно на кривой.
источник
Как уже было сказано, эта ситуация идеально подходит для поведения руля, но я бы хотел немного расширить ее. Поведение «Прибытие» идеально подходит для этого сценария. Вы также можете принять во внимание препятствия. Здесь вы также можете использовать поведение по предотвращению препятствий.
К сожалению, http://www.red3d.com/cwr/steer/ не предоставляет исходный код для поведения. Тем не менее, программирование игрового AI на примере делает и объясняет поведение в простых для понимания кусках. Если вы не можете получить книгу, вы всегда можете получить исходный код здесь: http://www.wordware.com/files/ai/
Кроме того, если вы хотите расширить свое движение, чтобы включить нахождение пути, вы можете иметь класс pathfinder, который вычисляет путь (возможно, как набор двухмерных векторов) и использовать режим управления Path Follow, чтобы добавить это и в микс.
Исходный код, на который я ссылаюсь, также предоставляет три различных метода комбинирования этих способов управления.
Надеюсь, это поможет.
источник
Направление к позиции не слишком сложно, но я лично некоторое время боролся с проблемой поворота к позиции и достижения ее на определенной скорости или следования по пути с ограничениями скорости.
Я решил проблему, используя кривую Эрмита . Установите p0 и m0 для положения и скорости вашего корабля, p1 и m1 для вашей целевой позиции и скорости. Это предполагает, что вы хотите, чтобы корабль следовал через одну секунду после цели. Вычислите вторую производную от p (0), которая даст вам ускорение, применимое к вашему кораблю.
Вот код для второй производной (я надеюсь, что в F # вы можете адаптировать его к своему языку по выбору; sq () вычисляет квадрат, одинарные кавычки не интерпретируются как кавычки, а как символы, они являются частью идентификатора):
Обратите внимание, что если ваш корабль подвергается воздействию внешних сил (например, гравитации от планет), вам придется учитывать это при расчете тяги от ускорения.
источник
Обнаружил это недавно - управление поведением в JavaScript и обработке:
http://shawnldoria.com/works/steering-behaviors.html
источник
Я думаю, что ваш корабль должен иметь такие параметры, как: положение и скорость.
Скорость в каждом кадре равна сумме всех сил (таких как сила тяжести, взрывы, пользовательский ввод и т. Д.) И может также иметь некоторую влажность.
Позиция рассчитывается исходя из последней позиции плюс скорость * time_step.
Однако с этим может быть трудно осуществить остановку на цели.
источник