Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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?
- souřadnicového prostoru Direct2D
- Vytváření transformačních matic
- vykreslování cílových transformací
- transformace štětců
- transformace geometrie
- Jak vykreslovací cílová transformace ovlivňuje klipy
- souhrnu
- související témata
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.
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 |
|
| matice3x2f::scale | vytvoří transformaci škálování, která má zadané faktory škálování a středový bod. | škálování objektu |
|
| matice3x2f::nerovnoměrná distribuce | vytvoří nerovnoměrnou transformaci, která má zadané hodnoty osy x a y a středový bod. | jak naklonit objekt |
|
| matrix3x2f::translation | vytvoří translační transformaci a určuje posuny ve směru os x a y. | , jak přeložit objekt |
|
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.
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.
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í.
Po PushAxisAlignedClip se na clipRectpoužije rotační transformace. Na následujícím obrázku modrý obdélník představuje transformovaný klipRect.
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.
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ů.
Související témata
-
Referenční Direct2D