2011-11-16 11 views
7

Devo pre-impostare questo con I am not never anywhere a una persona di matematica. Il codice che ho trovato in un'altra domanda sembra funzionare un po '... eccetto che fa ruotare l'oggetto che ho posto in un cerchio grande, per lo più fuori dallo schermo.Rotazione di un oggetto attorno a un punto vettore centrale2

Ecco il codice:

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; 
} 

posizione è impostato con un click del mouse in una posizione arbitraria attorno al vettore centrale.

Il centro è il centro (si indovina) dell'oggetto che "luogo" quando clicco. È determinato dividendo semplicemente l'altezza e la larghezza della trama.

L'origine è il vettore2 Sto tentando di ruotare. È impostato staticamente a 384,384.


Come meglio che posso dire, è sempre la distanza tra i due vettori e quindi utilizzando atan2 per determinare l'angolo. Il resto dopo è un mistero per me. Sono consapevole che dovrei imparare cosa fa tutto, e intendo farlo quando vado al college (solo un decennio di ritardo) a partire dalla primavera. Ho provato a leggerli, ma sono perso. Qualsiasi aiuto sarebbe apprezzato.

Inoltre, se si dispone di un buon punto di partenza per il sito di dummies che è possibile consigliare, sarei lieto di leggerlo.

+0

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

risposta

10

Ecco un'alternativa:

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

Non il "tradurre all'origine mondo, ruotare, quindi traduci "bit".

Ruota il "punto" intorno a "origine" con i "radianti di rotazione" indipendentemente da dove l'origine è relativa all'origine del mondo. Il trig avviene nella funzione incorporata 'CreateRotationZ()'. Per vedere come applica il trig, rifletti quel metodo nel framework.

Edit: fissaggio nome della variabile

2

Questo è più semplice con le matrici, anche se la teoria sottostante è forse un po 'più difficile da comprendere, non è necessario conoscere tutto per usarlo (in piedi sulle spalle dei giganti e tutto il resto).

Per ruotare un vettore circa l'origine:

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

Dove è la mia PosComponent.Direction vettoriale e -0.1f è la quantità che vuole ruotare di (in radianti, non gradi).

Poiché si desidera ruotare un vettore attorno a qualcosa di diverso dall'origine, è necessario spostare prima il vettore, quindi ruotare, quindi spostarlo indietro. Questo è fondamentalmente ciò che stai facendo il codice sopra, eccetto per ottenere l'angolo e fare la rotazione usando trig.

facciamo una rotazione:

  1. Si ottiene il punto rispetto all'origine (come nel codice),
  2. poi ruotare sia
    • utilizzando Trig per ottenere l'angolo, manipolarlo quindi ricalcoli il vettore (come nel tuo codice),
    • o usando le matrici (come nel mio codice).
  3. Infine sposta indietro il vettore (come nel codice).

Questa domanda e la mia risposta, potrebbe essere di qualche utilità nella comprensione Trig: Get position of point on circumference of circle, given an angle?