Je fais un petit simulateur de direction en utilisant l'algorithme Boid de Reynolds. Maintenant, je veux ajouter une fonction d'évitement de mur. Mes murs sont en 3D et définis à l'aide de deux points comme ça:
---------. P2
| |
P1 .---------
Mes agents ont une vitesse, une position, etc ...
Pourriez-vous me dire comment éviter avec mes agents?
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;
}
Ensuite, j'utilise toutes les forces renvoyées par mes fonctions boid et je l'applique à mon agent.
J'ai juste besoin de savoir comment faire ça avec mes murs.
Merci de votre aide.
ai
steering-behaviors
Vodemki
la source
la source
Réponses:
Laissez chaque mur exercer une influence sur la vitesse.
Essayez quelque chose comme utiliser la distance inverse (ou la distance au carré inverse) du mur pour déterminer l'amplitude de la force que chaque mur "exerce" et la normale du mur pour déterminer la direction de la force que le mur "exerce".
Alors ici, le boid interagit avec 4 murs. Étant donné que le produit scalaire des vecteurs rouges (boid-to-wall-center) est supérieur à 0 pour 3 des 4 murs, ces murs n'exerceront pas de force sur le boid.
Seul le mur avec un vecteur bleu (produit scalaire négatif) aura une force.
L'amplitude de la force doit être grande avec le boid trop proche du mur, et la direction de la force doit être dans le sens de la flèche noire sur le mur (pointant directement loin du mur).
Si vous utilisez
1 / (t+1)
pour la magnitude de la force, oùt
est la distance du mur, alors la force sera vraiment forte lorsqu'elle sera proche de 0, mais disparaîtra à zéro lorsque t sera plus élevé (notez l'échelle des axes dans le diagramme, il n'est pas 0 quand t = 5, c'est 0,2). (Le t + 1 est tel que vous n'obtenez pas une force / division infinie par 0 si le boid arrive dans le mur).Si vous utilisez
1/(t^2+1)
, alors la force est beaucoup plus forte près du mur et tombe plus rapidement / plus doucement.Expérimentez avec et voyez ce que vous aimez.
la source
Si quelqu'un a besoin du code, le voici, n'hésitez pas à le redistribuer. J'ai essayé de le commenter pour être plus compréhensible. Basé sur la solution de bobobobo .
la source