890 likes | 1.1k Views
Del 2 Grafisk databehandling forts. y. d x. x. x ´. ( x, y ). P = , P ´ = , T =. y. y ´. d y. d y. ( x ´ , y ´). d x. x. 2D Transformasjoner (s. 51 i VTK boken) Translasjon. x ´ = x + d x , y ´ = y + d y. På matriseform:. P ´ = P + T. y. s x. 0. S =.
E N D
y dx x x´ (x, y) P = , P´= , T = y y´ dy dy (x´, y´) dx x 2D Transformasjoner (s. 51 i VTK boken)Translasjon x´ = x + dx , y´ = y + dy På matriseform: P´= P + T IN229 / V03 / Dag 6
y sx 0 S = sy 0 x Skalering x´ = sx · x, y´ = sy ·y På matriseform: P´= S · P IN229 / V03 / Dag 6
y x Rotasjon x´ = x ·cos – y ·sin, y´ = x ·sin + y ·cos På matriseform: cos –sin R = sin cos P´= R · P IN229 / V03 / Dag 6
Problem Translasjon: P´= T + P Addisjon! Skalering: P´= S · P Rotasjon: P´= R · P • Ønsker å behandle alle transformasjoner som matrisemultiplikasjon • Løsning: Innfør homogene koordinater! IN229 / V03 / Dag 6
Homogene koordinater • Legg til en tredje koordinat: (x, y, w) • Regel 1: To punkter er like hvis de er et multippel av hverandre (punktet (10, 4, 2) er det samme som (5, 2, 1)). • Regel 2: Punktet (0, 0, 0) er ikke tillatt. • Regel 3: Hvis w 0 kan vi dividere med w og få ut punktets “kartesiske koordinater” x/w og y/w (dvs. de som tegnes på skjermen!) Homogene koordinater er også nyttige for 3D2D projeksjoner (gjennomgås senere). IN229 / V03 / Dag 6
1 0 dx y T(dx, dy) = 0 1 dy 0 0 1 (x, y) x´ = x + dx dy y´ = y + dy (x´, y´) dx x Translasjon x´ 1 0 dx x y´ y = · 0 1 dy 1 0 0 1 1 w P´= T(dx, dy) · P IN229 / V03 / Dag 6
y x Skalering sx 0 0 x´ = sx · x sy S(sx,sy) = 0 0 y´ = sy · y 0 0 1 sx x´ x 0 0 sy y´ y 0 0 = · 1 1 0 0 1 P´= S(sx,sy) · P IN229 / V03 / Dag 6
y x Rotasjon cos –sin 0 x´ = x ·cos – y ·sin R() = sin cos 0 y´ = x ·sin + y ·cos 0 0 1 cos –sin 0 x´ x sin cos 0 y´ y = · 1 1 0 0 1 P´= R() · P IN229 / V03 / Dag 6
Påfølgende transformasjoner av samme typeTranslasjon y P´ = T(dx1,dy1)· P P´´= T(dx2,dy2)· P´ P´´= T(dx2,dy2)· (T(dx1,dy1)· P) = (T(dx2,dy2)· T(dx1,dy1))· P = T(dx1+ dx2, dy1+ dy2)· P P P´´ 1 0 dx2 1 0 dx1 1 0 dx1 + dx2 P´ · = 0 1 dy2 0 1 dy1 0 1 dy1 + dy2 0 0 1 0 0 1 0 0 1 x Translasjon er kommutativt - rekkefølgen likegyldig! IN229 / V03 / Dag 6
Skalering P´ = S(sx1,sy1)· P P´´= S(sx2,sy2)· P´ P´´= S(sx2,sy2)· (S(sx1,sy1)· P) = (S(sx2,sy2)· S(sx1,sy1))· P = S(sx1· sx2, sy1· sy2)· P sx2 0 0 sx1 0 0 sx1· sx2 0 0 · = 0 sy2 0 0 sy1 0 0 sy1· sy2 0 0 0 1 0 0 1 0 0 1 Skalering er også kommutativt! IN229 / V03 / Dag 6
Rotasjon Oppgave! IN229 / V03 / Dag 6
cos –sin 0 0 sin cos 0 0 1 Påfølgende transformasjoner av ulik type • R() roterer et punkt P om origo. • Hvordan kan vi rotere P om et vilkårlig punkt P1? • Løsning: Translater P1 til origo, rotér og translater tilbake! y y y y P1 P1 x x x x x1 –x1 1 0 1 0 y1 –y1 · · T(x1, y1) · R() · T(–x1, –y1) = 0 1 0 1 0 0 1 0 0 1 cos –sin x1(1 – cos) + y1sin y1(1 – cos) + x1sin = sin cos 0 0 1 IN229 / V03 / Dag 6
x1 1 0 0 sx 0 y1 0 1 0 0 sy 0 0 1 0 0 1 Eksempel 2 - skalering om et vilkårlig punkt y y y y P1 P1 x x x x –x1 1 0 –y1 T(x1, y1) · S(sx, sy) · T(–x1, –y1) = · · 0 1 0 0 1 sx 0 x1(1 – sx) sy y1(1 – sy) = 0 0 0 1 IN229 / V03 / Dag 6
M1 M2 Translasjon Translasjon Skalering Skalering Rotasjon Rotasjon Uniform skalering (sx = sy) Rotasjon Kommutativitet - oppsummering • La M1 og M2 representere hver sin basale transformasjon. • M1 og M2kommuterer (M1 · M2= M2 · M1) i følgende tilfeller: IN229 / V03 / Dag 6
Inverse transformasjoner • T(dx, dy)–1 = T(–dx, –dy) • S(sx, sy)–1 = S(1/sx, 1/sy) • R()–1 = R(–) IN229 / V03 / Dag 6
Påfølgende translasjoner og rotasjonerbevarer lengde! P2 P1´ R · T · T · R · T · R ·R · ... · T P2´ P1 P1P2 = P1´P2´ IN229 / V03 / Dag 6
3D Transformasjoner • Generalisering av 2D transformasjoner! (Samme regler for påfølgende transformasjoner, inverser etc.) IN229 / V03 / Dag 6
1 0 0 dx 0 1 0 dy 0 0 1 dz 0 0 0 1 Translasjon T(dx, dy , dz) = T(dx, dy, dz)· [x, y, z, 1]T = [x + dx, y + dy, z + dz, 1]T IN229 / V03 / Dag 6
Skalering sx 0 0 0 sy 0 0 0 S(sx, sy , sz) = sz 0 0 0 0 0 0 1 S(sx, sy, sz)· [x, y, z, 1]T = [sx·x, sy·y, sz·z, 1]T IN229 / V03 / Dag 6
Rotasjonsretning og høyrehåndskoordinater Rotasjonsakse z y (vekk fra publikum!) z Positiv rotasjon y z x y x x IN229 / V03 / Dag 6
0 –1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 Rotasjon om z aksen 2D rotasjonen som vi har sett på tidligere, R(),er egentlig en 3D rotasjon om z aksen! cos –sin 0 0 z sin cos 0 0 Rz() = y 0 0 1 0 0 0 0 1 x Kontroll: Rotér[1, 0, 0, 1]T90°: · = IN229 / V03 / Dag 6
0 0 0 1 Rx() = cos –sin 0 0 sin cos 0 0 0 0 0 1 cos sin 0 0 0 1 0 0 Ry() = –sin cos 0 0 0 0 0 1 Rotasjon om x og y aksen IN229 / V03 / Dag 6
y y P3 x x z z P2 P3 P1 P1 P2 Eksempel • Steg 1: Translater P1 til origo • Steg 2: Rotér om y aksen slik at P1P2 ligger i yz planet. • Steg 3: Rotér om x aksen slik at P1P2 ligger på z aksen. • Steg 4: Rotér om z aksen slik at P1P3 ligger i yz planet. IN229 / V03 / Dag 6
1 0 0 –x1 0 1 0 –y1 T(–x1, –y1, –z1) = 0 0 1 –z1 y 0 0 0 1 x z P3´ Steg 1: Translater P1 til origo. P2´ P1 P1´ 0 0 P1´ = T(–x1, –y1, –z1)· P1 = 0 1 x2 – x1 x3 – x1 y2 – y1 y3 – y1 P2´ = T(–x1, –y1, –z1)· P2 = P3´ = T(–x1, –y1, –z1)· P3 = z2 – z1 z3 – z1 1 1 IN229 / V03 / Dag 6
x2´ z2´ z2 – z1 cos(– 90) = sin = = D1 D1 D1 x2 – x1 sin(– 90) = – cos = – = – D1 Rotasjonsvinkelen er –(90 – ) = – 90. y Videre har vi at Steg 2: Rotér om y aksen slik at P1P2 ligger i yz planet. P2´´ P2´(x2´, y2´, z2´) x D1 der z (x2´, 0, z2´) D1 = (z2´)2 + (x2´)2 = (z2 – z1)2 + (x2 – x1)2 Ved å substituere disse verdiene inn i Ry( – 90) får vi som forventet P2´´ = Ry( – 90) ·P2´ = [0 y2 – y1 D1 1]T IN229 / V03 / Dag 6
y2´´ z2´´ D2 D2 Rotasjonsvinkelen er , og y cos = , sin = y2´´ der Steg 3: Rotér om x aksen slik at P1P2 ligger på z aksen. P2´´ D2 D2 =P1´´P2´´ = P1P2 x P2´´´ z2´´ z = (x2 – x1)2 + (y2 – y1)2 + (z2 – z1)2 Resultatet blir igjen som forventet P2´´´ = Rx()·P2´´ = Rx()·Ry( – 90) ·P2´ = Rx()·Ry( – 90) ·T(–x1, –y1, –z1) ·P2 = [0 0 P1P21]T IN229 / V03 / Dag 6
y3´´´ x3´´´ D3 D3 Rotasjonsvinkelen er , og y cos = , sin = y3´´´ P3´´´ der Steg 4: Rotér om z aksen slik at P1P3 ligger i yz planet. D3 D3 = (x3´´´)2 + (y3´´´)2 x3´´´ x z Den totale transformasjonen blir: Rz()·Rx()·Ry( – 90) ·T(–x1, –y1, –z1) IN229 / V03 / Dag 6
y x z y z x Projeksjon • Å avbilde noe ned på færre antall dimensjoner • 3D2D projeksjon i grafisk databehandling • Avbilde objekter i objektrommet ned på bildeplanet i bilderommet IN229 / V03 / Dag 6
Parallellprojeksjon • Bevarer parallelle linjer • Fjerne og nære objekter ser like store ut IN229 / V03 / Dag 6
Perspektivprojeksjon • Bevarer ikke nødvendigvis parallelle linjer • Fjerne objekter ser mindre ut enn nære IN229 / V03 / Dag 6
z y x Spesifikasjon av 3D syn(s. 46 i VTK-boka) Opp-vektor (VUP) y Syns-koordinat System Verdens-koordinat System (xmax, ymax) Fokuspunkt Kamera Posisjon x z (xmin, ymin) Synsutsnitt (Viewport) Bildeplan-normal / Projeksjonsretning IN229 / V03 / Dag 6
Antar zk > 0 og zk > z ! Antar fokuspunkt i z = 0 ! zk 1 0 0 0 0 1 0 0 0 0 0 0 0 0 –1/zk 1 Transformasjonmatrisen Mper for perspektivprojeksjon x P (x, y, z) y xp P (x, y, z) z Pp(xp, yp, zp= 0) –z y P (x, y, z) yp x Pk (xk= 0, yk = 0, zk) z z zk –z xp zk x x x xp = = , = zk – z 1 – (z / zk) zk zk – z Mper = yp zk y y y yp = = , = zk – z 1 – (z / zk) zk zk – z IN229 / V03 / Dag 6
zk x lim lim lim = x = 0 = 1 0 0 0 z0 zk– z zk0 zk0 0 1 0 0 0 0 0 0 x x x 0 0 –1/zk 1 1 – (z/zk) 1 – (z/zk) 1 – (z/zk) x x y y = Pp = Mper·P= z 0 w 1 1 – (z/zk) Ok! Kartesiske koordinater (som plottes på skjerm): (x/w, y/w, z/w) = (x/(1 – (z/zk)), y/(1 – (z/zk)), 0) Kontroll: x lim = x z ( parallell projeksjon!) zk IN229 / V03 / Dag 6
Basisalgoritme, uten klipping, for 3D2D transformasjon med perspektivprojeksjon Steg 1: Multipliser punktene i det grafiske primitivet GP med syns-orienteringsmatrisenMorient definert som følger: 1.1: Translater origo i synskoordinat-systemet til origo i verdenskoordinat-systemet: T(dx, dy, dz) 1.2: Rotér synskoordinat-systemet slik at aksene sammenfaller med verdenskoordinat-systemet: R() ·R() ·R() Morient = R() ·R() ·R() ·T(dx, dy, dz) GP´ = Morient ·GP verdenskoordinater synskoordinater! Steg 2: Multipliser punktene i GP´ med transformasjonsmatrisen Mper for perspektivprojeksjon. GP´´ = Mper·GP´ = Mper·Morient ·GP synskoordinater bildeplan! IN229 / V03 / Dag 6
x x = xmax z Problem 1 Projiserte x- og y-koordinater for store når opprinnelige x- og y-koordinater er store. IN229 / V03 / Dag 6
lim = zzk x 1 – (z/zk) Problem 2 Projiserte x- og y-koordinater for store når z nærmer seg zk: x z Eksempel: z = zk z IN229 / V03 / Dag 6
Klipping Fjerning av de delene av et grafisk primitiv som faller utenfor et område. IN229 / V03 / Dag 6
Antar zk > 0 og zk > zf og zf > zb ! Synsvolum y z y Front klippeplan x Bakre klippeplan x zb zf Pk (xk, yk, zk) z IN229 / V03 / Dag 6
z = zf z = zk z 3D2D transformasjon med klipping Steg 1: Transformer GP fra 3D verdenskoordinater til 3D synskoordinater vha. Morient. Steg 2: Klipp GP mot synsvolumet. Steg 3: Transformer GP fra 3D synskoordinater til 2D synskoordinater (dvs. bildeplanet) vha. Mper. • Problem 1 løses automatisk! • Problem 2 løses ved å definere en minimumsavstand mellom kameraet og front-klippeplanet! Eksempel: IN229 / V03 / Dag 6
Antar fra nå av at de grafiske primitivene er polygoner Skjulte flater(s. 61 i VTK-boka) y Ok! x z IN229 / V03 / Dag 6
“Painter’s algorithm” - enkel variant Steg 1: Sorter polygonene i henhold til punktet med lavest (fjernest) z-verdi. Steg 2: Tegn (rasteriser) polygonene “back to front” rekkefølge, dvs. først det med lavest z-verdi, så det med nest-lavest z-verdi osv. Problem: Polygoner som overlapper i z-retning: IN229 / V03 / Dag 6
“Painter’s algorithm” - utvidelse Steg 0: Splitt opp polygoner som overlapper i z-retning! Problem: Tar ekstra tid og plass! IN229 / V03 / Dag 6
Z-buffer algoritmen • Behandler alle polygonene i synsvolumet (etter at de er klippet mot dette). • Bak-klippeplanet gis z-verdi 0. • Front-klippeplanet gis z-verdi zmax. • Polygonene gis z-verdier relativt til 0 og zmax. • I hvert pixel lagres z-verdien 0. • Hvert pixel farges med bakgrunnsfargen. IN229 / V03 / Dag 6
Algoritmisk: for <hvert polygon> do for <hvert pixel i polygonets projeksjon> do z = <avstanden fra bildeplanet til polygonet gjennom pixelet> if <z >= pixelets z-verdi> then <pixelets nye z-verdi = z> <pixelets nye farge = polygonets farge (i dette pixelet)> fi od od IN229 / V03 / Dag 6
5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 0 5 5 5 5 5 5 0 0 3 5 5 5 5 5 0 0 0 4 3 5 5 5 5 5 0 0 0 0 5 4 3 6 5 3 5 5 5 0 0 0 0 0 6 5 4 3 7 6 5 4 3 5 5 0 0 0 0 0 0 7 6 5 4 3 8 7 6 5 4 3 5 0 0 0 0 0 0 0 8 7 6 5 4 3 0 0 0 0 0 0 0 0 a) = + b) = + IN229 / V03 / Dag 6
0 Vurdering av z-buffer algoritmen • Hovedfordel: Enkel og rask (ingen forhåndssortering nødvendig etc.). • Ulempe 1: Krever ekstra minne. • Ulempe 2: Kan fungere dårlig hvis avstanden mellom front- og bak-klippeplanet er for stort: Samme z-buffer verdi! FKP BKP z zmax zi+1 zi 1 • Løsning: • Øk oppløsningen på z-bufferet (antall bit pr pixel) (avveining mellom ulempe 1 og 2), og/eller • Reduser avstanden mellom front- og bak-klippeplanene. IN229 / V03 / Dag 6
Hvordan finne z-verdien i et pixel for et polygon? z-verdi = ? IN229 / V03 / Dag 6
Finn et uttrykk for projeksjonslinjen gjennom pixelet. Finn et utrykk for planet som polygonet ligger i. Finn z-verdien ved å skjære og ! Uttrykk for projeksjonslinjen gjennom pixelet. y Parametrisk: Pp(xp, yp, 0) Pk + t (Pp – Pk) , t 0 x = t xp y = t yp z = (1 – t) zk , t 0 x z Pk (0, 0, zk) IN229 / V03 / Dag 6
Uttrykk for planet som polygonet ligger i. Tre punkter i polygonet som ikke ligger langs samme linje Kryssprodukt Punkt i polygon Normal Prikkprodukt = 90° Ligning for planet IN229 / V03 / Dag 6