Lekcija 4: Geometrijske transformacije i Zbuffer
Geometrijske transformacije u DirectX-u obavljaju se pomoću matrica transformacija. Glavne transformacije u D3D prostoru su rotacija, translacija i skaliranje. Transformacije su u potpunosti sadržane unutar matrica, a višestruko primjenjivanje pojedinih transformacija na isti objekt vrši se množenjem osnovnih matrica. Matrice NISU KOMUTATIVNE, i bitan je redosljed množenja matrica. Dakle, ako neki objekt zarotiramo, te ga zatim pomaknemo neće izgledati isto kao taj objekt prvo pomaknut, a tek onda zarotiran.
Idemo od početka, prvo što je potrebno napraviti je omogućiti AutoDepthStencil koji koristi ZBuffer. Ova opcija govori DirectX-u da kreira spremnik dubine objekata i automatski ga koristi. Da bi ga koristili, potrebno je također podesiti njegov format što se obavlja drugom naredbom u idućem kodu:
|
d3dpp.EnableAutoDepthStencil = TRUE;//za koristenje Zbuffera d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//Format boje
|
Nakon kreiranja D3DDevice objekta potrebno je podesiti njegova stanja. Novo stanje je D3DST_ZENABLE koji govori da li se koristi ZBuffer.
|
D3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
|
U sceni je kreiran još jedan objekt, i nad njima ćemo obavljati tri osnovne transformacije, rotaciju na crvenoj plohi, translaciju na bijeloj i rotaciju + skaliranje na zelenoj plohi.
Sve geometrijske transformacije obavljaju se unutar Render metode, i za svaki objekt se podešava transformacija svijeta pomoću SetTransform metode koja je dio IDirect3DDevice9 sučelja. Podešena transformacija djeluje na sve objekte koji se renderiraju nakon njenog podešavanja, ako se želi renderirati bez transformacije potrebno je pozvati SetTransform i predati joj jediničnu matricu. Jedinična matrica dobiva se pozivanjem D3DXMatrixIdentity procedure. Da bi podesili transformaciju, moramo prvo deklarirati matricu, zatim je ispuniti željenim vrijednostima, te je predati D3DDevice objektu koji će izvršiti transformaciju na temelju te matrice. Višestruke transformacije obavljaju se množenjem matrica. D3D ima niz funkcija koje kreiraju matrice transformacije, mi koristimo samo neke:
|
D3DXMatrixRotationX(&rotation,2*D3DX_PI*(timeGetTime()%5000/5000.)); //podesavanje matrice rotacija |
Ova naredba kreira matricu rotacije oko x osi na temelju drugog parametra koji prestavlja kut u radijanima. Rezultat sprema u prvi parametar.
|
D3DXMatrixTranslation(&rotation,-300+600*(timeGetTime()%2000/2000.),0,0); //podešavanje matrice transformacije |
Naredba kreira matricu translacije po x,y i z smjeru i rezultat sprema u prvi parametar.
|
D3DXMatrixScaling(&rotation, 2*(timeGetTime()%2000/2000.)+1, 2*(timeGetTime()%1000/1000.)+1, 2*(timeGetTime()%500/500.)+1); //podešavanje matrice skaliranja |
Naredba kreira matricu skaliranja po x,y i z smjeru.
|
D3DXMatrixMultiply(&rotation,&rotation,&rot); //množenje matrica (uzastopne transformacije) |
Naredba množi dvije matrice (drugi i treći parametar) i sprema rezultat u prvi parametar.
|
D3DDevice->SetTransform(D3DTS_WORLD,&rotation); |
Naredba podešava transformaciju, i govori D3DDevice objektu da sve objekte koje renderira nakon ovog poziva množi sa matricom transformacije.
Izgled četvrte aplikacije

Made by:Mll