Programmering grunnkurs TDAT: Grafikkdel Leksjon G: Transformasjoner Fra modell til tegning på skjerm side Modell Plantransformasjoner/translasjon side 3 Modell Plantransformasjoner/skalering side 4 Modell Plantransformasjoner/rotasjon side 5 Modell Transformasjonsligningen på matriseform side 6 Modell 3D-transformasjoner: Homogene koordinater side 7 Modellkoordinatsystem: OpenGL metode-/kommandosyntaks side 8- View koordinatsystem side - Projeksjonstransformasjoner side 3-5 Viewport: Uttegningsindu side 6 Programeksempel: Transformert kube/terning side 7-9 Effekt a parameterendringer. Noen kjørbare eksempler side Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side
Fra Modell til tegning på skjerm OpenGL metoder: Steg : gl.gltranslatef(); gl.glrotatef(), gl.glscalef() Steg : glu.glulookat() Steg 3 og 4: gl.gfrustum(), glu.gluperspectie(), gl.glortho(), glu.gluorthod() Steg 5: gl.glviewport() Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side
Modell. Plantransformasjoner:Translasjon Tre grunnleggende operasjoner i planet: translasjon, skalering og rotasjon. Translasjon Med translasjon forstår i å flytte, eller parallellforskye, en figur. Vi tar utgangspunkt i et enkelt punkt. Dette er en enkel operasjon som er lett å formulere matematisk. Vi il flytte punktet P til en ny posisjon P. P = (x,y) = (3,3) P = (x,y) = (8,5) Vi ser uten idere at x = x + 5 y = y + Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 3
Modell. Plantransformasjoner: Skalering P = (x,y) = (3,3) Vi "skalerer" punktet ed å multiplisere med en skaleringsfaktor i x-retningen, sx =, og en i y-retningen, sy = 3, og får P=(x,y)=(6,9) Sammenhengen er altså: x = sx x y = sy y Ved skalering a et polygon, il i tillegg til at hjørnepunktene flyttes, også inkler og areal endres. Skalering er uttrykt i forhold til origo Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 4
Modell. Plantransformasjoner: Rotasjon P= (x,y) = (r cos(), r sin()) P= (x,y) = (r cos(+), r sin(+)) sin (+) = cos() sin() + sin() cos() cos (+) = cos() cos() - sin() sin() P = (x,y) = (r cos(), r sin() ) P = (x,y) = (r cos(+), r sin(+)) P = (r cos() cos() - r sin() sin(), r cos() sin() + r sin() cos()) x = r cos() y = r sin() x = x cos() - y sin() y = x sin() + y cos() P = (x,y) = (x cos() - y sin(), x sin() + y cos() Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 5
Modell: Transformasjonsligningene på matriseform De tre basistransformasjonene i D kan beskries ed følgende likningssett: Translasjon bestemt ed tx og ty: x = x+tx, y = y+ty Skalering bestemt ed sx og sy: x = sx x, y = sy y Rotasjon bestemt ed : x = x cos()-y sin(), y = x sin()+y cos() ( = på forrige slide) På matriseform kan disse likningene skries: Translasjon: Skalering: Rotasjon x y x y tx ty x y sx x * sy y x y cos sin Ved bruk a homogene-koordinater blir alle matrisene kadratiske : sin x * cos y x y tx ty x * y x y sx sy x * y x y cos sin sin cos x * y Alle tre basistransformasjonene kan dermed skries på samme form: P = M * P Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 6
Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 7 Modell. Romtransformasjoner: Homogene koordinater 3D-transformasjoner på matriseform: P = M * P Translasjon Skalering gl.gltranslatef(txf,tyf,tzf); gl.glscalef(sxf,syf,szf); * z y x tz ty tx z y x * z y x sz sy sx z y x * cos sin sin cos z y x z y x * cos sin sin cos z y x z y x * cos sin sin cos z y x z y x Rotasjon rundt: Z-aksen X-aksen Y-aksen gl.glrotatef(f,.f,.f,.f) gl.glrotatef(f,.f,.f,.f) gl.glrotatef(f,.f,.f,.f)
Modellkoordinatsystem: OpenGL metode-/kommandosyntaks Translasjon: gl.gltranslate{fd}( Type x, Type y, Type z) Mulitipliserer den gjeldende matrisen med en translasjonsmatrise som forflytter objektet med de angitt Type x, Type y, Type z - erdiene. Figure 3-5 : Translering a et objekt Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 8
Modellkoordinatsystem: OpenGL metode-/kommandosyntaks Rotasjon gl.glrotate{fd}(type angle, TYPE x, TYPE y, TYPE z); Multipliserer den gjeldende matrisen med en rotasjonsmatrise som roterer et objekt en inkel angle i retning mot uriseren rundt aksen gitt ed ektoren fra origo til punktet (TYPE x, TYPE y, TYPE z ) Effekten a gl.glrotatef(45.f,.f,.f,.f), som er en rotasjon på 45 grader mot uriseren, rundt z-aksen er ist i figuren. (,f,,f,.f) angir rotasjonsaksen som her er en enhetsektor fra origo til punktet (,,) på z-aksen. Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 9
Modellkoordinatsystem: OpenGL metode-/kommandosyntaks Skalering gl.glscale{fd}(typex, TYPE y, TYPEz) Multipliserer den gjeldende matrisen med en matrise som strekker, krymper eller speiler et objekt langs aksene i WC. Alle (x,y,z) koordinatene på alle punktene på objektet blir multiplisert med de respektie erdiene angitt i parameterlista til metoden: TYPE x, TYPE y, TYPE z. gl.glscale er den eneste a modelltransformasjonene som endrer størrelse og form på et objekt. Figure 3-7 Viser effekten a gl.glscalef(.f, -.5f,.f). Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side
View koordinatsystemet Viewing systemet, beskreet med aksene (u,,n), spesifiserer horfra og hordan i ser objektet, ds. hordan i orienterer et kamerae når i skal ta et bilde a modellobjektet årt. Dette systemet er bestemt ut fra følgende spesifikasjoner a hordan i ser modellen: View Reference Point, VRP, som er et punkt i et plan parallelt med projeksjonsplanet. Vi kan godt tenke på dette planet som projeksjonsplanet. View Reference Normal, VRN, som er en normal til projeksjonsplanet, oppreist i VRP. VRN faller sammen med n-aksen i det nye koordinatsystemet Et øyepunkt som ligger på VRN: Dersom i har en parallellprojeksjon ligger øyepunktet uendelig lang ute på VRN En angielse a ha som er opp, VUP. Dette for å skille VUP fra de to andre aksene, u og. u, gis retninger slik at u,, n definerer et rettinklet høyrehånds koordinatsystem. Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side
View koordinatsystemet: glu.glulookat(gldouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); glu.glulookat() er sammensatt a gl.gltranslate() og gl.glrotate() metoder. Gir Samme effekt som bruk a glu.glulookat() kan oppnås ed å benytte gl.gltranslate() og eller gl.glrotate() direkte: gl.gltranslatef(.f,.f, -5.f); glu.glulookat(.,., 5.,.,.,.,.,.,.); Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side
Projeksjonstransformasjoner: Bestemmer synspyramiden /synsolumet og hordan objektet blir projisert ned på skjermen. OpenGL tilbyr to typer projeksjonstransformasjoner: Perspekti- og ortogonaltransformasjoner. Perspektitransformasjon: gl.glmatrixmode(gl.gl_projection); gl.glfrustum(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 3
Perspektitransformasjon: Projeksjonstransformasjoner: Figure 3- : The Perspectie Viewing Volume Specified by glu.gluperspectie() glu.gluperspectie(gldouble foy, GLdouble aspect, GLdouble znear, GLdouble zfar); Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 4
Ortogonaltransformasjoner: Projeksjonstransformasjoner: Figure 3-3 : The Orthographic Viewing Volume spesifisert ed gl.glortho() gl.glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); glu.gluorthod(gldouble left, GLdouble right, GLdouble bottom, GLdouble top); -. < z <. (D- bildet projiseres ned på skjermen) Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 5
Viewport:Uttegningsindu Viewport: Angir størrelsen på det rektangulære induet på skjermen der bildet skal presenteres Måles i skjermkoordinater, ds pixler Figure 3-5 : Mapper the Viewing Volume til the Viewport gl.glviewport(glint x, GLint y, GLsizei width, GLsizei height); Eks: Disse to etterfølgende OpenGL-metodekallene il tegne det som ligger innenfor en synspyramide med kadratisk bunnflate, som et kadratisk bilde på skjermen: glu.gluperspectie(myfoy,., mynear, myfar); gl.glviewport(,, 4, 4); Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 6
Programeksempel: Transformert kube/terning import com.sun.opengl.util.glut; priate GLU glu = new GLU(); priate GLUT glut = new GLUT(); /** oid init(glautodrawable gldrawable) */ public oid init(glautodrawable gldrawable) { GL gl = gldrawable.getgl(); gl.glmatrixmode(gl.gl_projection); // Select the projection Matrix gl.glloadidentity(); // Reset the Matrises to Unity alues glu.gluperspectie(6.,.,.,.); // Defines the projection and iewing olume (synspyr) // glu.gluorthod(., 4.,., 4.); // Defines the projection and iewing olume // gl.glortho(., 4.,.,4.,.,.); // Defines the projection and iewing olume gl.glmatrixmode(gl.gl_modelview); gl.glloadidentity(); } // Select the Modeliew Matrix // Reset the ModelView Matrix Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 7
Programeksempel: Transformert kube/terning import com.sun.opengl.util.glut; public oid drawglscene( GLAutoDrawable gldrawable) { GL gl = gldrawable.getgl(); gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT); gl.glloadidentity(); gl.glcolor3f(.f,.f,.f); glu.glulookat(.,.,9.,.,.,.,.,.,.); gl.glrotatef( 45.f,.f,.f,.f ); // 3. M(Rotate) gl.gltranslatef(.f,.f,.f ); //. M(Translate) gl.glscalef(.f,.f,.f ); //. M(Scale) utføres først glut.glutwirecube(3.f); } /** oid display() Draw to the canas. */ // Purely a Jaa thing. Simple calls drawglscene() once GL is initialized public oid display(glautodrawable gldrawable) { GL gl = gldrawable.getgl(); drawglscene(gldrawable); // Calls DrawGLScene3 gl.glflush(); // Tinger tidligere buffrede OpenGL komand. til å utføres med en gang. } Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 8
Programeksempel: Transformert kube/terning Rekkefølgen matriseoperasjonene utføres i har betydning for resultatet: gl.glrotatef( 45.f,.f,.f,.f ); gl.gltranslatef(.f,.f,.f ); gl.gltranslatef(.f,.f,.f ); gl.glrotatef( 45.f,.f,.f,.f ); gl.glscalef(.f,.f,.f ); gl.glscalef(.f,.f,.f ); P = Mr * Mt * Ms * P P = Mt * Mr * Ms * P Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side 9
Noen kjørbare eksempler Nate Robins har samlet et fint sett med tutorials som iser effekten a parameterendringer for en rekke metoder. Det er ist eksempler på ulik bruk a tegneprimitier, transformasjoner, projeksjoner, lysposisjoner, interaksjoner mellom lys og materialegenskaper, tåkelegging og tekstur. Last ned og kjør programmene fra web-siden: http://www.xmission.com/~nate/tutors.html Programmering grunnkurs TDAT-A Grafikkdelen: Introduksjon til OpenGL med Jaabinding JOGL Jan H. Nilsen Leksjon, side