Wie wird eine Matrix in C # gleichzeitig gedreht, skaliert und übersetzt?

8

Okay, das ist etwas, was eine einfache Matrixfrage sein sollte, aber mein Verständnis von Matrizen ist etwas begrenzt. Hier ist das Szenario: Ich habe ein 1px mal 1px Sprite, das ich um einen Betrag x und y skalieren möchte (verschiedene Beträge auf jeder Seite), und dann möchte ich das Sprite um einen Winkel drehen, und dann möchte ich es können genau das ganze Ding positionieren (von oben links oder vom Zentrum, macht für mich keinen Unterschied).

Bis jetzt ist mein Code vage nahe, aber er tendiert dazu, abhängig von dem Winkel, den ich passiere, um einen zufälligen Betrag abgeschaltet zu sein.

Ich würde denken, dass dies das tun würde:

%Vor%

Aber es neigt dazu, den Umfang der gedrehten Linie nach unten zu verkleinern, obwohl ich denke, dass es so richtig positioniert ist.

Ich habe es auch versucht:

%Vor%

Die Linie sieht genau richtig aus, mit der genau richtigen Größe und Form, aber ich kann sie nicht richtig positionieren. Wenn ich den Übersetzungsvektor am Ende des obigen Aufrufs verwende oder wenn ich eine Position mit Sprite.Draw einstelle, funktioniert beides nicht richtig.

Das ist alles in SlimDX. Was mache ich falsch?

    
x4000 11.03.2009, 19:52
quelle

4 Antworten

12

Ich habe gerade den Schmerz durchgelernt, Matrixtransformation zu lernen, aber mit XNA.

Ich fand diese articles sei sehr hilfreich beim Verständnis, was passiert. Die Methodenaufrufe sind in XNA sehr ähnlich und die Theorie dahinter sollte auch für SlimDX gelten.

Wenn ich auf deinen Code schaue, denke ich, du solltest am Anfang, am Ursprung übersetzen und dann am Ende wieder ins Ziel übersetzen, obwohl ich immer noch ein bisschen Neuling bin gut.

Die Reihenfolge, in der ich es tun würde, ist:

  • Zum Ursprung
  • übersetzen
  • Skalieren
  • Drehen
  • Zum gewünschten Ort übersetzen

Der Grund für die erste Übersetzung in den Ursprung ist, dass Drehungen auf dem Ursprung basieren. Um also etwas um einen bestimmten Punkt zu drehen, platzieren Sie diesen Punkt vor dem Drehen auf dem Ursprung.

    
Ben S 11.03.2009, 20:04
quelle
3
___ answer636233 ___

Drehen Sie sich um die richtige Achse? Ich bin ein Neuling im Matrix-Zeug, aber es scheint mir, dass, da das Sprite im x, y-Raum existiert, die Rotationsachse die Z-Achse sein sollte - d. H. (0,0,1).

    
___ qstnhdr ___ Wie wird eine Matrix in C # gleichzeitig gedreht, skaliert und übersetzt? ___ answer637186 ​​___

Okay, das funktioniert jetzt. Hier ist mein Arbeitscode dafür, falls jemand anders es braucht:

%Vor%

Dies wird eine gewinkelte Linie Ihrer gewählten Länge zeichnen, mit einer Dicke, die Ihrer gewählten Dicke entspricht (vorausgesetzt Ihre Textur ist ein 1x1 Pixel weißes Bild). Der Quellort ist der Ort, an dem die Linie emittiert, mit dem von Ihnen angegebenen Winkel (im Bogenmaß). Wenn Sie also bei Null beginnen und um etwa 0,1 inkrementieren, bis Sie 2PI drücken und dann auf 0 zurücksetzen, haben Sie eine Linie, die sich wie ein Uhrzeiger oder Radar-Sweep um ein Zentrum dreht. Das habe ich gesucht - Danke an alle, die dazu beigetragen haben!

    
___ qstntxt ___

Okay, das ist etwas, was eine einfache Matrixfrage sein sollte, aber mein Verständnis von Matrizen ist etwas begrenzt. Hier ist das Szenario: Ich habe ein 1px mal 1px Sprite, das ich um einen Betrag x und y skalieren möchte (verschiedene Beträge auf jeder Seite), und dann möchte ich das Sprite um einen Winkel drehen, und dann möchte ich es können genau das ganze Ding positionieren (von oben links oder vom Zentrum, macht für mich keinen Unterschied).

Bis jetzt ist mein Code vage nahe, aber er tendiert dazu, abhängig von dem Winkel, den ich passiere, um einen zufälligen Betrag abgeschaltet zu sein.

Ich würde denken, dass dies das tun würde:

%Vor%

Aber es neigt dazu, den Umfang der gedrehten Linie nach unten zu verkleinern, obwohl ich denke, dass es so richtig positioniert ist.

Ich habe es auch versucht:

%Vor%

Die Linie sieht genau richtig aus, mit der genau richtigen Größe und Form, aber ich kann sie nicht richtig positionieren. Wenn ich den Übersetzungsvektor am Ende des obigen Aufrufs verwende oder wenn ich eine Position mit Sprite.Draw einstelle, funktioniert beides nicht richtig.

Das ist alles in SlimDX. Was mache ich falsch?

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123matrix ___ In der Mathematik ist eine Matrix (mehrere Matrizen) eine rechteckige Anordnung von Zahlen, Symbolen oder Ausdrücken, die in Zeilen und Spalten angeordnet sind. Die einzelnen Elemente in einer Matrix heißen ihre Elemente oder Einträge. ___ answer636178 ___

Was Sie tun müssen, ist jede Transformation Schritt für Schritt durchzuführen. Zeichnen Sie zuerst die Skalierung. Ist es da, wo du es erwartest? Dann werfen Sie das Drehen und dann das Übersetzen ein. Dies wird helfen, falsche Annahmen aufzudecken.

Sie können auch temporäre Linien zeichnen, um die Koordinaten zu bestimmen. Zum Beispiel, wenn Sie Ihre Dehnung und Rotation machen und erwarten, dass Ihr Endpunkt bei 0,0 liegt. Das Zeichnen einer anderen Linie mit einem Endpunkt bei 0,0 wird als eine doppelte Überprüfung dienen, um zu sehen, ob das wirklich der Fall ist.

Für Ihr spezifisches Problem kann das Problem mit der Rotation sein. Nachdem Sie skaliert und gedreht haben, befindet sich die Linie jetzt in der Mitte, was zu Problemen bei der Übersetzung führt.

Die allgemeine Lösung besteht darin, die Linie zurück zum Ursprung zu bewegen, um Operationen auszuführen, bei denen die Form oder Ausrichtung geändert wird. Danach, weil du an einem bekannten guten Ort bist, kannst du zu deinem endgültigen Ziel übersetzen.

BEMERKUNGEN BEANTWORTEN

Wenn Übersetzung ein Problem ist und Sie das Koordinatensystem transformieren, müssen Sie eine Konvertierungsfunktion schreiben, um zwischen dem alten System und dem neuen System zu konvertieren.

Zum Beispiel, wenn Sie 45 Grad drehen. Vor der Drehung können Sie um 0,1 um 1 Zoll nach oben verschieben. Nach der Drehung müssen Sie um ca. -70707, .070707 um 1 Zoll relativ zum ursprünglichen Koordinatensystem verschieben.

    
___ tag123translation ___ Übersetzung ist der Prozess zum Ersetzen von Zeichenfolgen in einer Anwendung oder Website, um Benutzern aus Ländern mit verschiedenen Sprachen die Interaktion mit der Anwendung oder Website zu erleichtern. ___ answer636119 ___

Ich habe gerade den Schmerz durchgelernt, Matrixtransformation zu lernen, aber mit XNA.

Ich fand diese articles sei sehr hilfreich beim Verständnis, was passiert. Die Methodenaufrufe sind in XNA sehr ähnlich und die Theorie dahinter sollte auch für SlimDX gelten.

Wenn ich auf deinen Code schaue, denke ich, du solltest am Anfang, am Ursprung übersetzen und dann am Ende wieder ins Ziel übersetzen, obwohl ich immer noch ein bisschen Neuling bin gut.

Die Reihenfolge, in der ich es tun würde, ist:

  • Zum Ursprung
  • übersetzen
  • Skalieren
  • Drehen
  • Zum gewünschten Ort übersetzen

Der Grund für die erste Übersetzung in den Ursprung ist, dass Drehungen auf dem Ursprung basieren. Um also etwas um einen bestimmten Punkt zu drehen, platzieren Sie diesen Punkt vor dem Drehen auf dem Ursprung.

    
___ tag123slimdx ___ SlimDX ist ein MIT-lizenziertes Open-Source-Framework, das Entwicklern, die mit verwalteten Sprachen wie C # und IronPython arbeiten, die Nutzung von DirectX und vielen anderen spielbasierten Multimedia-APIs von Microsoft ermöglicht. ___
x4000 12.03.2009 02:32
quelle
1

Drehen Sie sich um die richtige Achse? Ich bin ein Neuling im Matrix-Zeug, aber es scheint mir, dass, da das Sprite im x, y-Raum existiert, die Rotationsachse die Z-Achse sein sollte - d. H. (0,0,1).

    
Aric TenEyck 11.03.2009 20:30
quelle
1

Was Sie tun müssen, ist jede Transformation Schritt für Schritt durchzuführen. Zeichnen Sie zuerst die Skalierung. Ist es da, wo du es erwartest? Dann werfen Sie das Drehen und dann das Übersetzen ein. Dies wird helfen, falsche Annahmen aufzudecken.

Sie können auch temporäre Linien zeichnen, um die Koordinaten zu bestimmen. Zum Beispiel, wenn Sie Ihre Dehnung und Rotation machen und erwarten, dass Ihr Endpunkt bei 0,0 liegt. Das Zeichnen einer anderen Linie mit einem Endpunkt bei 0,0 wird als eine doppelte Überprüfung dienen, um zu sehen, ob das wirklich der Fall ist.

Für Ihr spezifisches Problem kann das Problem mit der Rotation sein. Nachdem Sie skaliert und gedreht haben, befindet sich die Linie jetzt in der Mitte, was zu Problemen bei der Übersetzung führt.

Die allgemeine Lösung besteht darin, die Linie zurück zum Ursprung zu bewegen, um Operationen auszuführen, bei denen die Form oder Ausrichtung geändert wird. Danach, weil du an einem bekannten guten Ort bist, kannst du zu deinem endgültigen Ziel übersetzen.

BEMERKUNGEN BEANTWORTEN

Wenn Übersetzung ein Problem ist und Sie das Koordinatensystem transformieren, müssen Sie eine Konvertierungsfunktion schreiben, um zwischen dem alten System und dem neuen System zu konvertieren.

Zum Beispiel, wenn Sie 45 Grad drehen. Vor der Drehung können Sie um 0,1 um 1 Zoll nach oben verschieben. Nach der Drehung müssen Sie um ca. -70707, .070707 um 1 Zoll relativ zum ursprünglichen Koordinatensystem verschieben.

    
RS Conley 11.03.2009 20:18
quelle

Tags und Links