Encontrar la velocidad correcta para que la IA gire para alcanzar la meta

10

Tengo un barco que viaja a la velocidad máxima maxSpeedy puede girar rotationSpeedgrados por segundo. El barco siempre se mueve en la dirección que está mirando, lo que significa que cuanto más rápido viaja, mayor es su radio de giro.

Sé mi posición, y la rotación y la posición del objetivo.

Lo que me gustaría saber es si un objetivo está dentro de mi radio de giro a esta velocidad, o mejor, cuál es la velocidad máxima a la que puedo viajar para poder girar hacia el objetivo sin girar continuamente alrededor de él.

¿Hay una manera eficiente (ish) de hacer esto?

Esto es lo que estoy pensando hasta ahora: como sé lo lejos que estoy viajando por paso y cuánto estoy girando por paso, puedo averiguar dónde estaré en los próximos dos cuadros. Mi posición actual es p1, mi próxima posición es p2 y luego p3. Puedo tomar las bisectrices perpendiculares de (p1, p2) y (p2, p3). Su punto de intersección me dará el centro de un círculo. Entonces puedo probar si el objetivo está en ese círculo.

No estoy seguro de si esto funcionará en 3D (no estoy seguro de cómo calcular una esfera con mis entradas). Esta solución tampoco ayuda demasiado a encontrar la velocidad correcta para viajar, tendría que intentarlo varias veces con diferentes velocidades para encontrar una razonable.

¿Alguien puede arrojar algo de luz sobre una mejor solución?

Weichsem
fuente

Respuestas:

17

Hay dos formas en que una unidad controlada por IA con una velocidad de rotación limitada y una velocidad de movimiento ajustable podría alcanzar una meta.

Primero, consideremos el desafío que se nos presenta para que podamos entenderlo mejor:

ingrese la descripción de la imagen aquí

Si el jugador se mueve y gira a velocidades constantes mientras intenta alcanzar una meta que está en su lado derecho o izquierdo, se moverá en círculos para siempre, sin enfrentar nunca su objetivo. Las dos áreas que el jugador rodeará están marcadas en rojo arriba.

El área circular marcada en rojo se puede calcular así:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Esto da como resultado la posición y el radio de los círculos rojos. Podemos usar esto para determinar si un cierto objetivo está fuera del alcance de la unidad controlada por IA si continúa girando hacia la dirección del objetivo.

Para averiguar si cierto elemento está dentro de uno de los círculos, simplemente calculamos la distancia desde el centro de los círculos:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Hay dos posibles soluciones para esto:

1)

Acumule cierta distancia hasta que el objetivo esté fuera del área roja circular y luego gire en forma de U como si fuera un giro. Esto es simple, deje que la unidad siga moviéndose hasta que la verificación devuelva que el objetivo no está dentro de este círculo. Entonces puedes darte la vuelta.

ingrese la descripción de la imagen aquí

La otra opción requiere un poco más de trabajo para calcular:

Trazamos una línea imaginaria entre la unidad de IA y el objetivo. Usando el ángulo entre ellos:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Ahora debe hacer lo siguiente para calcular la velocidad correcta:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

ingrese la descripción de la imagen aquí

Para que funcione en el caso 3d:

Encuentre el plano en el que residen los siguientes tres puntos:

  1. El punto de gol.
  2. La posición de la unidad AI en el cuadro anterior.
  3. La posición actual de la unidad AI.

Podrías usar ese plano para calcular la velocidad en la 2ª forma. Solo necesita convertir los puntos de sus valores 3D a los valores 2D incrustados en su plano común.

Es posible que desee usar esto:

¿Cómo convertir un punto 3D en un plano a coordenadas UV?

AturSams
fuente
¡Perfecto! ¡Exactamente la respuesta que esperaba! Gracias por sus explicaciones detalladas, creo que puedo extrapolar sobre esto y usarlo en 3D.
weichsem
@weichsem Actualicé la respuesta. La idea que sugerí es encontrar un plano 2D común que compartan y usarlo para calcular la velocidad correcta.
AturSams