Я делаю адаптацию классической симуляции Boids 80-х годов на Java. Он работает достаточно хорошо, но я пытаюсь добавить новое правило к поведению, которое заставит агентов избегать прямоугольников (стен), и я не уверен, как это сделать.
Я видел эту ветку:
https://gamedev.stackexchange.com/questions/45381/wall-avoidance-steering
Но меня смущает используемый синтаксис (например, partsList [j] -> normal) в представленном окончательном коде и то, как получить расстояние между агентом и прямоугольником, а также то, как на самом деле отогнать агентов. Однако формула имеет смысл. Может кто-нибудь объяснить мне это? Большое спасибо!
P.S. Я слежу за псевдокодом это, и я также использовал исходный код Java это в качестве ссылки.
Обновлено: Хорошо, я понимаю, почему меня смутил синтаксис, но я все еще в неведении, когда дело доходит до написания правила избегания стен.




Ах, я помню 80-е, а также моделирование boids ...
Обычно в boids-подобных рулевое поведение идея состоит в том, чтобы применить поведенческую «управляющую силу» против скорости (импульса) агента. Таким образом, реализация любого заданного поведения рулевого управления сводится к поиску некоторой геометрической конструкции, которая генерирует вектор, указывающий в том направлении, в котором вы хотите повернуть. В идеале это будут тангенциальные усилия рулевого управления (перпендикулярные текущей скорости), чтобы рулевое управление не зависело от управления скоростью.
В случае избегания стены - а прямоугольник можно представить как четыре стены - общая идея состоит в том, чтобы взять вектор, направленный от стены (перпендикулярно). Используя проекцию (скалярное произведение), вы можете разделить компоненты этой силы, которые являются параллельно и перпендикулярно вектором скорости. Компонент нормали к стене, перпендикулярный скорости агента, представляет собой управляющую силу, которая отворачивает агента от стены.
Другой аспект - знать, когда использовать это поведение избегания стен. Полезный подход - выбрать временной горизонт, скажем, 2 секунды, и решить, ударит ли агент стену за это время. Используя текущее положение, скорость и это значение времени, вы можете сделать простое линейное предсказание того, где будет агент через 2 секунды. Если он пересекает стену в течение этого интервала, то он должен использовать свое поведение избегания стены.
Для получения дополнительной информации найдите «сдерживание» в этом Бумага GDC 99 и / или посмотрите на них: http://natureofcode.com/book/chapter-6-autonomous-agents/https://gamedevelopment.tutsplus.com/series/understanding-steering-behaviors--gamedev-12732
Вы запутались в синтаксисе, потому что связанный поток написан на C++, а не на Java.