Rotar objeto para enfrentar jugador

8

Esta es probablemente una simple pregunta vectorial, pero no estoy seguro de cómo hacerlo.

Tengo un objeto en posición vectorial (ox,oy). Potencialmente, en cada actualización, el usuario recorre la pantalla y estará en posición (px,py)en cualquier momento. ¿Cómo hago para que el objeto esté siempre orientado hacia el jugador? Necesito obtener el ángulo en grados.

Esto es con lo que he estado jugando, pero la dirección no señala inmediatamente dónde está ubicado el usuario. En cambio, se incrementa lentamente en la dirección en que camina el usuario.

 objVec.Normalize(); 
 playerVec.Normalize();

 obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));

Podría estar haciendo esto completamente mal, por lo que cualquier ayuda es apreciada.

XSL
fuente
posible duplicado de Orientar un modelo para enfrentar un objetivo
Nicol Bolas

Respuestas:

13

Piensa en el problema de manera diferente. Desea oponerse siempre a "enfrentar" al jugador, lo que significa que desea que su vector "hacia adelante" girado sea paralelo al vector de sí mismo al jugador. Suponiendo que su vector "directo" está normalmente en obj.Rotation = 0, la rotación adecuada es básicamente el arcotangente de Vector2.Subtract(playerPos, objectPos). La mayoría de las bibliotecas de matemáticas tendrán algo como atan2eso, toma dos argumentos o uno Vector2que determinará automáticamente el cuadrante adecuado para usted.

EDITAR: Me di cuenta de que estás en C # y estas son en realidad clases integradas. Para que no tenga que ir a buscar documentación de la biblioteca de matemáticas, yo puedo hacerlo por usted. El código correcto debería ser:

Vector2 facingVec = playerVec - objVec;
obj.Rotation = MathHelper.ToDegrees((float)Math.Atan2(facingVec.Y, facingVec.X));

Tenga en cuenta la inversión X / Y; para las pasas histéricas, Atan2 siempre tiene los argumentos invertidos.

Paul Z
fuente
Gracias, eso funciona. Creo que lo intenté antes, pero una vez que eliminé la Normalización, funcionó.
XSL
1
Es tentador normalizar cada vector con el que te encuentras, pero no siempre es una buena idea. Desea asegurarse de mantener clara la diferencia entre una posición y una dirección; las direcciones pueden normalizarse de manera segura, pero las posiciones nunca deberían serlo. En este caso, objVec y playerVec son claramente las posiciones de las entidades respectivas, y nunca deben normalizarse.
Paul Z
99
¿Quiénes son estas pasas histéricas de las que hablas? Son deliciosos?
Olhovsky