Delen via


Overzicht van transformaties

In dit onderwerp worden de basisprincipes van Direct2D-transformaties besproken en worden voorbeelden van verschillende transformaties beschreven. Het bevat de volgende onderdelen:

Wat is een Direct2D-transformatie?

Een transformatie bepaalt hoe de punten van een object worden omgezet van de ene coördinaatruimte naar de andere of van de ene positie naar de andere binnen dezelfde coördinaatruimte. Deze toewijzing wordt beschreven door een transformatiematrix, gedefinieerd als een verzameling van drie rijen met drie kolommen met FLOAT-waarden, zoals wordt weergegeven in de volgende tabel.

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

 

In deze matrix definiëren de leden M11, M12, M21 en M22 een lineaire transformatie die een object kan schalen, draaien of scheeftrekken; de OffsetX- en OffsetY-leden definiëren de vertaling die moet worden toegepast nadat de lineaire transformatie is gemaakt. Voor affinustransformaties zijn de waarden in de derde kolom altijd 0.0, 0.0 en 1.0.

Omdat Direct2D alleen affinetransformaties (lineair) ondersteunt, wordt de transformatiematrix gedefinieerd als een matrix van 3 bij 2, zodat de derde kolom uit de vorige transformatiematrix wordt weggelaten. In de volgende tabel ziet u de indeling van de Direct2D-transformatiematrix.

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

 

In Direct2D wordt deze matrix van 3 bij 2 vertegenwoordigd door de D2D1_MATRIX_3X2 structuur. Om algemene matrixbewerkingen te vereenvoudigen, biedt Direct2D ook een klasse met de naam Matrix3x2F-, die is afgeleid van de D2D1_MATRIX_3X2-structuur.

De standaardconstructor voor Matrix3x2F laat het object in een ongeïnitialiseerde toestand. Als u een identiteitsmatrix wilt ophalen, gebruikt u Matrix3x2F::Identity.

Wanneer een identiteitstransformatie wordt toegepast op een object, wordt de positie, vorm of grootte van het object niet gewijzigd. Het is vergelijkbaar met de manier waarop het vermenigvuldigen van een getal met 1 het getal niet wijzigt. Met andere woorden, de identiteitstransformatie laat alleen de coördinaten van punten staan en verschuift de punten niet naar een nieuwe positie. Elke andere transformatie dan de identiteitstransformatie wijzigt de positie, vorm en/of grootte van objecten.

Transformaties gaan allemaal over coördinaten en het begrijpen van de Direct2D-coördinaatruimte is belangrijk voor het begrijpen van het gebruik van transformaties.

De Direct2D-coördinaatruimte

Direct2D maakt gebruik van een linkshandige coördinaatruimte; Dat wil gezegd: positieve x-aswaarden stijgen naar rechts en positieve y-aswaarden naar beneden. Alles op het scherm is gepositioneerd ten opzichte van de oorsprong, het punt waar de x-as en y-as elkaar kruisen (0, 0), zoals wordt weergegeven in de volgende afbeelding. Direct2D-renderdoelen gebruiken deze coördinaatruimte.

afbeelding van de x-as en y-as van een linkerhandige coördinaatruimte

Door waarden in een transformatiematrix te bewerken, kunt u een object draaien, schalen, scheeftrekken en verplaatsen (vertalen). Als u Bijvoorbeeld OffsetX instelt op 100 en OffsetY op 200, verplaatst u het object naar rechts 100 pixels en omlaag 200 pixels.

Als u het effect van de verplaatsing van het object wilt weergeven, moet u de omzettingstransformatie toepassen om doelen, borstels of geometrieën weer te geven. Het toepassen van een transformatie om doelen weer te geven is van invloed op het hele scherm, terwijl het toepassen van een transformatie op een borstel of geometrie alleen van invloed is op die specifieke kwast of geometrie. Als u een transformatiematrix wilt maken, gebruikt u de klasse Matrix3x2F.

Transformatiematrices maken

Voor het maken van rotatie-, schaal-, scheef- en vertaaltransformaties biedt de klasse Matrix3x2F de statische methoden die worden weergegeven in de volgende tabel. De kolom Voorbeeld van de tabel bevat koppelingen naar de handleidingen die laten zien hoe u elke transformatiemethode gebruikt.

Methode Beschrijving Voorbeeld Illustratie
matrix3x2f:: draaien maakt een rotatietransformatie met de opgegeven hoek en het middelpunt. het draaien van een object afbeelding van een vierkant dat 45 graden met de klok mee is gedraaid om het midden van het oorspronkelijke vierkant
matrix3x2f::scale maakt een schaaltransformatie met de opgegeven schaalfactoren en het middelpunt. het schalen van een object illustratie van een vierkante schaal van 130%
matrix3x2f::scheeftrekken maakt een scheeftrekkende transformatie met de opgegeven waarden voor de x-as en de y-as en het middelpunt. het scheeftrekken van een object illustratie van een vierkant gedraaid 30 graden tegen de klok in vanaf de y-as
matrix3x2f::translation maakt een vertalingstransformatie en geeft de verplaatsingen op in de richting van de x-as en y-as. het vertalen van een object afbeelding van een vierkant verplaatst 20 eenheden langs de positieve x-as en 10 eenheden langs de positieve y-as

 

Doeltransformaties weergeven

Een renderdoel is een resource die wordt overgenomen van de ID2D1RenderTarget interface. Hiermee worden resources gemaakt voor het tekenen en worden daadwerkelijke tekenbewerkingen uitgevoerd. Het biedt ook methoden voor het transformeren van de coördinaatruimte. U kunt de methode ID2D1RenderTarget::SetTransform aanroepen om de opgegeven transformatie toe te passen op het renderdoel. Alle volgende tekenbewerkingen vinden plaats in de getransformeerde ruimte.

Gebruik de tekenmethoden van het renderdoel om inhoud weer te geven. Voordat u begint met tekenen, roept u de methode BeginDraw aan. Als u de weergave-inhoud wilt voltooien, roept u de methode EndDraw aan. Zie Meerdere transformaties toepassen op een objectvoor een voorbeeld.

Kwasttransformaties

U kunt de transformatie op de borstel aanpassen door SetTransform-aan te roepen. Voor deze transformatie kunt u de kwast beschouwen als een groot stuk papier en de verschillende renderingprimitieven (tekst, geometrie, rechthoek, enzovoort) als stencils. Wanneer u de kwasttransformatie aanpast, is het alsof u het grote stuk papier onder het stencil schuift, zonder de positie van het stencil zelf te wijzigen. U kunt deze techniek gebruiken om de tekst van geel naar zwart te laten vervagen in 3D-ruimte.

Wanneer de kwasttransformatie de identiteitstransformatie is, worden borstels weergegeven in dezelfde coördinaatruimte als het renderdoel waarin ze worden getekend. Met de kwasttransformatie kan een aanroeper de manier waarop penseelcoördinaten aan deze ruimte worden toegewezen wijzigen.

De kwastruimte is anders opgegeven in Direct2D dan in Windows Presentation Foundation (WPF). In Direct2D is de borstelruimte niet relatief ten opzichte van het object dat wordt getekend, maar is het huidige coördinaatsysteem van het renderdoel, getransformeerd door de kwasttransformatie, als er een is. Als u de kwast een object wilt laten vullen zoals is gedaan in WPF, moet u de kwastruimte verschuiven naar de linkerbovenhoek van het omsluitingskader van het object en vervolgens de kwastruimte schalen zodat de basistegel het omsluitingskader van het object vult.

Voor meer informatie over kwasttransformaties, zie Overzicht van Direct2D Brushes.

Geometrietransformaties

Wanneer u geometrieën schaalt, verplaatst, vertaalt of scheeftrekken, kunt u een transformatie rechtstreeks toepassen op een specifieke geometrie, niet op een renderdoeltransformatie die van invloed is op het hele scherm. Een renderdoeltransformatie beïnvloedt over het algemeen de omtreklijn en opvulling van een geometrie. Een geometrietransformatie is daarentegen alleen van invloed op de opvulling van een geometrie, omdat de transformatie wordt toegepast op een geometrie voordat deze wordt gestreken.

Notitie

Vanaf Windows 8 heeft de wereldtransformatie geen invloed op de pennenstreek als u het lijntype instelt op D2D1_STROKE_TRANSFORM_TYPE_FIXED of D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

U kunt de transformatie op een geometrie aanpassen door ID2D1Factory::CreateTransformedGeometry aan te roepen om een ID2D1TransformedGeometry object te maken. Zie Overzicht van Direct2D Geometries voor meer informatie over geometrietransformaties.

Hoe een renderdoeltransformatie van invloed is op clips

De transformatie op een renderdoel is van invloed op de manier waarop het begrenzingsvak van een uitgelijnde clip wordt berekend. Wanneer de PushAxisAlignedClip wordt aangeroepen, wordt de parameter clipRect getransformeerd door de huidige wereldtransformatie die is ingesteld op het renderdoel. Nadat de transformatie is toegepast op de clipRect, wordt de as-uitgelijnde begrenzingsvak voor de clipRect berekend. Voor efficiëntie wordt de inhoud geknipt naar dit begrenzingsvak dat is uitgelijnd op de as en niet op de oorspronkelijke clipRect die wordt doorgegeven. In de volgende diagrammen ziet u hoe een draaiingstransformatie wordt toegepast op het rendertarget, de resulterende clipRecten een berekend as-uitgelijnd begrenzingsvak.

  1. Stel dat de rechthoek in de volgende afbeelding een weergavedoel is dat is uitgelijnd op de scherm pixels.

    afbeelding van een rechthoek (doel weergeven)

  2. Pas een rotatietransformatie toe op het renderdoel. In de volgende afbeelding vertegenwoordigt de zwarte rechthoek het oorspronkelijke renderdoel en de rode rechthoek met rode streepjes het getransformeerde renderdoel.

    afbeelding van de oorspronkelijke rechthoek en een geroteerde rechthoek (getransformeerd renderingdoel)

  3. Nadat PushAxisAlignedClip is aangeroepen, wordt de rotatietransformatie toegepast op de clipRect-. In de volgende afbeelding vertegenwoordigt de blauwe rechthoek de getransformeerde clipRect.

    afbeelding van een kleinere blauwe rechthoek (cliprect) in de gerouleerde rechthoek (getransformeerd doel)

  4. Het as-uitgelijnd begrenzingsvak wordt berekend. In de volgende afbeelding vertegenwoordigt de groene gestreepte rechthoek met stippellijn het begrenzingsvak. Alle inhoud wordt beperkt tot dit as-gealigneerd begrenzingsvak.

    illustratie van een groen omlijningsvak op de kleine blauwe rechthoek (cliprect)

Samenvatting

Met Direct2D kunt u eenvoudig tweedimensionale objecten transformeren met vereenvoudigde coördinaatruimten en gerelateerde klassen. Met behulp van verschillende soorten transformaties kunt u uw objecten vertalen, draaien, scheeftrekken en schalen om een groot aantal indrukwekkende visuele effecten te bereiken.

Direct2D-verwijzing