Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
30
NowoczesnyOpenGL
Proszęsięjednakdonichzbytnionieprzyzwyczajać.ZnowoczesnegoOpenGL,
przynajmniejwprofilurdzennym,zostałyoneusunięte.Wkonsekwencjisamo-
dzielniebędziemymusieliprzygotowaćimplementacjęmacierzyidziałającychna
nichoperacjiarytmetycznych.IstniejewprawdziegotowabibliotekaGLM(zob.
dodatek),alejakjużkilkakrotniewspomniałem,założeniemtejksiążkijestdąże-
niedopełnegozrozumieniazagadnieńzwiązanychzgrafiką3D.Dopieropojego
osiągnięciubędziemykorzystaćzgotowychrozwiązań.
Wróćmyjednakdoprogramowania.Scenę3DprzygotujemetodaOknoGL::
UstawienieSceny(listing1.18),uruchamianatużpometodzieInicjujWGL.
ZrozumienietejmetodywymagaznajomościpodstawOpenGL,awszczegól-
nościpojęćmacierzyprojekcjiimacierzymodel-widok.Abyniezwalniaćtempa
iusatysfakcjonowaćCzytelnikachcącegoszybkozobaczyćefektswoichdziałań,
postanowiłemodłożyćwyjaśnienietychterminówdotrzeciegorozdziału.Meto-
dęUstawienieScenyzadeklarujmywklasieOknoGLjakochronionązwartością
domyślnąjedynegoargumenturównąfalse.Zakreschronionypozwolinajej
nadpisywaniewklasachpotomnychitymsamymmożliwośćmodyfikowaniausta-
wieńscenywewłasnychprojektach.Tosamobędziedotyczyćomówionejponiżej
metodysłużącejdorysowaniasceny.
Listing1.18.Pierwszametoda,wktórejpojawiająsięfiprawdziwe”funkcjeOpenGL
voidOknoGL::UstawienieSceny(boolrzutowanieIzometryczne)//
wartośćdomyślna=false
{
glViewport(0,0,szerokoscObszaruUzytkownika,
wysokoscObszaruUzytkownika);//oknoOpenGL=&
wnętrzeformy(domyślnie)
//ustawieniepunktuprojekcji
glMatrixMode(GL_PROJECTION);//przełączenienamacierzprojekcji
glLoadIdentity();
//left,right,bottom,top,znear,zfar(clipping)
floatwsp=wysokoscObszaruUzytkownika/
(float)szerokoscObszaruUzytkownika;
if(!rzutowanieIzometryczne)
//left,right,bottom,top,znear,zfar(clipping)
//mnozeniemacierzyrzutowaniaprzezmacierz&
perspektywy-ustalaniefrustum
glFrustum(-1i0f,1i0f,wsp*-1i0f,wsp*1i0f,1i0f,10i0f);
else
glOrtho(-1i0f,1i0f,wsp*-1i0f,wsp*1i0f,1i0f,10i0f);
glMatrixMode(GL_MODELVIEW);//powrótdomacierzywidokumodelu
glEnable(GL_DEPTH_TEST);//z-bufferaktywny=ukrywanie&
niewidocznychpowierzchni
}