Lekcija 3: Perspektivna projekcija
Treća lekcija je gotovo ista kao i druga, sadrži i iscrtava iste objekte, no sada se više ne koriste prije podešene vrijednosti renderiranja, i definira se pogled(kamera). U DirectX-u prije podešavanja kamere moramo podestiti način iscrtavanja poligona, i način osvjetljavanja. Ovo se obavlja u CScene objektu u InicijalizirajD3D metodi, nakon kreiranja D3DDevice9 objekta. D3DDevice ima mnogo unutarnih stanja koja će DirectX koristiti pri renderiranju pojedinih ili svih objekata. Ova stanja određuju da li se objekti renderiraju čvrsti, ili prozirni, određuje način na koji se osvjetljavaju, kako se koriste Z buffer i stencilbuffer , i da li se uopće koriste, kako se iscrtavaju teksture i mnogo drugih stvari. U našem kodu trenutno se podešavaju samo dva stanja, a to je Culling Mode i Lightning Mode. Culling mode određuje na koji način se ispunjavaju poligoni. Ovo stanje određuje da li će se crtati obje strane poligona ili samo jedna, i ako je tako, koja strana. Lighting mode određuje način na koji se osvjetljavaju objekti. U ovom primjeru sjenčanje je onemogućeno, što je isto kao da imamo ambijentno svijetlo na cijelo mapi, a ako postoje izvori svijetla, oni će biti ignorirani. Culling mode i Lightning mode se podešavaju iza kreiranja D3DDevice objekta pomoću iduće dvije naredbe.
|
D3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); D3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
|
Druga stvar koja je promjenjena od zadnje lekcije je dodavanje SetupCamera metode koja podešava perspektivnu projekciju koja će predstavljavi naš «prozor» u D3D svijet. Ova metoda mora se pozivati pri renderiranju objekata, iza poziva BeginScene procedure. Ako u istoj sceni želimo renderirati objekte iz više projekcija, možemo i to, no tada tada prije renderiranja pojedinih, moramo podesiti odgovarajuće matrice. U SetupCamera podešava se više matrica, i svaka ima svoje značenje. Tip matrice u DirectX-u je struktura D3DXMATRIXA16 i predstavlja 4x4 matricu, koja se može korisiti u različite svrhe. Biti će nam potrebna i struktura vektora. Trodimenzionalni vektori su u DirectX-u prikazani strukturom D3DXVECTOR3, i u primjeru se koriste za građenje matrice pogleda. Matricu pogleda moguće je izgraditi na temelju 3 vektora od kojih dva predstavljaju točke u prostoru, a treći predstavlja vektor koji pokazuje «gore».
|
//ovaj vektor opisuje položaj gledatelja u 3D prostoru D3DXVECTOR3 vEyePt( 0.0f, 500.0f,-300.0f );
//Iduca linija zadaje mjesto u koje je uperena kamera D3DXVECTOR3 vLookatPt( 100.0f, 100.0f, 100.0f );
//Ovaj vektor govori koji smjer nam je "gore", u ovom slucaju y D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
Matrica pogleda gradi se pomoću idućih naredbi:
D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); D3DDevice->SetTransform( D3DTS_VIEW, &matView );
|
SetTransform procedura podešava transformaciju koja će se koristiti pri renderiranju. Prvi parametar određuje koja vrsta transformacija će se primjeniti, u ovom slučaju radi se o transformaciji pogleda.
Potrebno je još podestiti matricu same perspehtivne projekcije, tj. Želimo da nam se objekti koji su dalje crtaju manji, a oni koji su bliže veći. Ovo se u DirectX-u također obavlja pomoću podešavanja transformacije i njezine matrice.
|
D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f ); D3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );
|
D3DMatrixPerspectiveFovLH kreira matricu perspekcije iz parametara koje prima. Ovdje će kut gledanja biti Pi/4, AspectRatio(odnos širine i visine pogleda) je 1, te objekti koji su bliže gledištu od 1, i dalje od 1000 neće biti renderirani (Clipping). Iza toga podešavamo projekcijsku transformaciju na matricu perspektivne projekcije. Projekcija može biti i ortogonalna što će biti prikazano u jednom od kasnijih tutorijala pri crtanju 2D grafike.
Matrice na 3D svijet djeluju poput leća u stvarnom prostoru. Na slici su prikazane perspektivna i ortogonalna projekcija, i kako izgleda 3D svijet kroz jednu i drugu.



Nakon što je podešena perspektivna projekcija može se pristupiti renderiranju preostalih objekata.
Izgled treće aplikacije

Made by:Mll