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?
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:
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.
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).
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!
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?
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.
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:
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.
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).
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.
Tags und Links c# matrix translation slimdx