Wie zu drehen, skalieren und zu übersetzen einer matrix alle auf einmal in C#?
Okay, das ist etwas, das sollte sein eine einfache matrix-Frage, aber mein Verständnis von Matrizen, die etwas begrenzt ist. Hier ist das Szenario: ich habe eine 1 x 1px sprite, ich will zu skalieren, indem eine gewisse Menge von x und y (unterschiedliche Beträge auf jeder Seite), und dann will ich drehen, dass der sprite durch einen bestimmten Winkel, und dann will ich in der Lage sein, präzise zu positionieren, die ganze Sache (von oben Links oder in der Mitte, macht für mich keinen Unterschied).
Soweit mein code ist vage in der Nähe, aber es neigt dazu, sich durch einige zufällige Menge je nach dem Winkel, ich pass auf.
Ich würde denken, dass dieser es tun würde:
Point center = new Point( 50, 50 );
float width = 60;
float height = 100;
float angle = 0.5;
Vector3 axis = new Vector3( center.X, center.Y, 0 );
axis.Normalize();
Matrix m = Matrix.Scaling( width, height, 0 ) *
Matrix.RotationAxis( axis, angle ) *
Matrix.Translation( center.X, center.Y, 0 );
Aber es neigt zu schrumpfen das Ausmaß der gedreht Zeile Weg nach unten, obwohl ich denke, es ist-Positionierung irgendwie Recht.
Hab ich auch so probiert:
Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
new Vector2( width, height ), new Vector2( center.X, center.Y ),
angle, Vector2.Zero );
Die Zeile sieht genau Recht, mit der exakt richtigen Größe und Form, aber ich kann es nicht positionieren Sie es korrekt an alle. Wenn ich den translationsvektor am Ende des Aufrufs von oben, oder wenn ich eine position mit Sprite.Zeichnen, weder richtig funktioniert.
Dies ist alles in SlimDX. Was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ging nur durch den Schmerz lernen, matrix-transformation, aber mit XNA.
Fand ich diese Artikel zu werden sehr hilfreich für das Verständnis, was passiert. Die Methodenaufrufe sind sehr ähnlich in XNA und die Theorie dahinter sollte es für Sie, auch mit SlimDX.
Aus einen Blick auf deinen code, ich denke, du solltest die übersetzung am Anfang, an den Ursprung, und dann die übersetzung wieder an das Ende, um die endgültige position, aber ich bin immer noch ein bisschen ein Neuling in diesem, wie auch.
Den Auftrag, die ich tun würde, es ist:
Den Grund für das übersetzen auf die Herkunft erste ist, dass Rotationen basieren, die von der Herkunft. Daher drehen Sie etwas über einen bestimmten Punkt, der Ort, der Punkt auf den Ursprung, bevor drehen.
Okay, das wird jetzt zu arbeiten. Hier mein funktionierenden code für diese, im Falle jemand anderes muss es:
Diese ziehen eine abgewinkelte Linie der gewählten Länge, mit einer Dicke gleich der gewählten Dicke (vorausgesetzt, Ihre textur ist ein 1x1-pixel-weiß-Bild). Die Quelle Ort ist, wo die Linie emittiert wird, mit was auch immer Winkel, den Sie angeben (im Bogenmaß). Also, wenn Sie beginnen bei null und die Schrittweite von so etwas wie 0.1 bis Sie auf 2PI, und dann auf 0 zurückgesetzt, Sie haben eine Linie, dreht sich um ein Zentrum wie eine Uhr hand-oder radar-sweep. Dies ist, was ich gesucht habe -- danke an alle, die dazu beigetragen!
Sind Sie drehen sich um die richtige Achse? Ich bin ein Neuling in matrix-Material, aber es scheint mir, dass da der sprite existiert in der x, y-Raum, die Achse des Drehens soll die Z-Achse, also (0,0,1).
Was Sie tun müssen, ist jede transformation ein Schritt zu einer Zeit. Tun Sie das zuerst skalieren ziehen Sie es. Ist es, wo Sie es erwarten. Dann werfen in der das drehen und dann das übersetzen. Dies wird helfen, entdecken Sie falsche Annahmen.
Können Sie auch zeichnen Sie temporäre Hilfslinien ein, um zu helfen, herauszubekommen, wo die Koordinaten sind. Zum Beispiel, wenn Sie tun Ihre stretching und Drehung und erwarten, dass Ihr end-Punkt werden bei 0,0. Zeichnen Sie eine weitere Linie mit einem Endpunkt bei 0,0 und dienen als doppelt überprüfen, um zu sehen, ob das wirklich der Fall ist.
Für Ihr spezielles problem möglicherweise ein problem mit der rotation. Nachdem Sie skalieren und drehen Sie die Linie wird nun aus der Mitte, verursacht Sie Probleme, wenn Sie übersetzen.
Die Allgemeine Lösung ist die Linie zu bewegen zurück zum Ursprung tun alle Vorgänge, bei denen es zu ändern Form oder Orientierung. Danach, weil Sie bei einem bekannt guten Lage können Sie die übersetzung an Ihren Zielort.
REAKTION AUF KOMMENTARE
Wenn die übersetzung ist ein Thema, und Sie verändern das Koordinatensystem, dann Sie müssen schreiben Sie eine Konvertierungs-Funktion zum konvertieren zwischen dem alten system und dem neuen.
Zum Beispiel, wenn Sie drehen 45 Grad. Vor der rotation könnte man auch übersetzen mit 0,1 zu verschieben, bis 1 Zoll. Nach der Drehung, die Sie übersetzen, indem Sie etwa -.70707, .070707 zu verschieben, bis 1 Zoll relativ zum ursprünglichen Koordinatensystem.