2011-11-16 15 views
7

Debo comenzar con esto, no estoy cerca de una persona matemática. El código que he encontrado en otra pregunta parece estar funcionando un poco ... excepto que hace que el objeto que coloco gire en un círculo grande, principalmente fuera de la pantalla.Rotación de un objeto alrededor de un vector central punto

Aquí está el código:

public void Update(GameTime gameTime) 
{ 
    Location = RotateAboutOrigin(Center, Origin, 0.01f); 
} 

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    var u = point - origin; //point relative to origin 

    if (u == Vector2.Zero) 
     return point; 

    var a = (float)Math.Atan2(u.Y, u.X); //angle relative to origin 
    a += rotation; //rotate 

    //u is now the new point relative to origin 
    u = u.Length() * new Vector2((float)Math.Cos(a), (float)Math.Sin(a)); 
    return u + origin; 
} 

ubicación está configurada por un clic del ratón en una posición arbitraria en todo el vector central.

Center es el centro (lo adivinaste) del objeto que coloco cuando hago clic. Se determina simplemente dividiendo la altura y el ancho de la textura.

El origen es el vector2 que estoy intentando rotar. Está establecido estáticamente en 384,384.


Como mejor que puedo decir, se está haciendo la distancia entre los dos vectores y luego usando atan2 para determinar el ángulo. El resto después es un misterio para mí. Soy consciente de que debería aprender todo lo que hace, y tengo la intención de hacerlo cuando vaya a la universidad (solo una década tarde) a partir de la primavera. Intenté leer sobre ellos, pero estoy perdido. Cualquier ayuda sería apreciada.

Además, si tiene un buen sitio de trigonometría para dummies puede recomendarlo, estaré encantado de leerlo.

+0

http://stackoverflow.com/questions/7846775/how-to-gradually-rotate-an-object-to-face-another-turning-the-shortest-distance – Olle89

Respuesta

10

Aquí es una alternativa:

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin; 
} 

Se hace el "se traducen en el origen del mundo, rotar, luego traduce de vuelta "bit".

Esto gira el 'punto' alrededor de 'origen' por 'rotación' radianes, independientemente de donde el origen sea relativo al origen mundial. El nivel trigonométrico ocurre en la función incorporada 'CreateRotationZ()'. Para ver cómo aplica el trig, refleja ese método en el marco.

Editar: la fijación de nombre de variable

2

Esto es más fácil de hacer utilizando matrículas, aunque la teoría subyacente es posiblemente un poco más difícil de entender, realmente no necesita saberlo todo para usarlo (de pie sobre los hombros de los gigantes y todo eso).

Para rotar un vector sobre el origen:

Vector2.Transform(PosComponent.Direction, Matrix.CreateRotationZ(-0.1f)) 

Dónde PosComponent.Direction es mi vectorial y -0.1f es la cantidad que desea girar por (en radianes, no grados).

Dado que desea rotar un vector alrededor de algo que no sea el origen, primero deberá mover el vector, luego girar y luego moverlo hacia atrás. Eso es básicamente lo que estás haciendo con el código anterior, excepto para obtener el ángulo y hacer la rotación usando trig.

Hacer hacer una rotación:

  1. Usted consigue el punto relativo al origen (como en su código),
  2. a continuación, gire ya sea
    • usando trigonométrica para obtener el ángulo, manipularlo luego recalcule el vector (como en su código),
    • o usando matrículas (como en mi código).
  3. Mueva finalmente el vector hacia atrás (como en su código).

Esta pregunta y mi respuesta, podría ser de alguna utilidad en la comprensión trig: Get position of point on circumference of circle, given an angle?

Cuestiones relacionadas