Übersicht über Transformationen
Dieses Thema behandelt die Grundlagen von Direct2D-Transformationen und enthält Beispiele für verschiedene Transformationen. Es enthält die folgenden Teile:
- Was ist eine Direct2D-Transformation?
- Der Direct2D-Koordinatenraum
- Erstellen von Transformationsmatrizen
- Rendern von Zieltransformationen
- Pinseltransformationen
- Geometrietransformationen
- Auswirkungen einer Renderzieltransformation auf Clips
- Zusammenfassung
- Zugehörige Themen
Was ist eine Direct2D-Transformation?
Eine Transformation gibt an, wie die Punkte eines Objekts von einem Koordinatenraum zu einem anderen oder von einer Position zu einer anderen innerhalb desselben Koordinatenraums zugeordnet werden. Diese Zuordnung wird durch eine Transformationsmatrix beschrieben, die als Auflistung von drei Zeilen mit drei Spalten mit FLOAT-Werten definiert ist, wie in der folgenden Tabelle dargestellt.
| M11Standard: 1.0 | M12Standard: 0.0 | 0,0 |
| M21Standard: 0,0 | M22Standard: 1.0 | 0,0 |
| M31OffsetX: 0.0 | M32OffsetY: 0,0 | 1.0 |
In dieser Matrix definieren die Elemente M11, M12, M21 und M22 eine lineare Transformation, die ein Objekt skalieren, drehen oder verzerren kann. die OffsetX- und OffsetY-Elemente definieren die Übersetzung, die angewendet werden soll, nachdem die lineare Transformation vorgenommen wurde. Bei affinen Transformationen sind die Werte in der dritten Spalte immer 0,0, 0,0 und 1,0.
Da Direct2D nur affine (lineare) Transformationen unterstützt, wird seine Transformationsmatrix als 3-mal-2-Matrix definiert, ohne dass die dritte Spalte aus der vorherigen Transformationsmatrix stammt. Die folgende Tabelle zeigt das Layout der Direct2D-Transformationsmatrix.
| M11Standard: 1.0 | M12Standard: 0.0 |
| M21Standard: 0,0 | M22Standard: 1.0 |
| M31OffsetX: 0.0 | M32OffsetY: 0,0 |
In Direct2D wird diese 3:2-Matrix durch die D2D1 _ MATRIX _ 3X2-Struktur dargestellt. Um allgemeine Matrixoperationen zu vereinfachen, stellt Direct2D auch eine Klasse mit dem Namen Matrix3x2Fbereit, die von der D2D1 _ MATRIX _ 3X2-Struktur abgeleitet wird.
Der Standardkonstruktor für Matrix3x2F lässt das Objekt nicht initialisiert. Um eine Identitätsmatrix abzurufen, verwenden Sie Matrix3x2F::Identity.
Wenn eine Identitätstransformation auf ein Objekt angewendet wird, wird die Position, Form oder Größe des Objekts nicht geändert. Dies ähnelt der Art und Weise, wie die Multiplikation einer Zahl mit 1 die Zahl nicht ändert. Anders ausgedrückt: Die Identitätstransformation lässt die Koordinaten von Punkten allein und verschiebt die Punkte nicht an eine neue Position. Jede andere Transformation als die Identitätstransformation ändert die Position, Form und/oder Größe von Objekten.
Bei Transformationen geht es um Koordinaten, und das Verständnis des Direct2D-Koordinatenraums ist wichtig, um die Verwendung von Transformationen zu verstehen.
Der Direct2D-Koordinatenraum
Direct2D verwendet einen linkshändigen Koordinatenraum. Das heißt, positive x-Achsenwerte werden nach rechts und positive y-Achsenwerte nach unten erhöht. Alles auf dem Bildschirm wird relativ zum Ursprung positioniert. Dies ist der Punkt, an dem sich die x-Achse und die y-Achse (0, 0) überschneiden, wie in der folgenden Abbildung dargestellt. Direct2D-Renderziele verwenden diesen Koordinatenraum.

Durch Bearbeiten von Werten in einer Transformationsmatrix können Sie ein Objekt drehen, skalieren, verzerren und verschieben (übersetzen). Wenn Sie beispielsweise OffsetX auf 100 und OffsetY auf 200 festlegen, verschieben Sie das Objekt nach rechts 100 Pixel und nach unten 200 Pixel.
Um die Auswirkungen der Objekt verschiebung anzuzeigen, müssen Sie die Übersetzungstransformation anwenden, um Ziele, Pinsel oder Geometrien zu rendern. Das Anwenden einer Transformation zum Rendern von Zielen wirkt sich auf den gesamten Bildschirm aus, während das Anwenden einer Transformation auf einen Pinsel oder eine Geometrie nur diesen bestimmten Pinsel oder diese Geometrie betrifft. Verwenden Sie zum Erstellen einer Transformationsmatrix die Matrix3x2F-Klasse.
Erstellen von Transformationsmatrizen
Zum Erstellen von Transformationen für Drehung, Skalierung, Schiefe und Übersetzung stellt die Matrix3x2F-Klasse die in der folgenden Tabelle gezeigten statischen Methoden bereit. Die Spalte Beispiel der Tabelle enthält Links zu den Themen zur Vorgehensweise, die die Verwendung der einzelnen Transformationsmethoden veranschaulichen.
| Methode | BESCHREIBUNG | Beispiel | Abbildung |
|---|---|---|---|
| matrix3x2f::rotate | erstellt eine Drehungstransformation mit dem angegebenen Winkel und Mittelpunkt. | Drehen eines Objekts | ![]() |
| matrix3x2f::scale | erstellt eine Skalierungstransformation, die über die angegebenen Skalierungsfaktoren und den Mittelpunkt verfügt. | Skalieren eines Objekts | ![]() |
| matrix3x2f::skew | erstellt eine Schiefetransformation, die die angegebenen Werte für x-Achse und y-Achse sowie den Mittelpunkt enthält. | Verzerren eines Objekts | ![]() |
| matrix3x2f::translation | erstellt eine Übersetzungstransformation und gibt die Verschiebungen in Richtung der x-Achse und der y-Achse an. | Übersetzen eines Objekts | ![]() |
Rendern von Zieltransformationen
Ein Renderziel ist eine Ressource, die von der ID2D1RenderTarget-Schnittstelle erbt. Sie erstellt Ressourcen zum Zeichnen und führt tatsächliche Zeichnungsvorgänge aus. Sie stellt auch Methoden zum Transformieren des Koordinatenraums bereit. Sie können die ID2D1RenderTarget::SetTransform-Methode aufrufen, um die angegebene Transformation auf das Renderziel anzuwenden. Alle nachfolgenden Zeichnungsvorgänge erfolgen im transformierten Raum.
Verwenden Sie zum Rendern von Inhalten die Zeichnungsmethoden des Renderziels. Bevor Sie mit dem Zeichnen beginnen, rufen Sie die BeginDraw-Methode auf. Um das Rendern von Inhalten abzuschließen, rufen Sie die EndDraw-Methode auf. Ein Beispiel finden Sie unter Anwenden mehrerer Transformationen auf ein Objekt.
Pinseltransformationen
Sie können die Transformation auf dem Pinsel anpassen, indem Sie SetTransformaufrufen. Für diese Transformation können Sie sich den Pinsel als großes Papierstück und die verschiedenen Renderingprimitiven (Text, Geometrie, Rechteck und so weiter) als Schablonen überlegen. Wenn Sie die Pinseltransformation anpassen, ist dies so, als würden Sie das große Papier unter die Schablone gleiten, ohne die Position der Schablone selbst zu ändern. Sie können diese Technik verwenden, damit der Text von gelb zu schwarz im 3D-Raum verblasst.
Wenn die Pinseltransformation die Identitätstransformation ist, werden Pinsel im gleichen Koordinatenbereich wie das Renderziel angezeigt, in dem sie gezeichnet werden. Mit der Pinseltransformation kann ein Aufrufer ändern, wie Pinselkoordinaten diesem Raum zuordnen.
Der Pinselbereich wird in Direct2D anders angegeben als in Windows Presentation Foundation (WPF). In Direct2D ist der Pinselraum nicht relativ zum gezeichneten Objekt, sondern vielmehr das aktuelle Koordinatensystem des Renderziels, das von der Pinseltransformation transformiert wird, sofern es eines gibt. Damit der Pinsel ein Objekt wie in WPF ausfüllt, müssen Sie den Ursprung des Pinselraums in die linke obere Ecke des Begrenzungsfelds des Objekts übersetzen und dann den Pinselbereich so skalieren, dass die Basiskachel den Begrenzungsfeld des Objekts ausfüllt.
Weitere Informationen zu Pinseltransformationen finden Sie unter Übersicht über Direct2D-Pinsel.
Geometrietransformationen
Wenn Sie Geometrien skalieren, verschieben, übersetzen oder verfischen, können Sie eine Transformation direkt auf eine bestimmte Geometrie anwenden, nicht auf eine Renderzieltransformation, die sich auf den gesamten Bildschirm auswirken würde. Eine Renderzieltransformation wirkt sich im Allgemeinen auf den Strich und die Füllung einer Geometrie aus. Im Gegensatz dazu wirkt sich eine Geometrietransformation nur auf die Füllung einer Geometrie aus, da die Transformation auf eine Geometrie angewendet wird, bevor sie gestrichelt wird.
Hinweis
Ab Windows 8 hat die Welttransformation keine Auswirkungen auf den Strich, wenn Sie den Strichtyp auf D2D1 _ STROKE TRANSFORM TYPE _ _ _ FIXED oder D2D1 _ STROKE TRANSFORM TYPE _ _ _ HAIRLINE festlegen.
Sie können die Transformation für eine Geometrie anpassen, indem Sie ID2D1Factory::CreateTransformedGeometry aufrufen, um ein ID2D1TransformedGeometry-Objekt zu erstellen. Weitere Informationen zu Geometrietransformationen finden Sie unter Übersicht über Direct2D-Geometrien.
Auswirkungen einer Renderzieltransformation auf Clips
Die Transformation auf einem Renderziel wirkt sich darauf aus, wie das Begrenzungsfeld eines an einer Achse ausgerichteten Clips berechnet wird. Wenn PushAxisAlignedClip aufgerufen wird, wird der clipRect-Parameter durch die aktuelle Welttransformation transformiert, die auf dem Renderziel festgelegt ist. Nachdem die Transformation auf clipRect angewendet wurde, wird das an der Achse ausgerichtete Begrenzungsfeld für clipRect berechnet. Der Effizienz entsprechend wird der Inhalt an diesen achsenbündig ausgerichteten Begrenzungsfeld und nicht an das ursprüngliche clipRect-Feld abgeschnitten, das übergeben wird. Die folgenden Diagramme zeigen, wie eine Drehungstransformation auf das Renderziel, das resultierende clipRect und ein berechnetes, an der Achse ausgerichtetes Begrenzungsfeld angewendet wird.
Angenommen, das Rechteck in der folgenden Abbildung ist ein Renderziel, das an den Bildschirmpixeln ausgerichtet ist.

Wenden Sie eine Drehungstransformation auf das Renderziel an. In der folgenden Abbildung stellt das schwarze Rechteck das ursprüngliche Renderziel und das rot gestrichelte Rechteck das transformierte Renderziel dar.

Nachdem PushAxisAlignedClip aufgerufen wurde, wird die Drehungstransformation auf clipRect angewendet. In der folgenden Abbildung stellt das blaue Rechteck den transformierten ClipRect dar.

Das an der Achse ausgerichtete Begrenzungsfeld wird berechnet. In der folgenden Abbildung stellt das grüne gestrichelte Rechteck den Begrenzungsfeld dar. Alle Inhalte werden an diesem an der Achse ausgerichteten Begrenzungsfeld abgeschnitten.

Zusammenfassung
Direct2D erleichtert das Transformieren von zweidimensionalen Objekten mit vereinfachten Koordinatenräumen und verwandten Klassen. Mithilfe verschiedener Arten von Transformationen können Sie Ihre Objekte übersetzen, drehen, verskalieren und skalieren, um viele beeindruckende visuelle Effekte zu erzielen.



