2016-06-10 29 views
2

Ich habe versucht, einen verzögerten Rotationseffekt mit den richtigen Analogsticks zu erzeugen. Der folgende Code nimmt den Winkel basierend auf dem Eingang des rechten Analogsticks und bringt das Objekt stetig näher. Da atan2 ein Bereich von -pi bis pi ist, begünstigt die sich ändernde Rotation immer die Bewegung von 0 rad im Gegensatz zu pi. Gibt es eine Möglichkeit, den Winkel in die entgegengesetzte Richtung zu bewegen?Verwenden von atan2 für verzögerte Rotation

private void Angle() 
    { 
     //Angle to go to 
     RotationReference = -(float)(Math.Atan2(YR, XR)); 

     //Adds on top of rotation to steadily bring it closer 
     //to the direction the analog stick is facing 
     Rotation += (RotationReference - Rotation) * Seconds *15; 
     Console.WriteLine(RotationReference); 
    } 

Edit:

Ich versuchte InBetween vorgeschlagenen Methode, die den Übergang zwischen 2 Pi auf 0 ein Problem verursacht hat. Das hat mich dazu gebracht, etwas anderes zu versuchen. Ich habe keine Ahnung, warum es nicht funktioniert.

private void Angle() 
    { 
     //Angle to go to 
     RotationReference = -(float)(CorrectedAtan2(YR, XR)); 

     //Adds on top of rotation to steadily bring it closer 
     //to the direction the analog stick is facing 
     if (Math.Abs(RotationReference - Rotation) > Math.PI) 
      Rotation += ((float)(RotationReference + Math.PI * 2) - Rotation) * Seconds * 15; 
     else Rotation += (RotationReference - Rotation) * Seconds *15; 
     Console.WriteLine(RotationReference); 
    } 

    public static double CorrectedAtan2(double y, double x) 
    { 
     var angle = Math.Atan2(y, x); 
     return angle < 0 ? angle + 2 * Math.PI: angle; 
    } 

Die Idee dahinter ist, dass, wenn Sie mehr als 180 Grad reisen müssen Sie den Winkel machen auf mehr als 360 Grad zu reisen. Dies sollte die Notwendigkeit zum Umkehren der Richtung beseitigen.

+0

Ich denke, das Stichwort, das Sie hier suchen, ist Tweening. – craftworkgames

Antwort

0

Nach einigen Experimenten ich es geschafft, damit es funktioniert. Danke InBetween für die CorrectedAtan2-Methode. Die for-Schleife wird verwendet, um alle Instanzen zu durchlaufen, in denen Sie pi hinzufügen müssen, um den ruckartigen Übergang zu vermeiden.

private float Angle(float y, float x) 
    { 
     //Angle to go to 
     RotationReference = -(float)(CorrectedAtan2(y, x)); 

     for (int i = 0; i < 60; i++) 
     { 
      if (Math.Abs(RotationReference - Rotation) > Math.PI) 
       RotationReference = -(float)(CorrectedAtan2(y, x) + 
        (Math.PI * 2 * i)); 
     } 
     //Adds on top of rotation to steadily bring it closer 
     //to the direction the analog stick is facing 
     return Rotation += (RotationReference - Rotation) * Seconds * 15; 
    } 

    public static double CorrectedAtan2(double y, double x) 
    { 
     var angle = Math.Atan2(y, x); 
     return angle < 0 ? angle + 2 * Math.PI: angle; 
    } 
0

korrigieren Sie einfach den Winkel im [0, 2·pi] Bereich passen:

public static double CorrectedAtan2(double y, double x) 
{ 
    var angle = Math.Atan2(y, x); 
    return angle < 0 ? angle + 2 * Math.PI : angle; 
} 
+0

Ich habe etwas Ähnliches versucht (obwohl Ihr Code besser ist als meiner.) Allerdings wird dadurch das Problem umgekehrt, wenn wieder von 2PI zurück auf Null gegangen wird. Die einzige Lösung, die ich mir vorstellen kann, würde bedeuten, Radianten kleiner als Null und größer als 2PI zu verwenden, wodurch der unbeholfene Übergang von 2PI zu Null beseitigt wird. Meine begrenzte Programmiererfahrung verhindert leider, dass ich weiß, wie das geht. Danke für Ihre Hilfe übrigens. –