¿Cómo consigo que los agentes de IA se muevan a lo largo de una curva?

12

Actualmente, mi marco de IA muy básico tiene agentes que se mueven a lo largo de un camino irregular formado por una serie de puntos.

ruta de navegación

Lo hacen simplemente moviendo su posición de un punto al siguiente. Cuando alcanzan el siguiente punto, se mueven hacia el siguiente y así sucesivamente. ¿Cómo puedo cambiar esto para que se muevan suavemente a lo largo de una versión curva de la ruta, y cómo genero la curva?

Sir Yakalot
fuente
¿Cómo eligen el siguiente punto?
FxIII
@FxIII lo siento, no vi este comentario antes, ¿quieres decir cómo eligieron un nuevo objetivo de búsqueda o cómo eligieron el siguiente punto en la búsqueda?
SirYakalot

Respuestas:

4

Estás buscando algún tipo de suavizado de caminos. Por supuesto, como señaló Bummzack, también desea asegurarse de que cualquier suavizado de ruta que realice resulte en movimientos legales para sus agentes.

Este artículo de Gamasutra explica casi todo lo que necesita saber, incluido el suavizado de caminos, giros legales y algoritmos de giro realistas y suaves.

Otra alternativa, que es un poco más simple, es usar un comportamiento de Búsqueda con un pequeño círculo / esfera delimitadora para verificar si el agente está en el próximo punto del camino o cerca de él.

Ray Dey
fuente
7

Como ya conoce sus puntos de control, solo necesita actualizar su código de interpolación para usar un algoritmo de curvatura (Hermite o Coseno, por ejemplo).

Estos sitios ofrecen una gran explicación y un código de muestra que debería ayudarlo a comenzar:

Métodos de interpolación de Paul Bourke

Sol :: Tutoriales - Trucos de interpolación

Doug.McFarlane
fuente
Bueno, ¿y si la curva generada golpea de repente un obstáculo?
bummzack
Esto es solo para el movimiento de los agentes, por cuadro. El mismo algo de detección de colisión todavía se aplicaría. Cuando se detecta una colisión, cambie los puntos de control para evitar el objeto (difícil) o comience a usar temporalmente otro movimiento.
Doug.McFarlane
@bummzack es un buen punto, y la respuesta es usar una malla de navegación y suavizar sus curvas en consecuencia, sin embargo, por ahora solo voy a hacer que esto funcione con un simple gráfico de navegación, así que lo resolveré solo suavizando los caminos un poco
SirYakalot
@bummzack: agregue algunos comportamientos de dirección para evitar obstáculos en la parte superior del algoritmo generador de ruta curva.
Imre
0

Voy a ir contra la corriente aquí y sugerir que, en lugar de pregenerar sus curvas, solo lo maneje cuadro por cuadro, usando (por ejemplo) la misma lógica que usaría para crear un recorrido de referencia. -missile .

Esto será mucho más fácil y probablemente más realista porque no necesita casos especiales para cuando hay paredes entre dos puntos: simplemente maneja la detección de colisiones como de costumbre.

La desventaja es que el movimiento se verá subóptimo. El objeto siempre tomará la ruta más directa de un punto de referencia al siguiente, lo que significa que, a diferencia de una spline, no comenzará a girar hacia el punto de referencia 3 hasta que ya haya pasado el punto de referencia 2. Dependiendo de su situación, esto puede o no sea ​​reparable ajustando sus puntos de referencia (si es incluso un problema).

BlueRaja - Danny Pflughoeft
fuente
1
Esto sería esencialmente un comportamiento de Búsqueda que sugerí.
Ray Dey
0

El buscador de ruta debe proporcionarle la ruta y no debe modificarla. Creo que es posible modificar el algoritmo del buscador de ruta para tener en cuenta que la ruta con curvas cerradas es mejor que aquellas con curvas suaves, como ya ocurre con la ruta larga frente a las curvas cortas.

Publicaré aquí alguna solución si puedo encontrar un momento para pensarlo profundamente, pero creo que este es el camino a seguir.

FxIII
fuente