Laboratorium Grafiki Komputerowej i Animacji Ćwicenie IV Biblioteka OpenGL - transformacje prestrenne obiektów Sławomir Samolej Resów, 1999
1. Wprowadenie Podstawowm agadnieniem dotcącm tworenia scen graficnch jest umiejętność romiescenia i orientowania wświetlanch obiektów ora definiowania wajemnch ależności pomięd nimi. W standardie OpenGL budowanie wajemnch odniesień pomięd elementami scen i obserwatorem polega na definiowaniu estawu transformacji matematcnch. Rolą transformacji jest preniesienie trójwmiarowch definicji obiektów na płaski ekran monitora, a także umożliwienie programiście obracania, premiescania, ora skalowania elementów animacji. W OpenGL nigd nie dokonuje się bepośredniej transformacji dotcącej danego obiektu na nim samm. W recwistości transformacje wkonują modfikację układu współrędnch, którm dan obiekt jest wiąan. Jeśli prkładowo transformacja realiuje rotację (obrót) danego układu współrędnch, to wsstkie obiekt prwiąane do niego automatcnie mieniają swoje położenie godnie nowmi współrędnmi układu. Opracowanie preentuje interpretację i sposób realiacji podstawowch transformacji służącch do manipulowania obiektami graficnmi na scenie. Omówione ostaną podstawowe funkcje standardu OpenGL powalające stuować obiekt na scenie ora umożliwiające definiowanie sposobu ich obserwacji. Dołącona do opracowania dskietka awiera projekt gotowch aplikacji wkorstwanch w opracowaniu jako prkład ilustrujące kolejne aspekt omawianego agadnienia. 2. Obserwacja, modelowanie, projekcja Każd definiowan obiekt anim pojawi się na ekranie monitora poddawan jest trem podstawowm transformacjom: obserwacji (ang. viewing), modelowaniu (ang. modeling), projekcji (ang. projection). Obserwacja definiuje punkt w prestreni, w którm umiesca się kamerę rejestrującą scenę. Domślnie w OpenGL pocątkowm punktem obserwacji scen jest środek baowego układu współrędnch. Baow układ współrędnch OpenGL jest tak ustawion, że środek układu najduje się w środku okna, oś wskauje presunięcie poiome, oś - pionowe, natomiast oś skierowana jest w kierunku obserwatora (rs 2.1) Kierunek obserwacji obiektwu kamer Okno programu Rs 2.1 Pocątkowa orientacja i kierunek obserwacji scen w OpenGL W chwili ropocęcia programu obiektw kamer najduje się w punkcie o współrędnch (0,0,0) wjściowego układu współrędnch, a kierunek patrenia obiektwu jest godn ujemnm wrotem osi. Istnieje możliwość definiowania położenia i kierunku patrenia
kamer. Regułą jest, że transformacje prestrenne określające położenie punktu obserwacji scen wkonwane są jako pierwse (anim dokona się romiescenia obiektów). Modelowanie jest transformacją umożliwiającą manipulowanie tworonmi obiektami należącmi do scen. Transformacja ta powala na presuwanie (translację) elementów scen, ich obracanie (rotację) ora preskalowwanie ich romiarów (skalowanie). Końcow wgląd scen w głównej miere ależ od kolejności wkonwania transformacji prestrennch, ponieważ wkonanie kolejno presunięcia i obrotu nie jest jednonacne wkonaniem obrotu, a po nim presunięcia (agadnienie to ostanie apreentowane na prkładie w dalsej cęści opracowania). W recwistości modelowanie i obserwacja, punktu widenia matematcnego i biblioteki OpenGL, są jednm tpem transformacji. Preentowane są one osobno dla uproscenia roumienia budowania scen graficnch. Dla wjaśnienia można powiedieć, że nie ma różnic pomięd presuwaniem jakiegoś obiektu w pewnm kierunku w danm układie współrędnch, a opisaniem tego samego jawiska popre oddalanie od nieruchomego obiektu układu współrędnch. Stąd w OpenGL, gd dokonuje się transformacji prestrennch obiektów mówi się o modfikowaniu transformacji obserwacjimodelowania (ang. modelview transformation). Projekcja określa fragment w prestreni, któr obserwowan jest pre kamerę, ora sposób odwierciedlania prestreni na ekranie. W OpenGL definiowane są dwa tp odwierciedlania prestreni: prostopadł (ang. orthographic) ora perspektwicn (ang. perspective). W projekcji prostopadłej wsstkie obiekt rsowane są jak w rucie prostokątnm na okno i awse achowują swoje definiowane romiar. Ten tp projekcji wkorstwan jest prede wsstkim do aplikacji CAD ora w prpadku, gd wświetla się pojednc obiekt o romiarach bliżonch do odległości kamer od obiektu. Projekcja perspektwicna służ do tworenia scen, które mają oddawać recwistość. Obiekt o tm samm romiare położone dalej są mniejse niż te które najdują się bliżej w stosunku do kamer, a linie równoległe achowują się godnie asadami perspektw. Projekcja wnaca także wcinek prestreni, w którm najduje się scena. Jeśli dan obiekt scen najduje się poa wnaconm fragmentem prestreni prestaje on bć widocn. Dodatkowa transformacja wcinająca (ang. viewport transformation) określa sposób preniesienia scen bepośrednio na okno programu. Umożliwia ona obserwowanie adanego fragmentu obrau całego obrau docierającego do obiektwu kamer. Każda transformacji w OpenGL opiswana jest matematcnie pr pomoc odpowiednio skonstruowanej macier. Wświetlenie pojedncego punktu na ekranie polega w recwistości na pomnożeniu współrędnch punktu opisanego w notacji jednorodnej pre kolejno macier obserwacji-modelowania, macier projekcji, macier wcięcia. Standard OpenGL prewiduje możliwość mieniania każdej macier i uskiwania dięki temu dolności modfikowania arówno obiektów romiesconch na scenie jak i sposobu obserwacji scen. 3. Definiowanie transformacji w OpenGL W bibliotece OpenGL premiescanie obiektów graficnch po scenie polega na kolejnch, następującch po sobie modfikacjach macier obserwacji-modelowania. OpenGL umożliwia dokonwanie trech rodajów transformacji prestrennch: presunięcia (translacji), obrotu (rotacji) ora skalowania. Prkładowo jeśli amiarem nasm jest wrsowanie seścianu presuniętego o diesięć jednostek w górę od pocątku układu współrędnch musim dokonać następującch operacji: - skonstruować macier presuwającą o 10 jednostek w górę
- pomnożć macier obserwacji-modelowania pre stworoną macier presunięcia - wrsować seścian. Fragment kodu preentuje sposób rowiąania postawionego problemu: // Presuń lokaln układ współrędnch o 10 jednostek wdłuż osi gltranslatef(0.0f, 10.0f, 0.0f); // Rsuj seścian auwirecube(10.0f) Wrsowaniem seścianu może się ająć jedna funkcji biblioteki AUX : auwirecube(). Natomiast funkcja o prototpie: void gltranslatef(glfloat, GLfloat, GLfloat ); automatcnie generuje odpowiednią macier presunięcia i mnoż ją pre macier obserwacji-modelowania. Jak łatwo auważć parametr wwołania funkcji, i definiują współrędne wektora translacji. Zamodelowaną transformację prestrenną preentuje rsunek 3.1. 10 Rs 3.1 Seścian presunięt o 10 jednostek w górę W celu dokonania obrotu danego obiektu wokół definiowanej osi o określon kąt, należ utworć macier rotacji, pomnożć ją pre macier obserwacji-modelowania i umieścić obiekt na scenie. Podobnie jak w prpadku presunięcia, standard OpenGL definiuje pojedncą funkcję, która automatcnie dokonuje opisaną transformację: void glrotatef(glfloat angle,glfloat, GLfloat, GLfloat ); Parametr angle określa kąt obrotu w stopniach, natomiast parametr, i definiują wektor wokół którego ma nastąpić obrót. Fragment kodu: // Obróć lokaln układ współrędnch o 90 stopni wokół wektora // o współrędnch 1,1,1 glrotatef(90.0f, 1.0f, 1.0f, 1.0f); // Rsuj seścian auwirecube(10.0f)
dokonuje obrotu o 90 stopni wokół wbranej, osi a następnie wrsowania adanego seścianu (rs 3.2). Rs 3.1 Seścian obrócon o 90 stopni wokół wektora o współrędnch [1,1,1]. Skalowanie jest transformacją, która może mienić romiar rsowanego obiektu popre mianę odległości jednostkowch wdłuż poscególnch osi układu współrędnch. Funkcja: void glscalef(glfloat,glfloat,glfloat ); może służć arówno do "ściskania" jak i "rociągania" obiektu wdłuż osi układu współrędnch. Fragment kodu: // Rociągnij dwukrotnie obiekt wdłuż osi i glscaleff(2.0f, 1.0f, 2.0f); // Rsuj seścian auwirecube(10.0f) pokauje sposób modfikacji romiarów obiektów pr pomoc funkcji glscalef() (rs 3.3). 10 10 Rs 3.3 "Rociągnięt" seścian 4. Składanie transformacji
W standardie OpenGL kolejne wwołwanie funkcji dokonującch transformacji prestrennch (mnożącch macier obserwacji-modelowania pre macier transformacji) powoduje kumulowanie się prekstałceń. Dokonanie kolejnej transformacji polega na utworeniu nowej macier prekstałcenia i pomnożeniu bieżącej macier obserwacjimodelowania pre nowo powstałą. Preanaliujm następując prkład. Chcem wrsować dwie kule: jedną presuniętą o 10 jednostek wdłuż osi, drugą presuniętą o 10 jednostek wdłuż osi wględem pocątku baowego układu współrędnch (rs. 4.1). 10 10 Rs. 4.1 Planowane położenie obiektów na scenie. Najcęściej próbuje się wted tworć kod podobn do następującego: // Presuń się o 10 jednostek wdłuż osi gltranslatef(0.0f, 10.0f, 0.0f); // Rsuj pierwsą sferę ausoildsphere(1.0f); // Presuń się o 10 jednostek wdłuż osi gltranslatef(10.0f, 0.0f, 0.0f); // Rsuj drugą sferę ausoildsphere(1.0f); Ponieważ jednak kolejne prekstałcenia ulegają kumulacji efekt otrman w programie jest podobn do rsunku 4.2. 10 10 Rs. 4.2 Otrmane położenie obiektów na scenie.
Łatwo auważć, że położenie drugiej kuli wnika e łożenia dwu transformacji: presunięcia o 10 jednostek w górę a następnie presunięcie o 10 jednostek w prawo. Ab umieścić kulę w adanm położeniu można b bło dołożć trecie presunięcie, tm raem o 10 jednostek w dół. W prpadku konstruowania bardiej łożonch scen taka próba manipulowania prekstałceniami staje się agadnieniem bardo trudnm. Znacnie prostsm sposobem rowiąania postawionego problemu wdaje się "musenie" OpenGL do powrócenia do pocątkowego punktu oblicania transformacji po narsowaniu pierwsej kuli a następnie wnacenie nowego położenia drugiej kuli i narsowania jej. Z punktu widenia matematcnego taki "powrót" do pocątku układu współrędnch jest równonacn aładowaniem macier jednostkowej jako macier obserwacjimodelowania. Fragment kodu: glmatrimode(gl_modelview); ładuje do macier obserwacji-modelowania macier jednostkową. Pierwsa linia apreentowanego kodu informuje sstem OpenGL, że dokonana modfikacja dotcć będie macier obserwacji-modelowania. Funkcja glloadidentit() automatcnie ładuje do wnaconej macier macier jednostkową. Skomentowania wmaga funkcja glmatrimode(). Funkcja ta ustala, która trech podstawowch macier w sstemie będie aktualnie modfikowana. Jeśli funkcja wwołana jest parametrem GL_MODELVIEW to kolejne modfikacje dotcć będą macier obserwacji-modelowania. Jeśli parametrem funkcji jest GL_PROJECTION to następne transformacje dotcć będą macier projekcji. Parametr GL_TEXTURE wskauje, że modfikacjom ulegać będie macier teksturowania (teksturowanie omówione ostanie w kolejnch opracowaniach). Do momentu kolejnego wwołania funkcji glmatrimode() innm parametrem każda modfikacja będie dotcć aktualnie ustalonej macier. Podan poniżej fragment kodu wkonuje prawidłowo postawione adanie wrsowania kul: // Ustaw macier obserwacji-modelowania jako bieżącą glmatrimode(gl_modelview); // Presuń się o 10 jednostek wdłuż osi gltranslatef(0.0f, 10.0f, 0.0f); // Rsuj pierwsą sferę ausoildsphere(1.0f); // Ustaw macier obserwacji-modelowania w pocątkow stan // Presuń się o 10 jednostek wdłuż osi gltranslatef(10.0f, 0.0f, 0.0f); // Rsuj drugą sferę ausoildsphere(1.0f); Istotne nacenie w budowaniu scen graficnch ma umiejętność interpretowania prekstałceń prestrennch. Są dwa sposob interpretacji prekstałceń prestrennch w standardie OpenGL. W pierwsm nich wsstkie prekstałcenia odbwają się w jednm globalnm układie współrędnch (układie baowm). Sposób drugi powala
interpretować prekstałcenia jako kolejne transformacje dokonwane na lokalnch układach współrędnch. Na pocątku omówione ostanie drugie podejście: Jeśli w OpenGL dokonwane jest jakiekolwiek prekstałcenie to można potraktować je jako kolejną operację prestrenną na lokalnm układie współrędnch. Na pocątku wkonwania programu lokalnm układem współrędnch jest układ baow. Dokonanie translacji (lub jakiekolwiek innej transformacji) układu o określon wektor w opiswanm podejściu można potraktować jako presunięcie pewnego lokalnego układu współrędnch (pocątkowo pokrwającego się układem baowm) o adan wektor (rs 4.3). Rs. 4.3 Interpretacja prekstałceń prestrennch jako ciąg transformacji lokalnego układu współrędnch Kolejne prekstałcenia należ wted interpretować jako transformacje lokalnego układu współrędnch do następnego położenia itd. Takie roumienie prekstałceń prestrennch prekłada się bepośrednio na kolejne wwołwania funkcji OpenGL. Prkładowo fragment kodu: glmatrimode(gl_modelview); gltranslatef(0.0f, 0.0f, -20.0f); glrotatef(-30.0f, 0.0f, 0.0f, 1.0f); gltranslatef(10.0f, 0.0f, 0.0f); auwirecube(10.0f) powoduje, że lokaln układ współrędnch pocątkowo presuwan jest o 20 jednostek w ujemnm kierunku osi, następnie obracan o 30 stopni wokół nowej osi, potem presuwan o 10 jednostek wdłuż nowej osi. Na końcu rsowan jest seścian. Drugim podejściem do interpretowania położenia obiektów na scenie jest "obserwowanie" ich punktu widenia baowego układu współrędnch. Najprostsm sposobem interpretacji położenia obiektów jest wted odctwanie ciągu dokonwanch transformacji od końca. To nac podan wceśniej kod punktu widenia centralnego układu współrędnch można odctać jako kolejno: presunięcie obiektu o 10 jednostek wdłuż baowej osi, obrót presuniętego obiektu wokół baowej osi, a następnie presunięcie o -20 jednostek wdłuż baowej osi. Podcas budowania scen graficnch operacja powracania do baowego układu współrędnch może bć kłopotliwa. Wgodniejsą operacją jest możliwość apamiętania chwilowego położenia lokalnego układu współrędnch. W tm celu sstem OpenGL posiada wbudowan stos prenacon do prechowwania stanów macier obserwacjimodelowania. Zasada diałania stosu macier jest identcna jak asada diałania każdej struktur danch tpu stos. Dostępne są dwie operacje: składanie na stos i pobieranie e
stosu. Z punktu widenia OpenGL operację łożenia na stos macier obserwacjimodelowania można potraktować jako apamiętanie chwilowego położenia lokalnego układu współrędnch, a operację odctu e stosu jako aładowanie do macier obserwacjimodelowania ostatnio apamiętanego położenia lokalnego układu współrędnch. Do składania macier na stos służ funkcja: glpushmatri(); natomiast do ściągania e stosu: glpopmatri(). Poniżej apreentowan ostanie fragment programu ATOM, wkorstującego efekt składania transformacji do animacji modelu atomu. Kolejne klatki animacji oblicane są w obsłude komunikatu Windows WM_TIMER. Jedną klatek animacji preentuje rsunek 4.4. // Funkcja rsująca scenę void RenderScene(void) { // Kąt obrotu wokół jądra atomu static float felect1 = 0.0f; Rs 4.4 Okno programu ATOM. // Wcść okno bieżącm kolorem tła glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // Resetuj macier obserwacji-modelowania glmatrimode(gl_modelview); // Presuń scenę 100 jednostek od kamer // (pocątkowa transformacja obserwacji) gltranslatef(0.0f, 0.0f, -100.0f); // Cerwone jądro atomu glrgb(255, 0, 0); auwiresphere(10.0); // Żółte elektron glrgb(255,255,0); // Pierwsa orbita elektronu // Zachowaj położenie lokalnego układu współrędnch
glpushmatri(); // Obróć się o wnacon kąt obrotu glrotatef(felect1, 0.0f, 1.0f, 0.0f); // Presuń na orbitę gltranslatef(90.0f, 0.0f, 0.0f); // Wrsuj elektron auwiresphere(6.0); // Odskaj achowane położenie lokalnego układu współrędnch glpopmatri(); // Oblicenie orbit drugiego elektronu glpushmatri(); glrotatef(45.0f, 0.0f, 0.0f, 1.0f); glrotatef(felect1, 0.0f, 1.0f, 0.0f); gltranslatef(-70.0f, 0.0f, 0.0f); auwiresphere(6.0); glpopmatri(); // Oblicenie orbit treciego elektronu glpushmatri(); glrotatef(360.0f-45.0f,0.0f, 0.0f, 1.0f); glrotatef(felect1, 0.0f, 1.0f, 0.0f); gltranslatef(0.0f, 0.0f, 60.0f); auwiresphere(6.0); glpopmatri(); // Zmodfikuj popredni kąt obrotu elektronu felect1 += 10.0f; if(felect1 > 360.0f) felect1 = 0.0f; glflush(); } Sposób animacji pojedncego elektronu realiowan jest w następując sposób: - achowwane jest położenie lokalnego układu współrędnch: glpushmatri(); - lokaln układ współrędnch obracan jest wokół adanego wektora: glrotatef(felect1, 0.0f, 1.0f, 0.0f); - now lokaln układ współrędnch jest następnie presuwan o adan wektor: gltranslatef(90.0f, 0.0f, 0.0f); - następnie wrsowwan jest elektron: auwiresphere(6.0); - ora do macier obserwacji-modelowania aładowwan jest lokaln układ współrędnch, któr bł ustuowan w jądre atomu: glpopmatri();
5. Definiowanie projekcji Macier projekcji określa kstałt i romiar obsaru prestreni, w którm obserwowana jest scena graficna. Jak już wspomniano w OpenGL definiować dwa tp projekcji: prostopadłą i perspektwicną. W projekcji prostopadłej (ang. orthographic projection) obserwowan wcinek prestreni ma kstałt prostopadłościanu (rs 5.1). top left Kierunek patrenia na scenę bottom near right far Rs. 5.1 Opis projekcji prostopadłej OpenGL Obiekt najdujące się w obserwowanm wcinku prestreni odtwarane są na ekranie komputera w rucie prostopadłm. W programie ORTHO do wświetlenia obiektu w postaci wdrążonego prostopadłościanu posłużono się projekcją prostopadłą (rs 5.2). Rs 5.2 Wświetlanie obiektów w projekcji prostopadłej OpenGL Sposób wświetlania scen ściśle wiąan jest proporcjami okna programu stąd transformacja określająca projekcję najduje się wkle we fragmentach kodu odpowiedialnch a dostosowwanie obrau do romiarów okna programu (funkcja ChangeSie() wwołwana pod wpłwem komunikatu WM_SIZE). W programie ORTHO fragment kodu definiującego transformację projekcji ma postać:
void ChangeSie(GLsiei w, GLsiei h) { GLfloat nrange = 120.0f; // Zapobiegaj dieleniu pre 0 if(h == 0) h = 1; // Ustaw fragment obrau docierającego do "obiektwu" //,któr ma bć wświetlon w oknie glviewport(0, 0, w, h); // Resetuj macier obserwacji-modelowania glmatrimode(gl_projection); // Ustal obserwowan w projekcji prostopadłej fragment prestreni if (w <= h) glortho ( -nrange, nrange, -nrange*h/w, nrange*h/w, -nrange*2.0f, nrange*2.0f); else glortho ( glmatrimode(gl_modelview); } -nrange*w/h, nrange*w/h, -nrange, nrange, -nrange*2.0f, nrange*2.0f); Po każdej mianie romiarów okna programu następuje predefiniowanie macier projekcji. Funkcja o prototpie: void glortho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ); definiuje prostopadłościenn wcinek prestreni, któr będie widocn pre obiektw kamer obserwującej scenę. Poscególne parametr funkcji odpowiadają wscególnionm na rsunku 5.1 krawędiom prostopadłościanu widenia. Uależnienie romiarów prostopadłościanu widenia od proporcji wsokości do serokości okna programu umożliwia achowanie proporcji w kstałtach rsowanch obiektów (Nadmierne "wdłużenie" okna programu nie powoduje prkładowo "spłascenia" figur, lub achwiania ich proporcji wmiarowch w jakikolwiek inn sposób). Linia kodu: glviewport(0, 0, w, h); definiuje omawianą wceśniej transformację wcinającą. Kolejne parametr funkcji glviewport() wnacają prostokąt pre któr obserwowana jest scena. Funkcja ta powala nakładać na obiektw kamer obserwującej scenę pewnego rodaju presłonę ogranicającą widocność. W omawianm prkładie nie następuje żadne obcięcie obrau, ponieważ transformacja wcinająca powala obserwować scenę pre okno równe romiarom okna programu. Projekcja perspektwicna definiuje obsar widenia w postaci ściętego ostrosłupa. Wkorstuje się ją do scen graficnch mającch odwierciedlać recwistość (np. predmiot najdujące się dalej są mniejse i linie proste biegają się w jednm punkcie). Prkładow program PERSPECT wświetla, podobnie jak program ORTHO, wdrążon prostopadłościan ale wkorstuje do tego projekcję perspektwicną (rs 5.3).
Rs 5.3 Wświetlanie obiektów w projekcji perspektwicnej OpenGL Fragment kodu definiującego projekcję perspektwicną ma postać: void ChangeSie(GLsiei w, GLsiei h) { GLfloat faspect; // Prevent a divide b ero if(h == 0) h = 1; // Set Viewport to window dimensions glviewport(0, 0, w, h); faspect = (GLfloat)w/(GLfloat)h; // Reset coordinate sstem glmatrimode(gl_projection); // Produce the perspective projection gluperspective(60.0f, faspect, 1.0, 400.0); glmatrimode(gl_modelview); } Biblioteka OpenGL umożliwia definiowanie ostrosłupa widenia na dwa sposob. W pierwsm prpadku do definicji wkorstać można funkcję: void glfrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ); Poscególne parametr funkcji odpowiadają wielkościom anaconm na rsunku 5.4. Funkcja nie jest bt cęsto wkorstwana do definicji transformacji projekcji, ponieważ trudno jest wnacć jej parametr wwołania w sposób intuicjn.
top left near bottom far right Rs 5.4 Projekcja perspektwicna opiswana pre funkcję glfrustum() Bardiej popularn sposób wnacenia transformacji projekcji perspektwicnej polega na wkorstaniu funkcji wchodącej w skład biblioteki GLU: void gluperspective( GLdouble fov, GLdouble aspect, GLdouble Near, GLdouble Far ); Parametr funkcji odpowiadają wartościom wskaanm na rsunku 5.5. aspect=w/h w h fov near Rs 5.5 Projekcja perspektwicna opiswana pre funkcję gluperspective() Parametr aspect jest stosunkiem serokości do wsokości, parametr fov - kątem rowarcia pr wierchołku ostrosłupa widenia, parametr near i far określają odległości podstaw ściętego ostrosłupa od miejsca, w którm położona jest kamera obserwująca scenę. 6. Definiowanie własnch transformacji macierowch Standard OpenGL dopusca możliwość tworenia własnch macier prekstałceń jednorodnch. Dostępne są w tm celu dwie funkcje: void glloadmatrid(const GLdouble *m ); void glmultmatrid( const GLdouble *m ); Pierwsa nich umożliwia aładowanie definiowanej pre użtkownika macier do macier obserwacji-modelowania. Druga aś umożliwia pomnożenie bieżącej macier obserwacji-modelowania pre definiowaną macier. Fragment kodu: GLdouble m[]={ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, far
}; 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, glmatrimode(gl_modelview); glmultmatri(m); powoduje premnożenie bieżącej macier obserwacji-modelowania pre definiowaną pre użtkownika macier m. Bibliografia: [1] R. S. Wright Jr., M. Sweet, OpenGL Superbible, The Waite Group Press, 1996 [2] OpenGL Programming Guide, Addison-Wessle, 1993 [3] E. Angel, Interactive Computer Graphics, Addison-Wesle, 1997 [4] R. Fosner, OpenGL Programming for Windows and Windows NT, Addison-Wesle, 1997 [5] R. Leniowski, Wkład predmiotu Grafika Komputerowa i Animacja [6] Guide to OpenGL on Windows From Silicon Graphics, 1997