Megosztás a következőn keresztül:


Átalakítások áttekintése

Ez a témakör a Direct2D-átalakítások alapjait ismerteti, és példákat tartalmaz a különböző átalakításokra. A következő részeket tartalmazza:

Mi az a Direct2D transzformáció?

Az átalakítás azt határozza meg, hogyan képezheti le egy objektum pontjait az egyik koordinátatérből a másikba, vagy az egyik pozícióból a másikba ugyanazon a koordinátatéren belül. Ezt a leképezést egy transzformációs mátrix írja le, amely három sorból és három lebegőpontos számot tartalmazó oszlopból áll, ahogy az az alábbi táblázatban látható.

     
M11Alapértelmezett: 1.0 M12Default: 0.0 0.0
M21Default: 0.0 M22Default: 1.0 0.0
M31OffsetX: 0.0 M32OffsetY: 0,0 1.0

 

Ebben a mátrixban az M11, az M12, az M21 és az M22 tagok lineáris transzformációt határoznak meg, amely skálázható, elforgatható vagy elfordíthat egy objektumot; Az OffsetX és az OffsetY tagok határozzák meg a lineáris átalakítás után alkalmazandó fordítást. Affine-transzformációk esetében a harmadik oszlop értékei mindig 0,0, 0,0 és 1,0.

Mivel a Direct2D csak affine (lineáris) transzformációkat támogat, az átalakítási mátrix 3-by-2 mátrixként van definiálva, amely kihagyja a harmadik oszlopot az előző átalakítási mátrixból. Az alábbi táblázat a Direct2D transzformációs mátrix elrendezését mutatja be.

   
M11Default: 1.0 M12Default: 0.0
M21Default: 0.0 M22Alapértelmezett: 1.0
M31OffsetX: 0.0 M32OffsetY: 0.0

 

A Direct2D-ben ezt a 3-by-2 mátrixot a D2D1_MATRIX_3X2 struktúra képviseli. A gyakori mátrixműveletek egyszerűsítése érdekében a Direct2D egy Matrix3x2Fnevű osztályt is biztosít, amely a D2D1_MATRIX_3X2 struktúrából származik.

A Mátrix3x2Falapértelmezett konstruktora nem inicializálja az objektumot. Identitásmátrix lekéréséhez használja Matrix3x2F::Identity.

Ha identitásátalakítást alkalmaz egy objektumra, az nem módosítja az objektum pozícióját, alakját vagy méretét. Hasonló ahhoz, ahogyan egy szám 1-gyel való szorzása nem változtatja meg a számot. Más szóval az identitásátalakítás önmagában hagyja a pontok koordinátáit, és nem helyezi át a pontokat egy új pozícióba. Az identitásátalakítástól eltérő átalakítások módosítják az objektumok pozícióját, alakját és/vagy méretét.

Az átalakítások a koordinátákról szólnak, és a Direct2D koordináta-tér megértése fontos az átalakítások használatának megértéséhez.

A Direct2D koordináta-tér

A Direct2D balkezes koordináta-helyet használ; vagyis a pozitív x tengely értékei jobbra, a pozitív y tengely értékei pedig lefelé növekednek. A képernyőn minden a forráshoz viszonyítva van elhelyezve, amely az x tengely és az y tengely metszete (0, 0), ahogyan az alábbi ábrán látható. A Direct2D renderelési célok ezt a koordináta-területet használják.

a balkezes koordináta-tér x és y tengelyének ábrája

Az átalakítási mátrix értékeinek módosításával elforgathatja, méretezheti, elmozdíthatja és áthelyezheti (lefordíthatja) az objektumokat. Ha például az OffsetX értékét 100-ra és az OffsetY értékét 200-ra állítja, akkor az objektumot 100 képponttal jobbra és 200 képponttal lefelé mozgatja.

Az objektum áthelyezésének hatásának megjelenítéséhez a fordítási átalakítást kell alkalmaznia a célok, ecsetek vagy geometriák megjelenítéséhez. Az átalakítás renderelési célokra való alkalmazása a teljes képernyőre hatással van, míg az átalakítás ecsetre vagy geometriára való alkalmazása csak az adott ecsetre vagy geometriára van hatással. Átalakítási mátrix létrehozásához használja a Matrix3x2F osztályt.

Transzformációs mátrixok létrehozása

Forgatási, méretezési, ferdeség- és fordításátalakítások létrehozásához a Matrix3x2F osztály az alábbi táblázatban látható statikus metódusokat biztosítja. A táblázat Példa oszlopa az egyes átalakítási módszerek használatát bemutató útmutató témakörökre mutató hivatkozásokat tartalmaz.

Módszer Leírás Példa Illusztráció
matrix3x2f::forgatási a megadott szöget és középpontot tartalmazó forgatási átalakítást hoz létre. objektum elforgatása 45 fokkal elforgatott négyzet illusztrációja az eredeti négyzet közepén, az óramutató járásával megegyező irányban
matrix3x2f::scale A megadott méretezési tényezőket és középpontot tartalmazó skálázási átalakítást hoz létre. objektumok skálázása 130-ra skálázott négyzet alakú% ábrája
matrix3x2f::ferde Egy ferde átalakítási folyamatot hoz létre, amely a megadott x tengely és y tengely értékeit és középpontját tartalmaz. objektum ferdítése egy négyzet ábrázolása, amely az y tengelyhez képest 30 fokkal el van forgatva az óramutató járásával ellentétes irányba
matrix3x2f::translation fordítási transzformációt hoz létre, és megadja az x tengely és az y tengely irányában lévő elmozdulásokat. objektum lefordítása ábra egy négyzetről, amelyet 20 egységgel elmozdítottak a pozitív x tengely mentén és 10 egységgel a pozitív y tengely mentén

 

Célpont-átalakítások megjelenítése

A renderelési cél olyan erőforrás, amely az ID2D1RenderTarget interfésztől öröklődik. Erőforrásokat hoz létre a rajzhoz, és tényleges rajzműveleteket hajt végre. Emellett metódusokat is biztosít a koordinátatér átalakításához. A ID2D1RenderTarget::SetTransform metódus meghívásával alkalmazhatja a megadott átalakítást a renderelési célra. Minden további rajzművelet az átalakított térben történik.

A tartalom megjelenítéséhez használja a renderelési cél rajzmetszeteit. A rajzolás megkezdése előtt hívja meg a BeginDraw metódust. A tartalom renderelésének befejezéséhez hívja meg a EndDraw metódust. Például lásd: Több átalakítás alkalmazása egy objektumra.

Ecsetátalakítások

A kefe átalakítását úgy módosíthatja, hogy meghívja SetTransform. Ehhez az átalakításhoz az ecsetet képzelhetjük el úgy, mint egy nagy papírdarabot, és a különböző renderelő primitíveket (szöveg, geometria, téglalap stb.) rajzsablonként. Amikor beállítja a kefe transzformációját, ez olyan, mintha a nagy papírt csúsztatná a rajzsablon alatt, anélkül, hogy megváltoztatná magának a rajzsablonnak a helyzetét. Ezzel a technikával a szöveg elhalványulhat sárgáról feketére, ahogyan el távolodik a 3D térben.

Ha az ecset-átalakítás az identitásátalakítás, az ecsetek ugyanabban a koordinátatérben jelennek meg, mint a megjelenítési célterület, amelyben megrajzolták őket. Az ecsetátalakítás lehetővé teszi a hívó számára, hogy módosítsa az ecset koordinátáinak leképezését erre a térre.

Az ecsetterület másként van megadva a Direct2D-ben, mint a Windows Presentation Foundationben (WPF). A Direct2D-ben az ecsettér nem a rajzolt objektumhoz képest van, hanem a renderelési cél aktuális koordináta-rendszere, amelyet az ecsetátalakítás alakít át, ha van ilyen. Ahhoz, hogy az ecset kitöltse az objektumot a WPF-ben leírtak szerint, az ecsettér forrását az objektum határolókeretének bal felső sarkára kell lefordítania, majd skáláznia kell az ecsetterületet úgy, hogy az alap csempe kitöltse az objektum határolókeretét.

További információért az ecset-átalakításokról, lásd: Direct2D ecsetek áttekintése.

Geometriai átalakítások

Geometriák méretezése, áthelyezése, lefordítása vagy elvarrása esetén közvetlenül alkalmazhat átalakítást egy adott geometriára, nem pedig a teljes képernyőt érintő renderelési célátalakításra. A renderelési cél átalakítása általában hatással van a geometria körvonalára és kitöltésére. Ezzel szemben a geometriai átalakítás csak a geometria kitöltésére van hatással, mivel az átalakítást a rendszer a geometriára alkalmazza, mielőtt megsimogatná.

Jegyzet

A Windows 8-tól kezdve a világátalakítás nem befolyásolja a vonalstílust, ha a vonal típusát D2D1_STROKE_TRANSFORM_TYPE_FIXED vagy D2D1_STROKE_TRANSFORM_TYPE_HAIRLINEértékre állítja.

 

Az átalakítást egy geometrián módosíthatja ID2D1Factory::CreateTransformedGeometry meghívásával, hogy létrehozzon egy ID2D1TransformedGeometry objektumot. További információ a geometriai átalakításokról: Direct2D Geometries Overview.

A render célfelület transzformációja hogyan befolyásolja a klipeket

A renderelési cél átalakítása hatással van a tengelyhez igazított klip határolókeretének kiszámítására. A PushAxisAlignedClip meghívásakor a clipRect paramétert a renderelési célon beállított aktuális világátalakítás alakítja át. Az átalakítás alkalmazása után a clipRect-ra, kiszámításra kerül a clipRect tengelyhez igazított határolókerete. A hatékonyság érdekében a rendszer a tartalmat ehhez a tengelyhez igazított határolókerethez vágja, és nem az eredeti clipRect, amelyet átad. Az alábbi diagramok bemutatják, hogyan alkalmaznak forgatási átalakítást a renderelési célpontra, az eredményül kapott clipRect, valamint az így számított tengelyhez igazított határolókeretet.

  1. Tegyük fel, hogy a következő ábrán látható téglalap egy renderelési cél, amely a képernyő képpontjaihoz van igazítva.

    téglalap (render célfelület) ábrája

  2. Forgatási átalakítás alkalmazása a renderelési célponton. Az alábbi ábrán a fekete téglalap az eredeti renderelési célt, a piros szaggatott téglalap pedig az átalakított renderelési célt jelöli.

    eredeti téglalap és egy elforgatott téglalap (átalakított renderelési cél) ábrája

  3. A PushAxisAlignedClip meghívása után a rotációs átalakítást alkalmazzák a clipRect-re. Az alábbi ábrán a kék téglalap az átalakított clipRectjelöl.

    egy kisebb kék téglalap (cliprect) illusztrációja a forgatott téglalap (átalakított renderelési cél) belsejében

  4. A rendszer kiszámítja a tengelyhez igazított határolókeretet. Az alábbi ábrán a zöld szaggatott téglalap a határolókeretet jelöli. Minden tartalom ehhez a tengelyekhez igazított határoló dobozhoz van korlátozva.

    kis kék téglalap (cliprect) zöld határolókeretének ábrája

Összefoglalás

A Direct2D megkönnyíti a kétdimenziós objektumok átalakítását egyszerűsített koordináta-terek és kapcsolódó osztályok használatával. A különböző átalakítások használatával lefordíthatja, elforgathatja, elvarrhatja és skálázhatja az objektumokat, hogy számos lenyűgöző vizuális effektust érjen el.

Direct2D-referencia