Laboratorium grafiki komputerowej i animacji Ćwicenie IV - Biblioteka OpenGL - transformacje prestrenne obiektów Prgotowanie do ćwicenia: 1. Zaponać się transformacjami prestrennmi (obrót, presunięcie, skalowanie), 2. Zaponać się opisem jednorodnm transformacji prestrennch, 3. Zaponać się estawem komend OpenGL umożliwiającm dokonwanie transformacji prestrennch obiektów na scenie wra podstawowmi asadami posługiwania się tmi komendami. Prebieg ćwicenia: 1. Założenia: a. Celem prac na ajęciach laboratorjnch jest wkonanie ruchomego modelu siatki manipulatora Puma. b. Wnikiem prac na disiejsch ajęciach ma bć program bliżon w diałaniu do programu puma_siatka.ee dostarconego do materiałów laboratorjnch. c. Realiacja ćwicenia polega na uupełnieniu kodu programu gl_template modfikowanego na ostatnich ajęciach. d. W realiacji prac worować się należ na rowiąaniach prjętch w programie robot1 również dołąconm do materiałów laboratorjnch. 2. Prebieg ćwicenia: a. Załadować do programu VS projekt Gl_Template modfikowan na poprednich ajęciach i awierając opracowane siatki: seścianu, walca ora ramienia robota. b. Ustalić następując trb rsowania wielokątów: prednie i tlne ścian rsowane jako siatka (należ w funkcji RenderScene() uaktwnić wwołanie funkcji glpolgonmode(gl_front_and_back,gl_line);) c. Utworć funkcję o prototpie: void robot(double d1, double d2, double d3); Model robota będie posiadał 3 stopnie swobod: obród wokół podstaw, obrót pierwsego ramienia i obrót drugiego ramienia, stąd do funkcji ostaną prekaane 3 parametr określające jego bieżącą konfigurację. Funkcja będie korstała funkcji rsującch walec i ramię robota. d. Powołać do żcia 3 mienne globalne tpu double do prechowwania konfiguracji robota: double rot1, rot2, rot3; e. Wwołać funkcję robot wewnątr funkcji RenderScene() parametrami wwołania rot1, rot2, rot3: robot(rot1, rot2, rot3); f. Wewnątr funkcji robot() pretransformować baow układ współrędnch do miejsca, w którm będie rsowana podstawa robota. Zmianę położenia układu
współrędnch pokaano na rsunku 1 Rs. 1 Ocekiwana miana orientacji i położenia układu współrędnch. Układ baow obrócono o -90 stopni wokół osi, a następnie presunięto o wektor [0,0,-50]. W bibliotece OpenGL można dokonać takiej transformacji na macier modelowania-transformacji wwołując komend: glrotated(-90,1,0,0); gltranslated(0,0,-50); g. W pretransformowanm układie współrędnch wrsować podstawę robota: walec(30,5); Wnik rsowania pokaano na rsunku 2. Rs. 2. Wrsowanie podstaw robota. h. Presunąć układ współrędnch o wektor [0,0,5] (5-wsokość walca modelującego podstawę robota). Wrsować model walca obraując 1 cęść kolumn robota: gltranslated(0,0,5); walec(10,40); Reultat wkonania nowch komend OpenGL pokaano na rsunku 3.
Rs. 3. Wrsowanie 1 cęści kolumn robota. i. Presunąć układ współrędnch o wektor [0,0,40] (40-wsokość walca modelującego podstawę robota), a następnie obrócić układ współrędnch o wartość parametru d1 wokół osi. Należ pamiętać, że wartość parametru d1 ależ od wartości miennej globalnej rot1. Następnie wrsować kolejn walec stanowiąc drugą cęść kolumn robota: gltranslated(0,0,40); glrotated(d1,0,0,1); walec(10,40); Reultat dotchcasowego ciągu komend pokaano na rsunku 4. Rs. 4. Wrsowanie 2 cęści kolumn robota. j. Obsługę komunikatu WM_KEYDOWN w funkcji WndProc() uupełnić (pred wwołaniem funkcji InvalidateRect(hWnd,NULL,FALSE);) o następując kod: if(wparam == '1') rot1 -= 5.0f; if(wparam == '2') rot1 += 5.0f; Od tej chwili prciśnięcie klawisa 1 powoduje mniejsenie rot1, kolei prciśnięcie klawisa 2 - więksenie wartości miennej rot1, a następnie wmusenie wrsowania scen. W konsekwencji druga cęść kolumn robota obraca się pod wpłwem prciskania klawis 1 i 2.
k. Uupełnić obsługę komunikatu WM_KEYDOWN o możliwość modfikacji stanu miennej rot2 po prciśnięciu klawis 3, 4 ora modfikacji stanu miennej rot3 po prciśnięciu klawis 5, 6. l. Presunąć układ współrędnch o wektor [0,0,40], obrócić układ współrędnch o kąt 90 stopni wokół osi i presunąć układ współrędnch o wektor [0,0,-20]: gltranslated(0,0,40); glrotated(90,0,1,0); gltranslated(0,0,-20); m. Wrsować kolejn walec w nowej pocji lokalnego układu współrędnch: walec(10,40); Reultat dotchcasowego skrptu pokaano na rsunku 5. Rs. 5. Uupełnienie kolumn robota o element umożliwiając prłącenie ramienia. n. Presunąć układ współrędnch o wektor [0,0,40], obrócić układ współrędnch o (+90º+d2) wokół osi, wrsować ramię robota: gltranslated(0,0,+40); glrotated(90+d2,0,0,1); ramie(15,10,5,30); Dotchcasow reultat wkonania skrptu pokaano na rs. 6. Rs. 6. Uupełnienie modelu robota o pierwse ramię.
o. Presunąć układ współrędnch o wektor [30,0,-5], obrócić układ współrędnch o kąt d3 wokół osi, wrsować ramię robota: gltranslated(30,0,-5); glrotated(d3,0,0,1); ramie(15,10,5,30); Dotchcasow reultat wkonania skrptu pokaano na rs. 7. Rs. 7. Kompletna siatka robota. p. Skrpt rsując model robota ropocąć od polecenia glpushmatri() i akońcć poleceniem glpopmatri(): glpushmatri(); // skrpt rsując robota glpopmatri(); Takie astosowanie funkcji glpushmatri() i glpopmatri() powoduje, że wsstkie transformacje prestrenne astosowane w skrpcie tworącm model robota nie wpłwają na rsowanie innch elementów scen. q. Obsługę komunikatu WM_CREATE w funkcji WndProc() uupełnić o wwołanie funkcji: SetTimer(hWnd,101,200,NULL); Spowoduje to ainstalowanie w programie budika, któr będie powiąan oknem programu, będie miał identfikator 101 i będie wsłał specjaln komunikat WM_TIMER do procedur okna co 200 [ms]. r. Obsługę komunikatu WM_DESTROY w funkcji WndProc() uupełnić o wwołanie funkcji: KillTimer(hWnd,101); Funkcja oddaje sstemowi operacjnemu budik tuż pred akońceniem diałania programu. s. Powołać globalną całkowitolicbową mienną licnik.
t. Wprowadić do funkcji WndProc() mechanim obsługi nowego komunikatu WM_TIMER: case WM_TIMER: if(wparam==101) { licnik++; if(licnik<15) rot2+=15.0; if(licnik>15 && licnik < 30) rot2-=15.0; if(licnik>30) {licnik=0;} InvalidateRect(hWnd,NULL,FALSE); } break; Tak modfikowan program będie stosował budik do automatcnego generowania kolejnch klatek animacji. u. Zaproponować realiację funkcji dwa_robot(), która będie modelowała gniado robotów składające się 2 egemplar robota opracowanego wceśniej. Uwaga: Należ umiejętnie posłużć się wwołaniem komend glpushmatri() i glpopmatri() w celu odiolowania transformacji prestrennch. v. Opracować własn scenarius porusania się robotów w gnieźdie.