Auf das Thema antworten  [ 1 Beitrag ] 
Skalierung und Rotation und ihre Tücken 
Autor Nachricht
Administrator
Benutzeravatar

Registriert: Sa 15. Dez 2012, 19:15
Beiträge: 137
Wohnort: Karlsruhe
Mit Zitat antworten
Hallo Leute!

Die Tage habe ich ein paar mathematische Probleme aus meinem Projekt EnergyBowl endgültig lösen können. Dazu gehörten Tücken bei der Rotation, das Errechnen eines Punktes mithilfe eines Winkels und einer Entfernung und die korrekte Berechnung eines Winkels. In diesem Thema geht es um die Tücken bei der Rotation von Bildern.

Gegeben:
Texturname: "rock"
Float für Angabe der Drehung: "angle"
Größe der Textur: 59x59 Pixel
Mittelpunkt: 29,5|29,5
Skalierte Größe: 14x14 Pixel
Position: 400|200
Drehung: 0 - 360

Lösung ohne Skalierung:
Code:
 
spriteBatch.Draw(rock, new Rectangle(400 + 29, 200 + 29, 59, 59), null, Color.Green, MathHelper.ToRadians(angle++), new Vector2(29.5f, 29.5f), SpriteEffects.None, 0);
 

Attribute der Anweisung:
  1. Textur "rock"
  2. Position und Größe
  3. Quell-Rechteck
  4. Einfärbung
  5. Drehung
  6. Mittelpunkt für Drehung
  7. Spezialeffekte
  8. Ebene

Zu 1.: Die Variable rock ist vom Typ Texture2D und ist zu Beginn des Projektes geladen worden.
Zu 2.: Das Bild muss um die 29x29 Pixel verschoben werden, weil die Position nach der Transformation bei der Drehung nicht zurückgesetzt wurde. Deshalb würde dieser Mittelpunkt nun an der Stelle 400|200 stehen. Da allerdings das obere linke Ecke an dieser Position gezeichnet werden soll, muss das Bild noch verschoben werden.
Zu 3.: Die Angabe kann null sein, weil kein Bereich aus der gegebenen Textur für die Zeichnung herausgeschnitten werden soll.
Zu 4.: Geschmackssache.
Zu 5.: Bei jeder Zeichnung wird die Variable um 1 erhöht. Eine Zeile setzt die Variable auf 0 zurück, wenn sie größer als 360 geworden ist. So dreht sich das Objekt während der Darstellung. Die Winkelangabe ist in DEG, also 0-360 (360 ist an sich auch 0, weil an der Stelle der Kreis neu beginnt). Für die Darstellung benötigen wir allerdings Radians (RAD). Die Methode von der Klasse MathHelper rechnet DEG in RAD um. Bei RAD hat der Kreis nicht 0 bis 360 Grad, sondern 0 bis 2 * PI. Dabei ist die eine Hälfte negativ, die andere positiv.
Zu beachten ist, dass 0 Grad DEG oder RAD bedeutet, dass das Objekt nach rechts zeigt. Der Winkel startet auf der positiven X-Achse, wandert über den vierten Quadranten in den Bereich der negativen Y-Achse (nach unten), über den 3. Quadranten dann hinauf in den zweiten und zum Schluss in den ersten. Das alles also im Uhrzeigersinn. Wobei nach 180° DEG dann der negative Bereich für die RAD-Werte beginnt.
Will man, dass 0 Grad DEG oben beginnt, also bei 12 Uhr und nicht bei 3 Uhr, dann muss man ein halbes PI der errechneten Radians-Zahl abziehen. Die meisten Texturen haben ihren Kopf eben oben und nicht rechts. Keine Ahnung was sich die Leute bei C# dabei gedacht haben...
Zu 6.: Der Ankerpunkt in der Textur, an dem sie gedreht werden soll.
Zu 7.: Die Spezialeffekte erlauben eine Spiegelung der Textur.
Zu 8.: Im Beispiel wird nicht mit mehreren Ebenen gearbeitet


Lösung mit Skalierung:
Code:
 
spriteBatch.Draw(rock, new Rectangle(400 + 7, 200 + 7, 14, 14), null, Color.Green, MathHelper.ToRadians(angle++), new Vector2(29.5f, 29.5f), SpriteEffects.None, 0);
 

Folgende Änderung muss nun beachtet werden: Das Objekt muss nun um 7 und nicht um 29.5 verschoben werden, weil die Verschiebung ebenfalls skaliert werden muss. 14 Pixel sind 23,7% von der Originalgröße 59; 23,7% von 29.5 (ursprüngliche Verschiebung) sind 7.


Schöne Grüße,
Magony

_________________
Bei Fragen, Lob, Kritik, Vorschläge, hilfreiche Hinweise oder Alternativvorschläge: Beitrag, neues Thema oder PN.
Für Dinge die diskutiert werden sollten, bitte neues Thema im jeweiligen Forum.
Wenn du nicht weißt wohin: Forum Unsortiert.


Sa 13. Apr 2013, 21:51
Diesen Beitrag melden
Profil Website besuchen
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 1 Beitrag ] 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst neue Themen in diesem Forum erstellen.
Du darfst Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum