Übersicht über Transformationen

In diesem Thema werden die Grundlagen von Direct2D-Transformationen und Beispiele für verschiedene Transformationen erläutert. Sie enthält die folgenden Teile:

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 Sammlung von drei Zeilen mit drei Spalten von FLOAT-Werten definiert ist, wie in der folgenden Tabelle dargestellt.

     
M11Default: 1.0 M12Default: 0.0 0.0
M21Default: 0.0 M22Default: 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 Elemente OffsetX und OffsetY definieren die Übersetzung, die nach der linearen Transformation angewendet werden soll. 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 die Transformationsmatrix als 3-by-2-Matrix definiert, wobei die dritte Spalte aus der vorherigen Transformationsmatrix weggelassen wird. Die folgende Tabelle zeigt das Layout der Direct2D-Transformationsmatrix.

   
M11Default: 1.0 M12Default: 0.0
M21Default: 0.0 M22Default: 1.0
M31OffsetX: 0.0 M32OffsetY: 0.0

 

In Direct2D wird diese 3-mal-2-Matrix durch die D2D1_MATRIX_3X2-Struktur dargestellt. Um allgemeine Matrixvorgänge zu vereinfachen, stellt Direct2D auch eine Klasse namens Matrix3x2F bereit, die von der D2D1_MATRIX_3X2-Struktur abgeleitet wird.

Der Standardkonstruktor für Matrix3x2F lässt das Objekt nicht initialisiert. Verwenden Sie Matrix3x2F::Identity, um eine Identitätsmatrix abzurufen.

Wenn eine Identitätstransformation auf ein Objekt angewendet wird, ändert sie nicht die Position, form oder Größe des Objekts. Dies ähnelt der Art und Weise, dass die Multiplikation einer Zahl mit 1 die Zahl nicht ändert. Anders ausgedrückt: Die Identitätstransformation lässt die Koordinaten der Punkte 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-Koordinatenbereich

Direct2D verwendet einen linkshändigen Koordinatenraum; Das heißt, positive x-Achsenwerte erhöhen sich nach rechts und positive Werte der y-Achse nach unten. Alles auf dem Bildschirm wird relativ zum Ursprung positioniert, d. h. dem Punkt, an dem sich die X-Achse und die Y-Achse überschneiden (0, 0), wie in der folgenden Abbildung dargestellt. Direct2D-Renderziele verwenden diesen Koordinatenbereich.

Abbildung der X- und Y-Achse eines linkshändigen Koordinatenraums

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 um 100 Pixel nach rechts und 200 Pixel nach unten.

Um die Auswirkung der Objektverschiebung anzuzeigen, müssen Sie die Übersetzungstransformation auf Renderziele, Pinsel oder Geometrien anwenden. Das Anwenden einer Transformation auf Renderziele wirkt sich auf den gesamten Bildschirm aus, während sich das Anwenden einer Transformation auf einen Pinsel oder eine Geometrie nur auf den jeweiligen Pinsel oder die Geometrie auswirkt. Verwenden Sie zum Erstellen einer Transformationsmatrix die Matrix3x2F-Klasse .

Erstellen von Transformationsmatrizen

Zum Erstellen von Drehungs-, Skalierungs-, Skew- und Übersetzungstransformationen stellt die Matrix3x2F-Klasse die in der folgenden Tabelle gezeigten statischen Methoden bereit. Die Spalte Beispiel der Tabelle enthält Links zu den Vorgehensweisen, 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 Abbildung eines um 45 Grad im Uhrzeigersinn gedrehten Quadrats um die Mitte des ursprünglichen Quadrats
matrix3x2f::scale erstellt eine Skalierungstransformation mit den angegebenen Skalierungsfaktoren und dem angegebenen Mittelpunkt. Skalieren eines Objekts Abbildung eines quadratischen skalierten 130 %
matrix3x2f::skew erstellt eine Verzerrungstransformation, die die angegebenen Werte für x-Achse und Y-Achse sowie den angegebenen Mittelpunkt aufweist. Verzerren eines Objekts Abbildung einer quadratischen Abweichung um 30 Grad gegen den Uhrzeigersinn von der y-Achse
matrix3x2f::translation erstellt eine Übersetzungstransformation und gibt die Verschiebungen in Richtung der x-Achse und der Y-Achse an. Übersetzen eines Objekts Abbildung eines quadratischen 20 Einheiten entlang der positiven x-Achse und 10 Einheiten entlang der positiven y-Achse

 

Rendern von Zieltransformationen

Ein Renderziel ist eine Ressource, die von der ID2D1RenderTarget-Schnittstelle erbt. Es erstellt Ressourcen für das Zeichnen und führt tatsächliche Zeichnungsvorgänge aus. Außerdem werden Methoden zum Transformieren des Koordinatenraums bereitgestellt. Sie können die ID2D1RenderTarget::SetTransform-Methode aufrufen, um die angegebene Transformation auf das Renderziel anzuwenden. Alle nachfolgenden Zeichnungsvorgänge erfolgen im transformierten Bereich.

Verwenden Sie zum Rendern von Inhalten die Zeichnungsmethoden des Renderziels. Rufen Sie die BeginDraw-Methode auf, bevor Sie mit dem Zeichnen beginnen. Rufen Sie die EndDraw-Methode auf, um das Rendern von Inhalten abzuschließen. Ein Beispiel finden Sie unter Anwenden mehrerer Transformationen auf ein Objekt.

Pinseltransformationen

Sie können die Transformation auf dem Pinsel anpassen, indem Sie SetTransform aufrufen. Für diese Transformation können Sie sich den Pinsel als großes Stück Papier und die verschiedenen Renderinggrundtypen (Text, Geometrie, Rechteck usw.) als Schablonen vorstellen. Wenn Sie die Pinseltransformation anpassen, ist es so, als würden Sie das große Stück Papier unter die Schablone gleiten, ohne die Position der Schablone selbst zu ändern. Sie können diese Technik verwenden, um den Text von Gelb nach Schwarz in den 3D-Raum zu verblassen.

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 zugeordnet werden.

Der Pinselraum wird in Direct2D anders angegeben als in Windows Presentation Foundation (WPF). In Direct2D ist der Pinselraum nicht relativ zum gezeichneten Objekt, sondern das aktuelle Koordinatensystem des Renderziels, das von der Pinseltransformation transformiert wird, sofern vorhanden. Damit der Pinsel wie in WPF ein Objekt ausfüllt, müssen Sie den Pinselraumursprung in die obere linke Ecke des Begrenzungsrahmens des Objekts übersetzen und dann den Pinselraum skalieren, sodass die Basiskachel das begrenzungsfeld des Objekts ausfüllt.

Weitere Informationen zu Pinseltransformationen finden Sie unter Übersicht über Direct2D-Pinsel.

Geometrietransformationen

Wenn Sie Geometrien skalieren, verschieben, übersetzen oder verzerren, 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 wirkt sich die Welttransformation nicht auf den Strich aus, 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 für ein Renderziel wirkt sich darauf aus, wie das Begrenzungsfeld eines achsenbündigen Clips berechnet wird. Wenn pushAxisAlignedClip aufgerufen wird, wird der clipRect-Parameter von der aktuellen Welttransformation transformiert, die für das Renderziel festgelegt ist. Nachdem die Transformation auf clipRect angewendet wurde, wird das achsenbündige Begrenzungsfeld für clipRect berechnet. Aus Effizienzgründen wird der Inhalt an dieses achsenbündige Begrenzungsfeld und nicht an den ursprünglichen clipRect abgeschnitten, der übergeben wird. Die folgenden Diagramme zeigen, wie eine Drehungstransformation auf das Renderziel, den resultierenden clipRect und ein auf die berechnete Achse ausgerichtetes Begrenzungsfeld angewendet wird.

  1. Angenommen, das Rechteck in der folgenden Abbildung ist ein Renderziel, das an den Bildschirmpixeln ausgerichtet ist.

    Abbildung eines Rechtecks (Renderziel)

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

    Abbildung des ursprünglichen Rechtecks und eines gedrehten Rechtecks (transformiertes Renderziel)

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

    Abbildung eines kleineren blauen Rechtecks (Cliprect) innerhalb des gedrehten Rechtecks (transformiertes Renderziel)

  4. Das achsenbündige Begrenzungsfeld wird berechnet. In der folgenden Abbildung stellt das grüne gestrichelte Rechteck den Begrenzungsrahmen dar. Alle Inhalte werden an dieses achsenbündige Begrenzungsfeld gekappt.

    Abbildung eines grünen Begrenzungsrahmens auf dem kleinen blauen Rechteck (Cliprect)

Zusammenfassung

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

Direct2D-Referenz