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


Kivetítés átalakítása (Direct3D 9)

A kivetítés átalakítása úgy képzelhető el, mint a kamera belső elemeinek szabályozása; hasonló ahhoz, hogy egy objektívet válasszon a kamerához. Ez a három átalakítási típus közül a legbonyolultabb. A vetületátalakításról szóló vitafórum a következő témakörökbe van rendezve.

A vetítési mátrix általában egy skálázási és perspektíva-előrejelzés. A kivetítési átalakítás a megtekintési frustumot kuboid alakzattá alakítja. Mivel a megtekintési frustum közel vége kisebb, mint a távoli vége, ez a kamera közelében lévő objektumok kibontásának hatása; így történik a perspektíva alkalmazása a jelenetre.

A a megtekintési frustum, a kamera és a megtekintési átalakítási tér eredete közötti távolság tetszőlegesen D-ként van definiálva, így a vetítési mátrix az alábbi ábrához hasonlóan néz ki.

vetítési mátrix illusztrációja

A vizuális mátrix lefordítja a kamerát a forrásra úgy, hogy a z irányban – D szerint fordít. A fordítási mátrix az alábbi ábrához hasonló.

fordítási mátrix illusztrációja

A fordítási mátrix és a vetítési mátrix (T*P) szorzása az összetett vetítési mátrixot adja meg az alábbi ábrán látható módon.

összetett vetítési mátrix illusztrációja

A perspektíva-átalakítás a megtekintési frustumot egy új koordináta-térzé alakítja. Figyelje meg, hogy a frustum kuboid lesz, és azt is, hogy a forrás a jelenet jobb felső sarkából a középpontba kerül, ahogy az alábbi ábrán is látható.

diagram arról, hogy a perspektíva hogyan alakítja át a megtekintési frustumot egy új koordináta-térbe

A perspektíva-átalakítás során az x- és y-irányok korlátai -1 és 1. A z irány korlátai az első sík esetében 0, a hátsó sík esetében 1.

Ez a mátrix lefordítja és skálázza az objektumokat a kamera és a közeli vágósík megadott távolsága alapján, de nem veszi figyelembe a látómezőt (fov), és a távolságban lévő objektumokhoz előállított z-értékek közel azonosak lehetnek, ami megnehezíti a mélységi összehasonlításokat. Az alábbi mátrix ezeket a problémákat kezeli, és a csúcsokat úgy állítja be, hogy figyelembe vegyék a nézet méretarányát, így jó választás a perspektíva-vetítéshez.

perspektíva-előrejelzési mátrix illusztrációja

Ebben a mátrixban a Zn a közeli vágósík z-értéke. A w, h és Q változók jelentése a következő. Vegye figyelembe, hogy a fovw és a fovk a nézetport vízszintes és függőleges nézetmezőit radiánban jeleníti meg.

változó jelentéseinek egyenletei

Az alkalmazás esetében előfordulhat, hogy az x és az y skálázási együttható meghatározásához a nézetszögek használata nem olyan kényelmes, mint a nézetport vízszintes és függőleges méreteinek használata (a kameratérben). A matematikának megfelelően a w és a h függvény alábbi két egyenlete a nézetport dimenzióit használja, és egyenértékűek az előző egyenletekkel.

w és h változó jelentésének egyenletei

Ezekben a képletekben a Zn a közeli vágósík pozícióját, a Vw és a Vh változók pedig a nézetport szélességét és magasságát jelölik a kameratérben.

C++-alkalmazások esetén ez a két dimenzió közvetlenül a D3DVIEWPORT9 szerkezet Szélesség és Magasság tagjainak felel meg.

Bármilyen képletet is használjon, mindenképpen állítsa a Zn értékét a lehető legnagyobb értékre, mert a kamerához rendkívül közel álló z értékek nem változnak jelentősen. Ez a 16 bites z-pufferek használatával végzett mélységi összehasonlításokat kissé bonyolulttá teszi.

A világhoz és a nézetátalakításokhoz hasonlóan a IDirect3DDevice9::SetTransform metódust is meghívja a vetítési átalakítás beállításához.

Vetítési mátrix beállítása

Az alábbi ProjectionMatrix mintafüggvény beállítja az első és a hátsó vágósíkot, valamint a vízszintes és a függőleges látószöget. A nézetmezőknek kisebbnek kell lenniük, mint a pi radiánok.

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
                                         // plane
                 const float far_plane,  // Distance to far clipping 
                                         // plane
                 const float fov_horiz,  // Horizontal field of view 
                                         // angle, in radians
                 const float fov_vert)   // Vertical field of view 
                                         // angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    D3DXMATRIX ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}   // End of ProjectionMatrix

A mátrix létrehozása után állítsa be IDirect3DDevice9::SetTransform D3DTS_PROJECTION megadásával.

A D3DX segédprogramtár a következő függvényeket biztosítja a vetítési mátrix beállításához.

W-barát vetítési mátrix

A Direct3D a világ, a nézet és a vetítési mátrixok által átalakított csúcsok w-összetevőjét használhatja mélységalapú számítások elvégzésére a mélységpuffer- vagy ködeffektusokban. Az ilyen számítások megkövetelik, hogy a vetítési mátrix normalizálja a w-t, hogy egyenértékű legyen a világűr z értékével. Röviden, ha a vetítési mátrix nem 1 (3,4) együtthatót tartalmaz, akkor az összes együtthatót a (3,4) együttható inverzével kell skáláznia a megfelelő mátrix létrehozásához. Ha nem biztosít megfelelő mátrixot, a rendszer nem alkalmazza megfelelően a ködeffektusokat és a mélységi pufferelést.

Az alábbi ábrán egy nem megfelelő vetítési mátrix látható, és ugyanaz a mátrix skálázva van, hogy a szem relatív ködje engedélyezve legyen.

nem megfelelő vetítési mátrix és egy szem-relatív ködös mátrix illusztrációi

Az előző mátrixokban a rendszer minden változót nemzero értéknek feltételez. A szem relatív ködéről további információt a Eye-Relative és a Z-alapú mélységcímű témakörben talál. A w-alapú mélységpufferezésről további információt a Mélységi pufferek (Direct3D 9)című témakörben talál.

A Direct3D a w-alapú mélységszámításokban a jelenleg beállított vetítési mátrixot használja. Ennek eredményeképpen az alkalmazásoknak egy megfelelő vetítési mátrixot kell beállítaniuk a kívánt w-alapú funkciók fogadásához, még akkor is, ha nem használják a Direct3D-t átalakításokhoz.

átalakítások