Ich mache einen kleinen Lenksimulator mit dem Reynolds-Boid-Algorithmus. Jetzt möchte ich eine Wandvermeidungsfunktion hinzufügen. Meine Wände sind in 3D und werden mit zwei Punkten definiert:
---------. P2
| |
P1 .---------
Meine Agenten haben eine Geschwindigkeit, eine Position usw.
Können Sie mir sagen, wie ich mit meinen Agenten ausweichen kann?
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;
}
Dann benutze ich alle Kräfte, die von meinen Boid-Funktionen zurückgegeben werden, und wende sie auf meinen Agenten an.
Ich muss nur wissen, wie ich das mit meinen Wänden machen soll.
Danke für Ihre Hilfe.
ai
steering-behaviors
Vodemki
quelle
quelle
Antworten:
Lassen Sie jede Wand einen Einfluss auf die Geschwindigkeit ausüben.
Versuchen Sie beispielsweise, den umgekehrten Abstand (oder den umgekehrten quadratischen Abstand) von der Wand zu verwenden, um die Größe der Kraft zu bestimmen, die jede Wand "ausübt", und die Normalen der Wand, um die Richtung der Kraft zu bestimmen, die die Wand "ausübt".
Hier interagiert das Boid also mit 4 Wänden. Da das Punktprodukt der roten Vektoren (Boid-to-Wall-Center) für 3 der 4 Wände größer als 0 ist, üben diese Wände keine Kraft auf das Boid aus.
Nur die Wand mit einem blauen Vektor (negatives Punktprodukt) hat eine Kraft.
Die Stärke der Kraft sollte groß sein, wenn das Boid zu nahe an die Wand kommt, und die Richtung der Kraft sollte in Richtung des schwarzen Pfeils an der Wand sein (der direkt von der Wand weg zeigt).
Wenn Sie
1 / (t+1)
für die Größe der Kraft verwenden, wot
der Abstand von der Wand ist, dann ist die Kraft sehr stark, wenn sie sich 0 nähert, verblasst jedoch zu nichts, wenn t höher wird (beachten Sie die Achsenskala im Diagramm, es ist nicht 0, wenn t = 5 ist, es ist 0,2). (Das t + 1 ist so, dass Sie keine unendliche Kraft / Division durch 0 erhalten, wenn das Boid zufällig in die Wand eindringt).Wenn Sie verwenden
1/(t^2+1)
, ist die Kraft in der Nähe der Wand viel schärfer und fällt schneller / gleichmäßiger ab.Experimentieren Sie damit und sehen Sie, was Ihnen gefällt.
quelle
Wenn jemand den Code benötigt, können Sie ihn hier weitergeben. Ich habe versucht, es zu kommentieren, um verständlicher zu sein. Basierend auf der Bobobobo -Lösung.
quelle