2009-05-17 8 views
8

Estoy escribiendo una simulación en la que un objeto criatura debería ser capaz de moverse hacia algún otro objeto arbitrario en el entorno, deslizándose por obstáculos en lugar de hacer un pathfinding inteligente. No estoy tratando de tenerlo plan un camino - solo para moverse en una dirección general, y rebotar alrededor de los obstáculos.Pathfinding básico con evitación de obstáculos en un espacio 2D continuo

Es un entorno 2D (vista aérea), y cada objeto tiene un rectángulo delimitador para la detección de colisiones. No hay cuadrícula, y no estoy buscando una solución A *.

No he podido encontrar ningún tutorial sobre este tipo de pathfinding "tonto" basado en colisiones, por lo que podría no estar describiendo esto usando los términos más comunes.

¿Alguna recomendación sobre cómo implementar esto (o enlaces a tutoriales)?

Respuesta

6

Ampliando lo que dijo Guillaume sobre la prevención de obstáculos, una técnica que funcionaría bien para usted es anti-gravity movement. Tratas los obstáculos locales como fuentes puntuales de antigravedad, el destino como gravedad, y tu personaje controlado por computadora se deslizará (¡como el jabón!) Alrededor de los obstáculos para llegar al destino.

+0

En el lado negativo, debe tener un campo antigravedad que sea mayor que el objeto a evitar, de modo que comience a girar antes de que el vehículo se encuentre sobre el obstáculo. Por lo tanto, puedes tener una configuración donde obtienes una aceleración que va directamente contra la deseada (dos obstáculos frente a ti, cancelando cada aceleración lateral y anulando la aceleración hacia adelante a la meta) en el lado positivo, esto haría Trabaja bien contra obstáculos en movimiento. –

+0

Mientras que dos obstáculos teóricamente pueden cancelarse entre sí, en la práctica eso es poco probable e inestable ... solo un pequeño cambio en la posición y te dejas llevar por el obstáculo. Si es un problema, puedes contrarrestarlo con ruido aleatorio. – Paul

+0

La solución antigravedad parece una buena opción en mi caso. Es muy sencillo, y los cálculos son triviales. No necesito garantías de que los agentes alcanzarán los objetivos en el primer intento, por lo que está bien si se bloquean por obstáculos (aunque la aplicación ocasional de fuerzas extra al azar también podría resolver este problema). – kpozin

-1

he publicado un algoritmo de búsqueda de caminos en C# hace un tiempo

Here's the link

se puede tratar de utilizarlo como punto de partida, es decir, se puede modificar la función que comprueba la siguiente celda para ver si se trata de válido para verificar los obstáculos, y podría alimentarlo con intervalos pequeños en lugar de los puntos inicial y final, como varias rutas de mini pahfinding.

(El texto está en español, pero se puede descargar la aplicación desde el enlace situado en la parte superior)

+0

para citar la pregunta original: "No estoy tratando de que planee un camino" –

+0

Eso fue editado después de mi respuesta – juan

+0

_ [Su respuesta está en otro castillo: ¿cuándo una respuesta no es una respuesta?] http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer)_ – MickyD

1

Cada vez que su criatura, viajando en la dirección del vector v, choca con una pared cuya dirección está representada por el vector w, la dirección que necesita para "deslizar" viene dada por el vector que es la proyección de v en w. Este se puede encontrar utilizando

v . w 
--------- w 
|w|*|w| 

donde . es el vector dot product y |w| es la magnitud del vector w (= sqrt(w . w)). Si w es un vector unitario, esto se convierte simplemente

(v . w) w 

Utilizando el vector resultante como la velocidad de su criatura significará su criatura viaja rápidamente cuando se acaba de "pasta" de la pared, y poco a poco cuando golpea la pared casi muerto- en. (Así es como la mayoría de los juegos de disparos en primera persona administran colisiones para el jugador humano.)

Si en cambio quieres que tu criatura viaje siempre a toda velocidad, solo necesitas el signo de v . w - siempre estarás viajando en la dirección que mira la pared (w) o en la dirección opuesta (-w).

El problema que tendrás es cuando tu criatura golpea el muro de forma continua. En ese caso, su vector proyectado será (0, 0), y necesita alguna otra técnica para decidir qué camino tomar (w o -w). El enfoque habitual aquí es A *, aunque esto puede ser innecesario si su entorno posee suficiente estructura.

5

puede combinar dos algoritmo de dirección:

buscan: se aplica una fuerza de dirección en la dirección que es la diferencia entre la velocidad actual y la velocidad deseada hacia el objetivo

Evitación de Obstáculos : anticipa el futuro del vehículo usando una caja cuya longitud es un tiempo constante multiplicado por la velocidad actual del vehículo. Cualquier obstáculo que cruce esta casilla es una posible amenaza de colisión. La amenaza más cercana se elige para evitarla. Para evitar un obstáculo, se aplica una fuerza de dirección lateral opuesta al centro del obstáculo. Además, se aplica una fuerza de frenado (desaceleración). Estas fuerzas varían con la urgencia (la distancia desde la punta de la caja hasta el punto de posible colisión). La dirección varía linealmente, el frenado varía de forma cuadrática.

Puede encontrar más en la página web "Steering Behaviors For Autonomous Characters"

respecto

Guillaume

PD: Este asumen que está utilizando un método de punto/velocidad/aceleración para el movimiento del objeto.

+0

Esto debería haber sido la respuesta. Al menos está basado en conceptos probados usados ​​en juegos AAA. Además, Craig Reynolds es impresionante – MickyD

Cuestiones relacionadas