Control de IA para una nave con modelo de física

19

Estoy buscando ideas sobre cómo implementar el seguimiento en el espacio 2D. Desafortunadamente, todavía no sé mucho sobre IA / búsqueda de rutas / control autónomo.

Digamos que este barco puede moverse libremente pero tiene masa e impulso. Además, las fuerzas externas pueden afectarlo (explosiones, etc.). El jugador puede establecer un objetivo para la nave en cualquier momento y debe llegar a ese punto y detenerse.

Sin física, esto sería simple, solo apunta a la dirección y ve. Pero, ¿cómo lidiar con el impulso existente y luego detenerse en el acto? No quiero modificar la ubicación del barco directamente.

editar: Solo para dejar en claro, las matemáticas relacionadas con la física de la nave en sí no son el problema.

Petteri Hietavirta
fuente
Espero encontrar un problema similar a esto pronto; Espero ver respuestas a esto.
Bill

Respuestas:

15

Echa un vistazo a los comportamientos de dirección . Especialmente la búsqueda y la llegada pueden ser interesantes para sus necesidades. Estos comportamientos también funcionarán cuando algunas otras influencias, como una explosión, cambien la posición de los barcos temporalmente.

bummzack
fuente
+1. Para un juego espacial en 2D, recomendaría usar comportamientos de dirección como marco y usar una de mis respuestas como componente dentro de ese marco.
Tenpn
Iba a sugerir lo mismo cuando leí la pregunta. He utilizado mucho el comportamiento de la dirección, es fácil y permite una buena inteligencia artificial / movimiento.
dotminic
5

No es un problema fácil acertar exactamente. Tiene dos opciones, aunque los detalles de cada solución varían:

Una solución matemática. Si su sistema de física es lo suficientemente simple, puede crear la forma cerrada para su movimiento y calcular cuándo necesita comenzar a aplicar una fuerza de frenado para detenerse en un punto. Si su fuerza de frenado es constante y no tiene resistencia al aire, esto debería descomponerse en una cuadrática.

Una solución emperical. Puede usar un controlador PID sintonizado a mano o realmente registrar las distancias de frenado para su barco en su sistema de física: en un banco de pruebas, frenar el barco desde la velocidad máxima hasta una parada, registrar la distancia recorrida y acelerar cada pequeño paso de tiempo. Almacene el gráfico de distancia / velocidad resultante en un directorio de datos.

En tiempo de ejecución, reconstruya el gráfico y conecte su velocidad actual y la velocidad objetivo para salir de la distancia. A esta distancia de su punto de destino, debe estar a toda velocidad.

La ventaja de este enfoque es que puede usarlo para frenar exactamente a cualquier velocidad. La desventaja es que si sus frenos tienen que activarse o desactivarse, nunca estará exactamente en la curva.

tenpn
fuente
1

Como se dijo antes, esta situación es perfecta para los comportamientos de dirección, pero me gustaría extenderla un poco. El comportamiento de llegada sería perfecto para este escenario. Es posible que también desee tener en cuenta los obstáculos. Aquí también puede hacer uso del comportamiento para evitar obstáculos.

Lamentablemente, http://www.red3d.com/cwr/steer/ no proporciona el código fuente de los comportamientos. Sin embargo, Programming Game AI by Example hace y explica los comportamientos en fragmentos fáciles de entender. Si no puede obtener el libro, siempre puede obtener el código fuente aquí: http://www.wordware.com/files/ai/

Además, si desea extender su movimiento para incluir pathfinding, puede tener una clase de pathfinder que calcule la ruta (tal vez como una colección de vectores 2D) y use el comportamiento de dirección Path Follow para agregar eso a la mezcla también.

El código fuente al que he vinculado también proporciona tres métodos diferentes para combinar estos comportamientos de dirección.

Espero que ayude.

Ray Dey
fuente
El enlace red3d.com no proporciona fuentes directamente , pero hay un enlace directamente en esa página a OpenSteer ( opensteer.sourceforge.net ) que es una implementación de código abierto de comportamientos de dirección.
bummzack
Ahh no lo sabía, gracias. Sin embargo, miré la fuente de OpenSteer y me resultó más fácil ver el código obvio que se encuentra en el libro de Buckland. Especialmente al comenzar.
Ray Dey
1

Dirigirse hacia una posición no es demasiado difícil, pero personalmente luché por un tiempo con el problema de dirigir hacia una posición y alcanzarla a una velocidad específica, o seguir un camino con limitaciones de velocidad.

Resolví el problema usando una curva de Hermite . Establezca p0 y m0 en la posición y las velocidades de su nave, p1 y m1 en su posición y velocidad objetivo. Esto supone que desea que la nave siga un segundo después del objetivo. Calcule la segunda derivada de p (0), que le dará la aceleración para aplicar a su nave.

Aquí está el código para la segunda derivada (en F #, espero que pueda adaptarlo a su idioma de elección; sq () calcula las comillas cuadradas y simples no interpretadas como comillas sino como caracteres, son parte del identificador):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Tenga en cuenta que si su nave está sujeta a fuerzas externas (por ejemplo, la gravedad de los planetas), tendrá que tener en cuenta eso al calcular el empuje de la aceleración.

Joh
fuente
-3

Creo que tu nave debería tener parámetros como: posición y velocidad.

La velocidad está en la suma de cada cuadro de todas las fuerzas (como gravedad, explosiones, entrada del usuario, etc.) y también puede tener algún tipo de humedad.

La posición se calcula a partir de la última posición más la velocidad * time_step.

Sin embargo, con esto puede ser difícil implementar detenerse en el objetivo.

zacharmarz
fuente
3
-1 Parece que Petteri Hietavirta sabe cómo usar un sistema de física básico. ¿Entonces su respuesta a esta pregunta es que detenerse en un objetivo es demasiado difícil?
AttackingHobo