Sdílet prostřednictvím


Přehled transformací

Toto téma popisuje základy transformací Direct2D a obsahuje příklady různých transformací. Obsahuje následující části:

Co je transformace Direct2D?

Transformace určuje, jak mapovat body objektu z jednoho souřadnicového prostoru na jiný nebo z jedné pozice do jiného v rámci stejného prostoru souřadnic. Toto mapování je popsáno transformační maticí definovanou jako kolekce tří řádků se třemi sloupci hodnot FLOAT, jak je znázorněno v následující tabulce.

     
M11Default: 1.0 M12Výchozí: 0,0 0.0
M21Default: 0.0 M22Default: 1.0 0.0
M31OffsetX: 0.0 M32OffsetY: 0.0 1.0

 

V této matici definují členové M11, M12, M21 a M22 lineární transformaci, která může škálovat, otáčet nebo zkosit objekt; Členové OffsetX a OffsetY definují překlad, který se má použít po provedení lineární transformace. U affinových transformací jsou hodnoty ve třetím sloupci vždy 0,0, 0,0 a 1,0.

Vzhledem k tomu, že Direct2D podporuje pouze affinové (lineární) transformace, je jeho transformační matice definována jako matice 3 po 2 a vynechá třetí sloupec z předchozí transformační matice. Následující tabulka ukazuje rozložení matice transformace Direct2D.

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

 

V Direct2D je tato matice 3 by-2 reprezentována D2D1_MATRIX_3X2 strukturou. Pro zjednodušení běžných maticových operací poskytuje Direct2D také třídu s názvem Matrix3x2F, která je odvozena ze struktury D2D1_MATRIX_3X2.

Výchozí konstruktor pro Matrix3x2F ponechá objekt neinicializovaný. K načtení matice identit použijte Matrix3x2F::Identity.

Při použití transformace identity u objektu se nezmění umístění, tvar ani velikost objektu. Podobá se způsobu, jakým se násobení čísla číslem 1 nezmění. Jinými slovy, transformace identity ponechá souřadnice bodů samostatně a nepřesouvá body na novou pozici. Jakákoli jiná transformace než transformace identity změní pozici, tvar a/nebo velikost objektů.

Transformace jsou všechny o souřadnicích a pochopení prostoru souřadnic Direct2D je důležité pro pochopení použití transformací.

Souřadnicový prostor Direct2D

Direct2D používá levý souřadnicový prostor; to znamená, že kladné hodnoty osy X se zvětší vpravo a kladné hodnoty osy y se zvětší směrem dolů. Všechno na obrazovce je umístěné vzhledem k počátku, což je bod, kde se osa x a y protínají (0, 0), jak je znázorněno na následujícím obrázku. Cíle vykreslení Direct2D používají tento souřadnicový prostor.

ilustrace osy x a osy y levotočivého souřadnicového prostoru

Pomocí manipulace s hodnotami v matici transformace můžete objekt otočit, škálovat, sřídit, zkosit a přemístit (překládat polohu). Pokud například nastavíte OffsetX na 100 a OffsetY na 200, přesunete objekt o 100 pixelů doprava a o 200 pixelů dolů.

Pokud chcete zobrazit efekt přesunutí objektu, musíte použít transformaci překladu pro vykreslení cílů, štětců nebo geometrií. Použití transformace na cíle vykreslení má vliv na celou obrazovku a použití transformace na štětec nebo geometrii má vliv pouze na konkrétní štětec nebo geometrii. Chcete-li vytvořit transformační matici, použijte třídu Matrix3x2F.

Vytváření transformačních matic

Při vytváření rotace, škálování, naklonění a transformace posunu poskytuje třída Matrix3x2F statické metody uvedené v následující tabulce. Sloupec Příklad tabulky obsahuje odkazy na témata s postupy, která ukazují, jak používat jednotlivé metody transformace.

Metoda Popis Příklad Ilustrace
matrix3x2f::rotate vytvoří transformaci otočení, která má zadaný úhel a středový bod. jak otočit objekt ilustraci čtverce otočené o 45 stupňů ve směru hodinových ručiček kolem středu původního čtverce
matice3x2f::scale vytvoří transformaci škálování, která má zadané faktory škálování a středový bod. škálování objektu ilustrace čtverce měřítka 130%
matice3x2f::nerovnoměrná distribuce vytvoří nerovnoměrnou transformaci, která má zadané hodnoty osy x a y a středový bod. jak naklonit objekt ilustrace čtverce zkoseného o 30 stupňů proti směru hodinových ručiček od y-ové osy
matrix3x2f::translation vytvoří translační transformaci a určuje posuny ve směru os x a y. , jak přeložit objekt ilustrace čtverce posunutého o 20 jednotek podél kladné osy x a o 10 jednotek podél kladné osy y

 

Vykreslování cílových transformací

Prostředek, který dědí z rozhraní ID2D1RenderTarget, se nazývá cíl vykreslení. Vytváří prostředky pro kreslení a provádí skutečné operace kreslení. Poskytuje také metody transformace souřadnicového prostoru. Můžete zavolat metodu ID2D1RenderTarget::SetTransform pro použití zadané transformace na cíl vykreslení. Všechny následné operace kreslení probíhají v transformované oblasti.

K vykreslení obsahu použijte kreslicí metody cíle vykreslení. Než začnete kreslit, zavolejte metodu BeginDraw. Chcete-li dokončit vykreslování obsahu, zavolejte metodu EndDraw. Příklad najdete v tématu Jak použít více transformací na objekt.

Transformace štětců

Transformace na štětci můžete upravit voláním SetTransform. U této transformace si štětec můžete představit jako velký papír a různé primitivy vykreslování (text, geometrie, obdélník atd.) jako vzorníky. Při úpravě transformace štětce je to, jako kdybyste posouvali velký papír pod vzorníkem, aniž byste měnili pozici samotného vzorníku. Tuto techniku můžete použít k tomu, aby text přecházel ze žluté na černou s efektem mizícího do 3D prostoru.

Když je transformace štětce transformací identity, štětce se zobrazí ve stejném prostoru souřadnic jako cíl vykreslení, ve kterém jsou vykresleny. Transformace štětce umožňuje volajícímu změnit, jak jsou souřadnice štětce mapovány na tento prostor.

Prostor štětce je v Direct2D zadaný jinak než v systému Windows Presentation Foundation (WPF). V Režimu Direct2D není prostor štětce relativní vzhledem k objektu, který je nakreslený, ale jedná se spíše o aktuální souřadnicový systém cíle vykreslení, transformovaný transformací štětce, pokud existuje. Pokud chcete, aby štětec vyplnil objekt tak, jak je to ve WPF, musíte převést původ prostoru štětce do levého horního rohu ohraničujícího rámečku objektu a pak prostor štětce škálovat tak, aby základní dlaždice vyplnila ohraničující rámeček objektu.

Další informace o transformacích štětců naleznete v tématu Přehled štětců Direct2D.

Geometrické transformace

Při škálování, přesouvání, posunutí nebo zkosení geometrie můžete přímo použít transformaci na konkrétní geometrii, nikoli na transformaci vykreslovacího cíle, která by ovlivnila celou obrazovku. Transformace renderovacího cíle obecně ovlivňuje tah a výplň geometrie. Naproti tomu transformace geometrie ovlivňuje pouze výplň geometrie, protože transformace se použije na geometrii před tahem.

Poznámka

Počínaje Windows 8, světová transformace neovlivňuje tah, pokud nastavíte typ tahu na D2D1_STROKE_TRANSFORM_TYPE_FIXED nebo D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

Transformaci geometrie můžete upravit voláním ID2D1Factory::CreateTransformedGeometry, abyste vytvořili objekt ID2D1TransformedGeometry. Další informace o transformacích geometrie naleznete v tématu Přehled geometrie Direct2D.

Vliv transformace cílové plochy pro vykreslení na klipy

Transformace cíle vykreslení ovlivňuje způsob výpočtu ohraničujícího rámečku klipu zarovnaného osou. Když je volána funkce PushAxisAlignedClip, parametr clipRect je transformován aktuální světovou transformací, která je nastavena na cíl vykreslování. Po použití transformace na clipRectse vypočítá ohraničující box zarovnaný podle os pro clipRect. Z důvodu efektivity se obsah ořízne do tohoto osově zarovnaného ohraničujícího rámečku, a ne na původní klipRect, který se předá. Následující diagramy ukazují, jak se na cíl vykreslení použije transformace otočení, výsledná klipRect a počítaný osově zarovnaný ohraničující rámeček.

  1. Předpokládejme, že obdélník na následujícím obrázku je cíl vykreslení, který je zarovnaný k pixelům obrazovky.

    ilustraci obdélníku (cíle vykreslení)

  2. Použijte otočnou transformaci na vykreslovací cíl. Na následujícím obrázku představuje černý obdélník původní cíl vykreslení a červený přerušovaný obdélník představuje transformovaný cíl vykreslení.

    ilustraci původního obdélníku a otočeného obdélníku (transformované cílové plochy vykreslování)

  3. Po PushAxisAlignedClip se na clipRectpoužije rotační transformace. Na následujícím obrázku modrý obdélník představuje transformovaný klipRect.

    obrázek menšího modrého obdélníku (kliprect) uvnitř otočeného obdélníku (transformovaného cíle rendrování)

  4. Vypočítá se ohraničující rámeček zarovnaný osou. Na následujícím obrázku představuje zelený přerušovaný obdélník ohraničující box. Veškerý obsah je oříznutý do tohoto osově zarovnaného ohraničujícího rámečku.

    ilustrace zeleného rámečku na malém modrém obdélníku (kliprect)

Shrnutí

Direct2D usnadňuje transformaci dvojrozměrných objektů pomocí zjednodušených souřadnicových prostorů a souvisejících tříd. Pomocí různých typů transformací můžete překládat, otáčet, zkosit a škálovat objekty, abyste dosáhli mnoha působivých vizuálních efektů.

Referenční Direct2D