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.
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ó.
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.
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ó.
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.
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.
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.
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.
- D3DXMatrixPerspectiveLH
- D3DXMatrixPerspectiveRH
- D3DXMatrixPerspectiveFovLH
- D3DXMatrixPerspectiveFovRH
- D3DXMatrixPerspectiveOffCenterLH
- D3DXMatrixPerspectiveOffCenterRH
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.
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.
Kapcsolódó témakörök