Estoy trabajando en algún movimiento AI donde no hay obstáculos y el movimiento está restringido al plano XY. Estoy calculando dos vectores, v , la dirección de orientación del barco 1 yw , el vector que apunta desde la posición del barco 1 al barco 2.
Luego estoy calculando el ángulo entre estos dos vectores usando la fórmula
arccos((v · w) / (|v| · |w|))
El problema que tengo es que arccos
solo devuelve valores entre 0 ° y 180 °. Esto hace que sea imposible determinar si debo girar a la izquierda o derecha para enfrentar la otra nave.
¿Hay una mejor manera de hacer esto?
Mathf.DeltaAngle()
.Respuestas:
Es mucho más rápido usar un producto cruzado 2D. No hay una función trigonométrica costosa involucrada.
Si aún necesita los ángulos reales, le recomiendo usar
atan2
.atan2
le dará el ángulo absoluto de cualquier vector. Para obtener el ángulo relativo entre cualquiera de los vectores, calcule sus ángulos absolutos y use una resta simple.fuente
arccos
. De esta manera solo usará una función trigonométrica, pero aún tendrá el ángulo real. Sin embargo, recomiendo esta optimización hasta que esté seguro de que el seguimiento del ángulo AI está teniendo un impacto notable en el rendimiento de su juego.if( cross == -0.0f )
vs seif( cross == 0.0f )
ve extremadamente frágil.Utilice arcsin del producto cruzado 2D (es decir, el componente z del vector del producto cruzado). Eso le dará -90 a 90, lo que le permitirá saber si debe ir hacia la izquierda o hacia la derecha.
Tenga cuidado porque A cross B no es lo mismo que B cross A.
Otra estrategia (pero probablemente no tan directa) es calcular el "rumbo" de los dos vectores usando atan2 y luego averiguar si A apuntando a X grados necesita ir a la izquierda o derecha para ir a B apuntando a y grados.
fuente
Usa vectores para redirigir la nave. Así es como funcionan los "comportamientos de dirección": nunca necesita calcular el ángulo, solo use los vectores que tiene. Esto es computacionalmente mucho más barato.
El vector
w
(vector del Barco 1 al Barco 2) es toda la información que necesita. Modifique el vector de velocidad del barco 1 o el vector de aceleración del barco 1 (o incluso el vector de rumbo directamente) utilizando una versión ponderada dew
.La magnitud de cuán lejos del barco 1 está fuera de curso (qué tan mal v no coincide con w) se puede encontrar usando (
1 - dot(v,w)
)dot(v,w)
se maximiza cuandov
y sew
alinea exactamente)1 - dot(v,w)
) da 0 cuandov
yw
están completamente alineados, siemprev
y cuandow
están normalizados)fuente
Hay una manera simple de encontrar el ángulo absoluto de un vector a través de la geometría normal.
por ejemplo vector V = 2i - 3j;
valor absoluto del coeficiente x = 2;
valor absoluto del coeficiente y = 3;
ángulo = atan (2/3); [el ángulo estará entre 0 y 90]
Según el ángulo del cuadrante se cambiará.
if (coeficiente x <0 y coeficiente y> 0) entonces ángulo = ángulo de 180;
if (coeficiente x <0 e coeficiente y <0) entonces ángulo = 180 + ángulo;
if (coeficiente x> 0 y coeficiente y <0) entonces ángulo = ángulo 360;
if (coeficiente x> 0 y coeficiente y> 0) entonces ángulo = ángulo;
después de encontrar el ángulo del primer y segundo vectores, solo resta el primer ángulo del vector del segundo vector. Entonces obtendrás un ángulo absoluto entre dos vectores.
fuente
Tal vez debería publicar una pregunta ligeramente diferente y responderla yo mismo; Esta es la pregunta más cercana que pude encontrar a la que tenía.
Estoy trabajando en 2D en el lienzo html, donde tengo ángulos de rotación en radianes en lugar de vectores. Necesitaba el "ángulo de giro" (ta) para pasar del "rumbo actual" (h) al "rumbo objetivo" (t).
Aquí está mi solución:
fuente