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.
physics
ai
path-finding
movement
Petteri Hietavirta
fuente
fuente
Respuestas:
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.
fuente
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.
fuente
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.
fuente
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):
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.
fuente
Encontré esto recientemente: comportamientos de dirección en JavaScript y procesamiento:
http://shawnldoria.com/works/steering-behaviors.html
fuente
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.
fuente