Estoy haciendo un pequeño simulador de dirección usando el algoritmo de boid de Reynolds. Ahora quiero agregar una función para evitar la pared. Mis paredes están en 3D y se definen usando dos puntos como ese:
---------. P2
| |
P1 .---------
Mis agentes tienen una velocidad, una posición, etc.
¿Podría decirme cómo evitar con mis agentes?
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;
}
Luego uso todas las fuerzas devueltas por mis funciones boid y lo aplico a mi agente.
Solo necesito saber cómo hacer eso con mis paredes.
Gracias por tu ayuda.
ai
steering-behaviors
Vodemki
fuente
fuente
Respuestas:
Deje que cada pared ejerza una influencia sobre la velocidad.
Pruebe algo como usar la distancia inversa (o la distancia al cuadrado inversa) desde la pared para determinar la magnitud de la fuerza que cada pared "ejerce", y la normalidad de la pared para determinar la dirección de la fuerza que la pared "ejerce".
Entonces aquí el boid interactúa con 4 paredes. Dado que el producto escalar de los vectores rojos (de centro a pared) es mayor que 0 para 3 de las 4 paredes, esas paredes no ejercerán una fuerza sobre la estructura.
Solo la pared con un vector azul (producto de punto negativo) tendrá una fuerza.
La magnitud de la fuerza debe ser grande con el boid se acerca demasiado a la pared, y la dirección de la fuerza debe estar en la dirección de la flecha negra en la pared (apuntando directamente lejos de la pared).
Si usa
1 / (t+1)
la magnitud de la fuerza, dondet
está la distancia desde la pared, entonces la fuerza será realmente fuerte cuando se acerque a 0, pero se desvanecerá a nada cuando t aumente (observe la escala del eje en el diagrama, no es 0 cuando t = 5, es 0.2). (El t + 1 es para que no obtenga una fuerza / división infinita entre 0 si el boid entra en la pared).Si usa
1/(t^2+1)
, entonces la fuerza es mucho más aguda cerca de la pared, y cae más rápido / más suave.Experimente con él y vea lo que le gusta.
fuente
Si alguien necesita el código, aquí está, no dude en redistribuirlo. He tratado de comentarlo para que sea más comprensible. Basado en la solución de bobobobo .
fuente