Я сделал небольшой симулятор рулевого управления, используя алгоритм Рейнольдса Бойда. Теперь я хочу добавить функцию предотвращения стен. Мои стены в 3D и определены с использованием двух таких точек:
---------. P2
| |
P1 .---------
У моих агентов есть скорость, позиция и т. Д.
Не могли бы вы рассказать мне, как избежать моих агентов?
Vector2D ReynoldsSteeringModel::repulsionFromWalls()
{
Vector2D force;
vector<Wall *> wallsList = walls();
Point2D pos = self()->position();
Vector2D velocity = self()->velocity();
for (unsigned i=0; i<wallsList.size(); i++)
{
//TODO
}
return force;
}
Затем я использую все силы, возвращаемые функциями boid, и применяю их к своему агенту.
Мне просто нужно знать, как это сделать со своими стенами.
Спасибо за вашу помощь.
ai
steering-behaviors
Vodemki
источник
источник
Ответы:
Пусть каждая стена оказывает влияние на скорость.
Попробуйте что-то вроде использования обратного расстояния (или обратного квадрата расстояния) от стены, чтобы определить величину силы, которую "оказывает" каждая стена, и нормали стены, чтобы определить направление силы, которую "оказывает" стена.
Так что здесь бойд взаимодействует с 4 стенами. Поскольку скалярное произведение красных векторов (boid-to-wall-center) больше 0 для 3 из 4 стенок, эти стенки не будут оказывать силы на boid.
Только стена с синим вектором (произведение отрицательных точек) будет иметь силу.
Величина силы должна быть большой, так как штанга оказывается слишком близко к стене, а направление силы должно быть в направлении черной стрелки на стене (указывающей прямо от стены).
Если вы используете
1 / (t+1)
для величины силы, гдеt
расстояние от стены, то сила будет очень сильной, когда приближается к 0, но исчезает ни к чему, когда t становится выше (обратите внимание на масштаб оси на диаграмме, это это не 0 при Т = 5, то 0,2). (Т + 1 такова, что вы не получите бесконечное усилие / деление на 0, если случится, что бид попадет в стену).Если вы используете
1/(t^2+1)
, то сила у стены намного острее и падает быстрее / плавнее.Поэкспериментируйте с этим и посмотрите, что вам нравится.
источник
Если кому-то нужен код, вот он, не стесняйтесь распространять его. Я попытался прокомментировать это, чтобы быть более понятным. Основано на решении бобобо .
источник