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


Átalakítások (Direct3D 9)

A Direct3D azon része, amely a rögzített függvénygeometriai folyamaton keresztül küldi át a geometriát, az átalakítási motor. Megkeresi a modellt és a megtekintőt a világon, projektek csúcspontjait jeleníti meg a képernyőn, és klip csúcsokat a nézetporthoz. Az átalakító motor világítási számításokat is végez, hogy meghatározza a diffúz és a spekuláris összetevőket az egyes csúcspontokon.

A geometriai folyamat bemenetként csúcsokat vesz fel. Az átalakító motor a világot, a nézetet és a vetítést átalakítja a csúcsokra, klipek az eredményt, és mindent átad a raszterizátornak.

A folyamat élén a modell csúcspontjai egy helyi koordinátarendszerhez képest vannak deklarálva. Ez egy helyi forrás és egy tájolás. A koordináták tájolását gyakran modelltérnek, az egyes koordinátákat pedig modellkoordinátának nevezzük.

A geometriai folyamat első szakasza átalakítja a modell csúcsait a helyi koordinátarendszerből egy olyan koordinátarendszerbe, amelyet a jelenet összes objektuma használ. A csúcsok átrendezésének folyamatát világátalakításnak nevezzük. Ezt az új tájolást gyakran világtérnek nevezik, és a világtér minden csúcspontja világkoordináta használatával deklarálva van.

A következő szakaszban a 3D-s világot leíró csúcsok a kamera tekintetében orientáltak. Ez azt jelzi, hogy az alkalmazás egy nézetpontot választ a jelenethez, és a világűr koordinátáit áthelyezi és elforgatja a kamera nézete körül, és a világűrből kameratér lesz. Ez a nézetátalakítás.

A következő fázis a kivetítés átalakítása. A folyamat ezen részében az objektumok általában a nézőtől való távolságukkal vannak skálázva, hogy a mélység illúzióját adják egy jelenetnek; a közeli objektumok úgy lettek készítve, hogy nagyobbak legyenek, mint a távoli objektumok, és így tovább. Az egyszerűség kedvéért ez a dokumentáció arra a térre utal, amelyben a csúcspontok a vetítési átalakítás után kivetítőtérként léteznek. Egyes grafikus könyvek a vetítési térre a perspektíva utáni homogén térként hivatkozhatnak. Nem minden vetítési átalakítás skálázza a jelenetben lévő objektumok méretét. Az ilyen kivetítéseket néha affine- vagy ortogonális kivetítésnek is nevezik.

A folyamat utolsó részében a képernyőn nem látható csúcspontok el lesznek távolítva, így a raszterizátor nem vesz igénybe időt a színek és árnyékolás kiszámításához olyan dologhoz, amely soha nem lesz látható. Ezt a folyamatot kivágásnak nevezzük. A kivágást követően a rendszer a többi csúcspontot a nézetport paramétereinek megfelelően skálázza, és képernyőkoordinátává alakítja. Az eredményül kapott csúcsok, amelyek a jelenet raszterizálásakor láthatók a képernyőn, a képernyőtérben találhatók.

Az átalakításokkal objektumgeometriát alakíthat át egyik koordinátatérből a másikba. A Direct3D mátrixokat használ a 3D átalakítások végrehajtásához. Ez a szakasz bemutatja, hogyan hoznak létre mátrixok 3D-átalakítókat, ismertetik az átalakítások néhány gyakori felhasználási módját, valamint azt, hogyan kombinálhatók mátrixok egyetlen mátrix létrehozásához, amely több átalakítást is magában foglal.

Mátrix-átalakítások

A térhatású ábrákat használó alkalmazásokban geometriai átalakításokkal végezheti el a következőket:

  • Egy objektum helyének kifejezése egy másik objektumhoz viszonyítva.
  • Objektumok elforgatása és méretezése.
  • A megtekintési pozíciók, az irányok és a perspektívák módosítása.

Bármelyik pontot (x,y,z) átalakíthatja egy másik ponttá (x', y', z') egy 4x4-alapú mátrix használatával, ahogyan az az alábbi egyenletben látható.

pontok másik ponttá alakításának egyenlete

Hajtsa végre a következő egyenleteket az (x, y, z) és a mátrixon a pont létrehozásához (x', y', z').

új pont egyenletei

A leggyakoribb átalakítások a fordítás, a forgatás és a skálázás. Az ilyen hatásokat okozó mátrixokat egyetlen mátrixba kombinálva egyszerre több átalakítást is kiszámíthat. Létrehozhat például egyetlen mátrixot egy sor pont fordításához és elforgatásához.

A mátrixok sor-oszlop sorrendben vannak megírva. Az egyes tengelyek mentén egyenletesen skálázó mátrixot, az úgynevezett egységes skálázást a következő mátrix jelöli matematikai jelöléssel.

mátrix egyenlete egységes skálázási

A C++-ban a Direct3D kétdimenziós tömbként deklarálja a mátrixokat a D3DMATRIX szerkezet használatával. Az alábbi példa bemutatja, hogyan inicializálhat egy D3DMATRIX struktúrát egységes méretezési mátrixként.

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Fordít

Az alábbi egyenlet a pontot (x, y, z) egy új pontra (x', y', z') fordítja le.

fordítási mátrix egyenlete egy új ponthoz

A C++-ban manuálisan is létrehozhat fordítási mátrixot. Az alábbi példa egy olyan függvény forráskódját mutatja be, amely mátrixot hoz létre a csúcspontok lefordításához.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

A D3DX segédprogramtár a D3DXMatrixTranslation függvényt biztosítja.

Hangsor

Az alábbi egyenlet a pontot (x, y, z) az x-, y- és z-irányok tetszőleges értékeivel egy új pontra (x', y', z') skálázza.

skálázási mátrix egyenlete egy új ponthoz

Forog

Az itt ismertetett átalakítások balkezes koordináta-rendszerekhez tartoznak, így eltérhetnek a máshol látott transzformációs mátrixoktól.

Az alábbi egyenlet az x tengely körüli pontot (x, y, z) elforgatja, és létrehoz egy új pontot (x', y', z').

x forgási mátrix egyenlete egy új ponthoz

Az alábbi egyenlet elforgatja a pontot az y tengely körül.

y forgatómátrix egyenlete egy új ponthoz

Az alábbi egyenlet elforgatja a z tengely körüli pontot.

új ponthoz tartozó z forgatómátrix egyenlete

Ezekben a példában a mátrixokban a görög theta betű a forgási szöget jelöli radiánban. A szögek az óramutató járásával megegyező irányban vannak megadva, amikor a forgatási tengelyen a forrás felé néznek.

Egy C++ alkalmazásban használja a D3DXMatrixRotationX, D3DXMatrixRotationYés D3DXMatrixRotationZ függvényeket, amelyeket a D3DX segédprogramtár biztosít a forgatási mátrixok létrehozásához. A következő a D3DXMatrixRotationX függvény kódja.

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Összefűző mátrixok

Az mátrixok használatának egyik előnye, hogy két vagy több mátrix hatását kombinálhatja őket szorozva. Ez azt jelenti, hogy a modell forgatásához és egy adott helyre való fordításához nem kell két mátrixot alkalmaznia. Ehelyett megszorozza a forgatási és fordítási mátrixokat, hogy olyan összetett mátrixot állítsunk elő, amely az összes hatásukat tartalmazza. Ez a mátrixösszefűzésnek nevezett folyamat az alábbi egyenlettel írható.

mátrixösszefűzés egyenlete

Ebben az egyenletben a C az összetett mátrix, az Mn-n keresztüli M₁ pedig az egyes mátrixok. A legtöbb esetben csak két vagy három mátrix van összefűzve, de nincs korlát.

A D3DXMatrixMultiply függvény használatával végezze el a mátrixok szorzását.

A mátrix szorzásának sorrendje kulcsfontosságú. Az előző képlet a mátrixösszefűzés balról jobbra szabályát tükrözi. Vagyis az összetett mátrix létrehozásához használt mátrixok látható hatásai balról jobbra haladva jelennek meg. Az alábbi példában egy tipikus világmátrix látható. Képzelje el, hogy egy sztereotip repülő csészealj világmátrixát hozza létre. Valószínűleg meg szeretné pörgetni a repülő csészealjat a középpontja körül - a modelltér y tengelye körül -, és lefordítani a jelenet egy másik helyére. Ennek az effektusnak a végrehajtásához először létre kell hoznia egy forgatómátrixot, majd meg kell szoroznia egy fordítási mátrixtal, ahogyan az az alábbi egyenletben látható.

forgási mátrixon és fordítási mátrixon alapuló pörgetés egyenlete

Ebben a képletben az Ry az y tengely körüli forgatás mátrixa, a Tw pedig a világ koordinátáinak egy bizonyos helyére való fordítás.

A mátrixok szorzásának sorrendje azért fontos, mert a két skaláris érték szorzásával ellentétben a mátrix szorzása nem inmutatív. A mátrixok ellenkező sorrendbe szorzása vizuális hatással van a repülő csészealj világtéri helyzetére való fordítására, majd a világűrben való elforgatására.

Függetlenül attól, hogy milyen típusú mátrixot hoz létre, ne felejtse el a balról jobbra szabályt, hogy a várt hatásokat érje el.

Első lépések