Я пытаюсь понять, как реализовать и объединить векторы управления для автономных агентов, как описано Крейгом Рейнольдсом.
Насколько я понимаю, каждое усилие на рулевое управление должно рассчитываться отдельно, а затем все усилия на рулевое управление должны складываться вместе, а затем применяться.
Я понимаю, что каждое управляющее усилие равно желаемой скорости для определенного поведения минус текущая скорость агента.
Я пытаюсь объединить два основных поведения: искать и бежать. Ниже приведены две диаграммы, иллюстрирующие мою проблему.
У меня есть агент, который ищет цель прямо перед собой и убегает от цели под ней. Когда агент находится в состоянии покоя (текущая скорость = 0), управляющие силы для каждого поведения равны их соответствующим желаемым скоростям:
vSteer = vDesired - currentVelocity = vDesired - 0 = vDesired
И комбинированное рулевое усилие направлено вверх и вправо, выделено синим цветом. Примерно этого я и ожидал.
Однако, если агент движется, мы получаем совершенно другой результат. Для простоты предположим, что агент уже движется на максимальной скорости в направлении цели. Таким образом, текущая скорость агента равна желаемой скорости поиска.
Когда текущая скорость агента равна желаемой скорости поиска, то усилие управления поиском равно 0 (vSteer = текущее - желаемое = желаемое - желаемое = 0). Сила управления уклонением тогда равна желаемой скорости уклонения минус текущая скорость, что дает вектор, указывающий НАЗАД! А поскольку усилие руления при поиске равно нулю, общее усилие руления равно усилию руления при беге.
Я заметил эту проблему при попытке реализовать разделяющую силу, которая, по сути, соответствует ситуации, показанной на диаграммах, но с красным крестиком, обозначающим соседнего агента. Чистый эффект заключается в том, что агенты сохраняют разделение, но движутся примерно на половинной скорости, при этом направляющая сила поиска направлена вперед, а направляющая сила бегства направлена назад и от соседа, что в конечном итоге в значительной степени нейтрализует друг друга.
На самом деле не похоже, что какой-либо компонент сил бегства должен указывать здесь назад. Что я неправильно понимаю?
Я не думаю, что вы должны вычитать текущую скорость из каждого отдельного компонента.
Это была и моя первоначальная мысль, но все, что я читал по этому вопросу, прямо говорит, что вы. См. здесь: gamedevelopment.tutsplus.com/tutorials/… В частности, реализация doSeek, расположенная примерно на четверть ниже по странице, возвращает требуемое.вычитание(host.getVelocity())
Спросите себя: «Почему ответ будет другим, если у вас есть две желаемые скорости, а не одна, представляющая собой сумму этих двух?»