¿Cómo se sigue la ruta de IA dentro de un motor de física 2D como Farseer / Box2D?

12

Estoy en el proceso de mover un juego 2D de arriba hacia abajo en el que he estado trabajando en un motor de física de cuerpo rígido adecuado como Farseer. Hasta ahora, acababa de piratear mi propio código de física donde era necesario.

Estoy tratando de aprender la forma correcta de hacer las cosas aquí.

¿Cuál es la forma correcta de hacer que su IA siga un camino establecido una vez que los haya convertido en cuerpos rígidos dentro del motor de física?

Si tengo una ruta de nodos de navegación en mi mapa que necesito que siga la IA, anteriormente simplemente los movería a lo largo de la ruta calculando la siguiente posición en la que deberían estar para el siguiente paso y configurándolos manualmente en esa posición .

Pero ahora son cuerpos rígidos y sujetos a colisiones y cualquier fuerza que pueda golpearlos y sacarlos del camino.

Entonces, para hacer que la IA se mueva, ¿creo que ahora debería aplicarles impulsos / fuerzas? Ya no debería establecer manualmente su posición en cada cuadro.

Así que creo que necesito ir de un mundo determinista donde obligue a la IA a seguir estrictamente un camino hacia un mundo no determinista donde podrían ser golpeados en cualquier dirección si son golpeados y simplemente los empujo hacia el siguiente nodo en el camino para que se muevan.

¿Está bien? ¿Es así como lo hacen otras personas?

Esto plantea algunas preguntas sobre cómo evitar que tu IA se quede atascada en las esquinas del paisaje ahora que no están caminando por un camino preciso, ¿cómo manejan ese tipo de cosas?

¿O es mejor mezclar los dos de alguna manera y hacer que tu IA siga un camino fijo estableciendo su posición manualmente, y solo reaccione a otras fuerzas bajo ciertas circunstancias que puedes controlar fácilmente?

Gracias por cualquier consejo chicos.

TerryB
fuente
1
+1 También estoy bastante interesado en aprender sobre esto.
David Gouveia

Respuestas:

7

Los comportamientos de dirección funcionan muy bien en combinación con un motor de física, ya que generalmente se implementan de manera que devuelven una "fuerza de dirección" que luego se puede aplicar a su cuerpo de física.

Para hacer que una unidad siga una ruta, puede usar Buscar para ir de nodo de ruta a nodo de ruta (asegúrese de evitar el sobreimpulso) y luego usar Llegada al último nodo de su ruta.

En cuanto a sus inquietudes sobre quedarse atascado: modelar el seguimiento de la ruta usando fuerzas debería ser bastante preciso. Tienes razón en que un objeto podría salirse del camino si choca con otro objeto, pero como calcularás una fuerza de dirección en cada actualización, el objeto debería volver a encaminarse de inmediato. Si la desviación de la ruta después de una colisión puede ser enorme, entonces le sugiero que recuerde su última posición cada vez que ocurra una colisión y luego dirija el objeto a esa última posición antes de continuar la ruta normal.

bummzack
fuente
Artículo increíble, gracias por compartir. Me salvó el día
Ricardo Sánchez-Sáez
0

Diría que estás en el camino correcto, quizás quieras ver este artículo:

http://www.policyalmanac.org/games/aStarTutorial.htm

Explica algunos métodos básicos para evitar colisiones y encontrar rutas utilizando el algoritmo A *.

Editar:

Si realmente solo necesita cuál es la mejor manera de impulsar sus objetos en la dirección correcta, entonces debe usar una fuerza (digamos, ForceForce o algo así) apuntando en la dirección de la mejor ruta que encontró utilizando el algoritmo de búsqueda de ruta de su elección

anónimamente
fuente
No creo que ese artículo sea relevante para esta pregunta. El OP no pregunta cómo encontrar la ruta óptima entre dos ubicaciones, sino cómo hacer que un actor siga una ruta que ya calculó, dentro del contexto de una simulación física.
David Gouveia
bueno, cuando lo leo de nuevo veo tu punto,
editaré
:) También cambié el título para aclarar las cosas. Definitivamente interesado en seguir el camino en lugar de encontrar el camino.
TerryB
0

A juzgar por lo que @davidluzgouveia comentó en la publicación de anónimo, mencionaré mi proyecto. Sin embargo, el seguimiento de ruta y la búsqueda de ruta son muy diferentes. La búsqueda de ruta es más de lo que anónimamente estaba publicando, y para la búsqueda de ruta buscaría en el algoritmo de Dijkstra. Para el seguimiento de la ruta, uso completamente mi motor de física de elección. La forma en que lo configuré es que cada ubicación a la que camina una clase de unidad, se configura en su subclase de ruta a través de desplazamientos 2D, sí, son 2D y no 3D, esto se debe a la forma en que configuré mi física en mi juego .

Explicación 3D: cada unidad tiene solo un colisionador principal que está configurado exclusivamente para la colisión con el terreno y los objetos del mundo. Es una forma de cápsula y tiene un radio y una altura programáticamente hablando. Está construido en el centro del modelo y debe extenderse más allá del frente y la parte superior del modelo. Pero también tengo un desplazamiento de la superficie para saber qué tan lejos está del suelo en todo momento, y un flotante de cuánto se permite deslizarse hacia abajo antes de rebotar ligeramente, a la vez. Parece que estoy aplicando algún tipo de solución jodida para un problema de colisión del terreno, pero tengo mis razones.

De todos modos, debe aplicar fuerza a este objeto cápsula, y debe permanecer flotando sobre el suelo en todo momento. Eso no quiere decir que no pueda subir más, solo que no puede bajar más. La razón por la que necesita flotar (en mi caso) es porque en un cuerpo rígido y un motor de física de muñeco de trapo, las patas de mis unidades están animadas por procedimientos. Entonces, al aplicar una fuerza simple a la cápsula, las piernas de mi entidad se reposicionarán solas. ¡También tendrán sus aplicaciones de gravedad separadas! Lo que esto hace es permitir que si mi personaje está inclinado, un pie puede estar a una elevación más baja que el otro.

Así es exactamente como debes hacerlo. A juzgar por lo que estás preguntando eso es. Si desea omitir algunas características, obviamente está bien, especialmente si se trata de un RTS o FPS y nadie verá unidades de pies o se preocupará de todos modos. Pero, en general, la unidad debe tener un objeto de colisión PRINCIPAL que funcione con el movimiento del personaje casi exclusivamente.

Específicamente en 2D: aún debe tener un punto principal, o simplemente algún tipo de referencia, para que el motor lo empuje, es para el movimiento de una unidad. Puede dar a cada unidad una subclase de ruta que tenga algunas ubicaciones a las que debe ir, puede especificarla en el código de nivel (por ejemplo, ubicación1 (x, y) ubicación2 (x, y), etc.) de la mejor manera (no (no sé en qué tipo de juego estás trabajando) probablemente sería especificar ubicaciones en el nivel y hacer que cada unidad las procese en el orden especificado por el nivel y después de que llegue a cada ubicación, haga que reemplace su ubicación deseada con el siguiente al que necesita llegar.

Hay muchas formas de modificarlo, como tener una lista de ubicaciones en primer lugar para cada unidad, ya que esto significaría que no todas las unidades tienen que ir a las mismas ubicaciones. Sin embargo, de la misma manera, también puede hacer esto en el código de nivel (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) lo que sea)

¡Solo unas pocas ideas! Le sugiero que lea la versión 3D a pesar de que es mucho menos relevante.

EDITAR: decidí proporcionar ambos para cualquiera que pueda leer esto (Sí, eso es cierto) ... (Originalmente solo leí tu pregunta y no me di cuenta de que era bastante específica en 2D hasta que la volví a leer>.>)

Joshua Hedges
fuente