OpenGL trnsformcje przestrzenne Kżdy zdefiniowny obiekt sceny, znim pojwi się n ekrnie monitor, poddwny jest trzem podstwowym trnsformcjom: Obserwcji Modelowni Projekcji Projekcj określ frgment przestrzeni, który obserwowny jest przez kmerę, orz sposób odzwierciedlni przestrzeni n ekrnie. Typy odzwierciedlni przestrzeni w OpenGL: Projekcj prostopdł Projekcj perspektywiczn Dostępn jest również trnsformcj wycinjąc określjąc sposób przenoszeni sceny bezpośrednio n okno progrmu.
OpenGL projekcj prostopdł top left Kierunek ptrzeni n scenę bottom ner right fr void glortho( GLdouble left, GLdouble right, GLdouble bottom GLdouble top, GLdouble ner, GLdouble fr ; 2
OpenGL projekcj perspektywiczn ( top left ner bottom right fr void glfrustum(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zner, GLdouble zfr ; 3
OpenGL projekcj perspektywiczn (2 spect=w/h w h fovy ner fr void gluperspective( GLdouble fovy, GLdouble spect, GLdouble zner, GLdouble zfr ; 4
OpenGL projekcj prostopdł - przykłd void ChngeSize(GLsizei w, GLsizei h { GLflot nrnge = 2.f; if(h = = h = ; glviewport(,, w, h; glmtrixmode(gl_projection; gllodidentity(; if (w <= h glortho (-nrnge, nrnge, -nrnge*h/w, nrnge*h/w, -nrnge*2.f, nrnge*2.f; else glortho (-nrnge*w/h, nrnge*w/h, -nrnge, nrnge, -nrnge*2.f, nrnge*2.f; } glmtrixmode(gl_modelview; gllodidentity(; 5
OpenGL projekcj perspektywiczn - przykłd void ChngeSize(GLsizei w, GLsizei h { GLflot faspect; if(h == h = ; glviewport(,, w, h; faspect = (GLflotw/(GLfloth; glmtrixmode(gl_projection; gllodidentity(; gluperspective(6.f, faspect,., 4.; glmtrixmode(gl_modelview; gllodidentity(; } 6
Notcj jednorodn: OpenGL modelownie/obserwcj P [ x, y, z, w] =, gdzie : x k = x w, y k = y w, z k = z w zwykle: P = [ x, y, z,] 7
OpenGL modelownie/obserwcj Mcierz jednorodn: Mcierz przeksztłceń: 2 3 4 2 22 32 42 3 23 33 43 4 24 44 2 2 22 3 23 34 3 32 33 Mcierz trnslcji: Mcierz znieksztłceń optycznych: 4 24 34 [ ] 4 42 44 8
9 OpenGL modelownie/obserwcj Zleżność pomiędzy współrzędnymi punktów w różnych ukłdch współrzędnych: ukld rownn liniowych : zpis mcierzowy: 3 33 32 3 2 23 22 2 3 2 3 33 32 3 2 23 22 2 3 2 + + + = + + + = + + + = = r z y x z r z y x y r z y x x z y x r r r z y x
OpenGL modelownie/obserwcj Obrót wokół osi z o kąt Obrót wokół osi y o kąt cos( sin( sin( cos( cos( sin( sin( cos( Przesunięcie o wektor x v, y v, z v Obrót wokół osi x o kąt v v v z y x cos( sin( sin( cos(
OpenGL modelownie/obserwcj Sklownie: Zmniejszenie obiektu: c b S
2 OpenGL modelownie/obserwcj Skłdnie przeksztłceń w notcji jednorodnej poleg n mnożeniu kolejnych mcierzy przeksztłceń. Z uwgi n nieprzemienność mnożeni mcierzy nieprzemienne jest skłdnie przeksztłceń. W wyniku mnożeni uzyskuje się zwsze mcierz 4 x 4 odwzorowującą współrzędne dnego obiektu n współrzędne po przeksztłceniu. Np. złożenie przeksztłceń Rot(x,3 Trns(,3, uzyskuje się przez pomnożenie mcierzy: = 3sin(3 cos(3 sin(3 cos(3 sin(3 cos(3 3 cos(3 sin(3 sin(3 cos(3
OpenGL modelownie/obserwcj Początkow orientcj i kierunek obserwcji sceny w OpenGL: y Kierunek obserwcji obiektywu kmery z x Okno progrmu 3
OpenGL modelownie/obserwcj Definiownie włsnych mcierzy przeksztłceń w OpenGL: { double x =.; sttic double reset[]= {.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. }; sttic double trns[]= {.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. gllodmtrixd(reset; //gllodidentity(; glmultmtrixd(trns; trns[2]+=x; glrectd(-2.,-2.,2.,2.; } 4
OpenGL modelownie/obserwcj Podstwowe skłdnie przeksztłceń: { double x =.; double =.; sttic double ngle =.; sttic double trns[]= {.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. }; sttic double rot[]= {.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. }; gllodidentity(; glmultmtrixd(trns; glmultmtrixd(rot; trns[2]+=x; ngle+=; rot[]=cos(ngle*3.4/8; rot[]=-sin(ngle*3.4/8; rot[4]=sin(ngle*3.4/8; rot[5]=cos(ngle*3.4/8; glrectd(-2.,-2.,2.,2.; 5
OpenGL modelownie/obserwcj Predefiniowne funkcje OpenGL do trnsformcji ukłdów współrzędnych: { double b =.; double =.; sttic double ngle =.; sttic double x =.; gllodidentity(; gltrnslted(x,,; //void gltrnsltef(glflot x, GLflot y, GLflot z; glrotted(ngle,,,-; //void glrottef(glflot ngle,glflot x,glflot y, GLflot z; ngle+=; x+=b; glrectd(-2.,-2.,2.,2.;} Trzeci funkcj umożliwi zdefiniownie sklowni: void glsclef(glflot z,glflot y,glflot z; 6
OpenGL zwnsowne skłdnie przeksztłceń Skłdnie kilku przeksztłceń: { sttic double rot=., rot2=.; gllodidentity(; glrectd(-.,-.,.,.; glrotted(rot,,,; gltrnslted(3,,; glrotted(rot2,,,; } glrectd(-.,-.,.,.; rot+=.; rot2-=2.; 7
OpenGL zwnsowne skłdnie przeksztłceń Funkcje glpushmtrix(; i glpopmtrix(; { sttic double rot=., rot2=.; gllodidentity(; glrectd(-.,-.,.,.; glpushmtrix(; glrotted(rot,,,; gltrnslted(3,,; glrotted(rot2,,,; glrectd(-.,-.,.,.; glpopmtrix(; glpushmtrix(; glrotted(-rot,,,; gltrnslted(6,,; glrotted(-rot2,,,; glrectd(-.,-.,.,.; glpopmtrix(; } rot+=.; rot2-=2.; 8
OpenGL przykłd uproszczony model robot // Ustlenie odwzorowni przestrzeni: void ChngeSize(GLsizei w, GLsizei h { GLflot faspect; if(h == h = ; glviewport(,, w, h; faspect = (GLflotw/(GLfloth; glmtrixmode(gl_projection; gllodidentity(; gluperspective(65.f, faspect,., 5.; } glmtrixmode(gl_modelview; gllodidentity(; 9
OpenGL przykłd uproszczony model robot // Obsług klwitury: cse WM_KEYDOWN: switch ((intwprm { cse VK_ESCAPE: DestroyWindow(hWnd; brek; cse : elbowadd(; InvlidteRect(hWnd, NULL, FALSE; brek; cse 2: elbowsubtrct(; InvlidteRect(hWnd, NULL, FALSE; brek;... defult: brek; } brek; 2
OpenGL przykłd uproszczony model robot // Rysownie sceny: void RenderScene(void { glmtrixmode(gl_modelview; gllodidentity(; //gltrnsltef(.f,.f,-5.f; //glrotted(2.,.,.,.; /* glulookat(.,.,5.,.,.,.,.,.,. ; glulookat(.,5.,.,.,.,.,.,.,-. ; */ 2
OpenGL przykłd uproszczony model robot // Rysownie sceny (cd: glcler(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT; glcolor3f (.,.,.; glpushmtrix(; gltrnsltef(2.f,.f,.f; uxwirebox(.,.,.; glpopmtrix(; glpushmtrix(; gltrnsltef (., -.6,.; uxwirebox(.,.2,.; gltrnsltef (.,.6,.; glrottef ((GLflot bse,.,.,.; uxwirebox(.4,.,.4; gltrnsltef (.,.5,.; glrottef ((GLflot elbow,.,.,.; gltrnsltef (.,.5,.; uxwirebox(.4,.,.4; 22
OpenGL przykłd uproszczony model robot // Rysownie sceny (cd: gltrnsltef (.,.5,.; glrottef ((GLflot wrist,.,.,.; gltrnsltef (.,.5,.; uxwirebox(.4,.,.4; glpopmtrix(; glflush(; } 23