ИИ для перемещения космических кораблей нестандартной формы (форма влияет на поведение при движении)


15

Я разрабатываю сетевую пошаговую стратегическую игру для космического флота 3D-6DOF, которая в значительной степени зависит от настройки корабля. Позвольте мне немного объяснить игру, так как вам нужно немного узнать об этом, чтобы задать вопрос.

То, к чему я стремлюсь, - это возможность создавать свой собственный флот судов с нестандартными формами и прикрепленными модулями (пропеллеры, балки трактора ...), которые давали бы преимущества и недостатки для каждого корабля, поэтому у вас есть множество различных распределений флота. Например, длинный корабль с двумя гребными винтами в стороне позволил бы кораблю легко вращаться вокруг этой плоскости, большие корабли будут двигаться медленно, если вы не разместите много гребных винтов сзади (следовательно, тратя больше «строительных» точек и энергии при движении, и это будет только быстро двигаться в этом направлении.) Я планирую сбалансировать всю игру вокруг этой функции.

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

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

Я думаю, что такой подход немного скучен. Игрок не хочет возиться с моторами или чем-то еще, вы просто хотите ПЕРЕМЕЩАТЬ и УБИТЬ. Я собираюсь дать игроку команду на эти корабли по назначению и повороту , а затем ИИ рассчитает правильную мощность пропеллера для достижения этого движения и вращения. Привод не обязательно должен быть одинаковым на протяжении всего расчета хода (после того, как были отданы приказы), поэтому было бы здорово, если бы корабли реагировали на движение, регулируя мощность винтов для своих нужд динамически, но это может быть слишком сложно для реализации, и это не нужно для работы игры.

В обоих случаях, как этот ИИ решит, какие винты активировать для достижения наилучшей (или, по крайней мере, не худшей) траектории?

Я подумал о некоторых подходах:

  • Изучение ИИ: Типы кораблей узнают об их движении методом проб и ошибок, корректируют свое поведение с большим использованием и, наконец, становятся «умными». Я не хочу увлекаться ТАКИМ программированием ИИ, и думаю, что это может расстроить игрока (даже если вы можете позволить ему учиться без игры).
  • Предварительно рассчитанное движение временного шага: После создания корабля ВСЕ возможные перемещения рассчитываются для каждой конфигурации винта и мощности для заданного времени дельты. Память интенсивная, некрасивая, плохая.
  • Предварительно рассчитанные траектории: то же, что и выше, но не для каждого дельта-времени, а для всей траектории, которая затем будет установлена ​​в максимально возможной степени. Требует фиксированной конфигурации пропеллера для всей фазы боя и все еще требует большого объема памяти, безобразного и плохого.
  • Непрерывное грубое принуждение: ИИ непрерывно проверяет ВСЕ возможные конфигурации винта на протяжении всей фазы боя, рассчитывает несколько временных шагов и решает, какой из них является наилучшим, основываясь на этом. Против: то, что хорошо сейчас, может быть не так хорошо позже, и это слишком интенсивно использует процессор, уродливо и тоже плохо.
  • Одиночное перебор: То же, что и выше, но только перебор в начале симуляции, поэтому ему требуется постоянная настройка пропеллера на протяжении всей фазы боя.
  • Непрерывная проверка угла: это не метод полного движения, но, возможно, способ отбросить «глупые» конфигурации гребных винтов. Учитывая текущий вектор нормального винта и окончательный, вы можете приблизить мощность, необходимую для винта, на основе угла. Вы должны делать это непрерывно на протяжении всей фазы боя. Я понял это недавно, поэтому я не слишком много думал. Априори, у него есть недостаток «что хорошо сейчас, может быть, не так хорошо потом», и ему нет дела до других гребных винтов, которые могут действовать вместе, чтобы создать лучшую конфигурацию движения.

Я действительно застрял здесь. Есть идеи?


Вы смотрели на поведение руля?
Stonemetal

1
@ Stonemetal уверен. Проблема здесь заключается в том, что поведение рулевого управления обычно моделируется, предполагая полный контроль над положением и вращением объекта и некоторыми ограничениями (или, по крайней мере, это то, что я обнаружил в сети). ИИ здесь не имеет полного контроля над объектом , но только над вещами (пропеллерами), которые заставляют сущность двигаться. У меня проблемы с соединением этих режимов рулевого управления с фактическим движением космического корабля.
KaoD

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

@haoD Я думал что-то вроде того, что ответил ghostonline. Пусть они строят то, что когда-либо, а затем переводят это в ограничения для поведения руля. Хотя из вашего ответа кажется, что рулевое поведение, вероятно, недостаточно гибкое, как есть.
Stonemetal

1
Я знаю, что это очень старое, но то, что вы ищете, называется кинодинамическим планированием движения
mklingen

Ответы:


4

Извините, у вас нет проверенного решения, но разве это не может быть решено математически?

Учитывая любой винт и его смещение от центра масс, вы можете вычислить, в какую плоскость вы можете вращаться.

Для любого движения вы можете использовать 1 или более винтов. Каждый пропеллер может быть запрошен, чтобы увидеть, может ли его плоскость внести вклад в ориентацию цели, сколько усилий потребуется от пропеллера, чтобы внести вклад (пропеллеры вдали от CoM могут использовать меньше энергии, чтобы генерировать больше разворота), и насколько близко это будет достигнуто. Вы к целевой ориентации. Затем вы A * проходите через это пространство поиска, пока не найдете решение с низкой стоимостью, которая может быть наименьшей общей использованной энергией или самым быстрым движением.

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

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

Это очень сложно, но я не вижу серьезных недостатков. Просто много тяжелой работы и настройка номера. :)


Это то, что я искал, математическое решение ... спасибо! Я надеюсь, что это так же просто, как кажется.
КаоД

7

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

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

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

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


Не совсем то, что я искал, но может сделать то, что мне нужно. Upvote за идею :)
kaoD

0

В космосе форма не влияет на движение. Нет воздуха, чтобы тянуть.

Важен корабль и общая масса дополнений. Это более простая проблема силы тяжести массы. Таким образом, вы можете сделать эти расчеты или, поскольку это базовая игра, разработайте систему движений, подобную RPG, как у Traveler.


Добро пожаловать в GD.SE! На этот вопрос уже принят ответ, и его задавали 2 года назад - возможно, вы могли бы ответить на некоторые новые вопросы на сайте.
Полярный

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

@Полярный вопросный плакат здесь. Я нашел его ответ очень интересным! Я рад, что он вернулся, чтобы ответить, и я думаю, что повышение ценности спустя годы - одна из самых ценных частей SO.
2013 года

@ gnoll110 Я могу ошибаться здесь. Ладно, сопротивления нет, но угол, который образует вектор тяги с центром масс, влияет на то, как корабль движется или вращается ... верно? Например: двигатель, находящийся на одной линии с центром масс, перемещается, а перемещение его из центра масс добавит вращающийся компонент к кораблю.
2013 года

@kaoD Извините, если это показалось немного грубым - очевидно, что большая часть SO добавляет ценность позже. Я просто предположил, что он мог бы также ответить на новые вопросы - чем больше вопросов ответили, тем лучше!
Полярный
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.