Tampereen yliopisto Tietokonegrafiikka 201 Tietojenkäsittelytiede Harjoitus 6 1..201 1. Tarkastellaan Gouraudin sävytysmallia. Olkoon annettuna kolmio ABC, missä A = (0,0,0), B = (2,0,0) ja C = (1,2,0) ja vastaavat normaalit kulmapisteissä n A = (0,0,1), n B = (0.18,0.6,0.91), n C = (0.7,0,0.9). Monikulmion materiaalin arvot ovat k a = 0., k d = 0.2, k s = 0.5 ja n =. Olkoon pistemäinen valonlähde pisteessä L = (2,, 5) ja siitä monikulmioon tulevan valon intensiteetti I L = 1.0 ja hajavalon intensiteetti I a = 0.5. Oletetaan vielä, että katsoja on pisteessä E = (0,0,5). Laske Gouraudin mallin mukainen havaittu intensiteetti pisteessä (0.5, 0.5, 0). Laskut voi tehdä likiarvoilla. 2. Sama kuin edellinen tehtävä, mutta käyttäen Phongin sävytysmallia.. Luennoilla aletaan piakkoin käsitellä pinnoitustekniikoita, kuten teksturointia. Monikulmion pinnalla olevia attribuutteja interpoloidaan yleensä lineaarisesti maailman koordinaatistossa, ts. jos attribuutin, kuten värin, arvo jonkin janan päätepisteessä on v 0 ja toisessa päätepisteessä v 1 on sen arvo pisteiden välissä v(t) = v 0 +t(v 1 v 0 ),0 t 1. Piirrettäessä rasterille ei kuitenkaan voida tehdä näin, koska perspektiiviprojektio aiheuttaa sen, että tasavälein maailman koordinaatistossa lasketut arvot eivät ole tasavälein ruudulla ja toisin päin. Tarkastellaan ao. tilannetta. x(0) x(t) x(1) z(1) z(t) z(0) x (0) x (s) x (1) z = 1 z = 0 Tarkastellaan perspektiiviprojektiota tasolle z = 1, kun projektion keskipiste on tasolla z = 0. Maailman koordinaatistossa janan x-koordinaatit saadaan kaavalla x(t) = x 0 +t(x 1 x 0 ),0 t 1 (vastaavasti z-koordinaatit z(t)). 1
Projisoidunpisteenx-koordinaattisaadaanx = x/z,jotenprojisoidunjanan x-koordinaatit ovat x (s) = x 0 + s(x 1 x 0),0 s 1. Oheisen konstruktion avulla saadaan projisoidun ja alkuperäisen janan x-koordinaattien välille yhteys x (s) = x(t)/z(t). Määritä tästä kaava, jolla saadaan muuttujaa s vastaava muuttujan t arvo. Käytännössä piirrettäessä interpoloidaan ruudulla, joten tästä saadaan oikea (= perspektiivikorjattu) attribuutin arvo pikselille. Vihje: Laske arvojen x 0 ja x 1 kertoimet molemmilla puolilla (huom. x 0 +t(x 1 x 0 ) = (1 t)x 0 +tx 1 ) ja merkitse yhtäsuuriksi. Allekirjoittanut sai vastaukseksi t = sz 0 /(z 1 s(z 1 z 0 )). Mitä suhteelle tapahtuu, jos projektiotaso onkin etäisyydellä n? -5. Kirjoita ohjelma, joka piirtää GL TRIANGLE STRIP piirtotavalla D- esityksenä funktion f(x,z) = 0.2x 2 +0.z 2 kuvaajan. Voit tehdä vaikkapa Mesh-luokan,jossa määrittelet x-,y- ja z-arvot jokaiselle piirrettävälle kulmapiseelle. Ohjelmassa funktion arvoalueen x- ja z-suuntaiset alueet muodostavat neliön. Parametreina ohjelma käyttää x- ja z-suunnan maksimi ja minimiarvoja sekä arvoja dx ja dz, joilla määrätään piirrettävän x- ja z-suuntaisten pisteiden välimatka. Toisin sanoen piirrettävän verkon tiheys. Täydennä ohjelmaa siten, että se käyttää valaistusta. Tätä varten pitää laskea kulmapisteille normaalivektorit. Tämän voi tehdä keskiarvoistamalla yhteen kulmapisteeseen liittyvien kolmioiden normaalivektorit. x- ja z- suuntainen kulmapisteverkko voidaan tehdä esimerkiksi positiivisessa x- ja z-alueessa. Tämän jälkeen sen voi siirtää origoon vaikkapa vähentämällä jokaisesta kulmapisteen x- ja z-komponentista koko verkon x- ja z-suuntaiset keskiarvot. Tämän tehtävän idea on lähellä ns. korkeuskartan height map ideaa. Erotuksena on ainoastaan se, että korkeusarvot y lasketaan, eikä niitä lueta tiedostosta. Tällä tekniikalla voidaan toteuttaa esimekkiksi erilaisia maaston muotoja sovelluksissa. Esimerkki 1 Olkoon katsoja pisteessä E = (1, 2, 5), kolmion ABC kulmat pisteissä A = (0,0,0), B = (1,0,0), C = (0,1,0), normaalit kulmissa n A = (0,0,1), n B = (0.6,0,0.89), n C = (0,0.6,0.89), pistevalo pisteessä L = ( 1,0,2), valon kolmioon tuleva intensiteetti I = 0.5, hajavalo I a = 0.2 ja kolmion materiaalin parametrit k a = 0.1, k d = 0.6, k s = 0., n = 2 (huom. parametrit summautuvat arvoon 1). Lasketaan Gouraudin sävytysmallin antama intensiteettiarvo I P pisteessä P = (0.25,0.25,0). 2
n C C r C v C E A P B L l C n A n B Kulmapisteessä A tulevan valon suunta l A on heijastussuunta r A saadaan l A = A L A L = 1 5 (1,0, 2) (0.6,0, 0.89), r A = l A 2(l A n A )n A = (0.6,0, 0.89) 2( 0.89)(0,0,1) = (0.6,0,0.89) ja suunta katsojaan kulmapisteestä v A on v A = E A E A = 1 0 (1,2,5) (0.18,0.7,0.91). Gouraudin mallin mukaan havaittu intensiteetti pisteessä A on I A = k a I a +I L (k d ( l A n A )+k s (r A v A ) n ). Huom. Käytetään l A, koska laskettiin tulosuunta; kirjan formulointi laskee vektorin toisin päin. Spekulaarin komponentin arvo on (r A v A ) n = ((0.6,0,0.89) (0.18,0.7,0.91)) 2 = 0.89 2 0.8 ja diffuusin komponentin arvo on Intensiteetti I A pisteessä A on (l A n A ) = (0.6,0,0.89) (0,0,1) = 0.89. I A = 0.1 0.2+0.5(0.6 0.89+0. 0.8) = 0.07 0.1. Vastaavasti saadaan I B 0.11 ja I C 0.2. Intensiteettiä I B laskettaessa huomataan myös, että spekulaarin komponentin arvo ennen potenssiin korotusta on
negatiivinen, tällöin spekulaari komponentti on 0 eli ei ole sellaista kuin negatiivinen valo. Kirjassa tämä pikkuseikka on sivuutettu tekstin sekaan jätetyllä maininnalla. Intensiteetti I P pisteessä P lasketaan interpoloimalla kulmapisteiden intensiteettiarvoja. Interpoloidaan ensin reunaa AC pitkin pisteeseen(0, 0.25). Tästä saadaan arvo 0.75 I A +0.25 I C = 0.6. Arvo on vain painotettu keskiarvo pisteiden A ja C intensiteeteistä; painotus tapahtuu etäisyydellä. Vastaavasti interpoloidaan pitkin reunaa BC pisteeseen (0.75, 0.25) (tässä tapauksessa leikkauspiste vaakasuoran y = 0.25 kanssa on helppo laskea). Tässä pisteessä intensiteetti on 0.75 I B +0.25 I C = 0.1. Huom. Yllä painotetussa keskiarvossa arvot eivät ole koordinaatin arvot, vaan suhteellinen etäisyys pisteisiin B ja C janalla BC. Tässä tapauksessa ne vain sattuvat olemaan samat. Lähempänä olevaa pistettä painotetaan tietenkin enemmän. Janan BC yhtälö on BC(t) = B + t(c B),0 t 1, ja interpoloidut arvot saadaan vastaavasti I(t) = I B +t(i C I B ) = (1 t)i B +ti C. Leikkaus tapahtuu t:n arvolla 0.25, josta em. tulos seuraa. Lopuksi interpoloidaan pisteiden (0, 0.25) ja (0.75, 0.25) välillä intensiteettiä pisteeseen (0.25, 0.25), joka on 1/ etäisyyden päässä pisteestä (0.0, 0.25) joten I P = 2 0.5+1 0.1 0.28. Esimerkki 2 Suoritetaan edellisen esimerkin laskelmat Phongin valaistusmallilla. Ensin lasketaan normaali n P pisteessä P interpoloimalla kulmien normaaleja reunoja pitkin. n C C n AC n P na P A n BC B n B
Pisteessä (0,0.25) normaali n AC on n AC = n A +n B = 0.25(0,0.6,.89) = (0,0.12,0.97) ja vastaavasti pisteessä (0.75, 0.25) normaali on n BC = n B +n C = 0.25(1.8, 0.6,.56) = (0.5, 0.12, 0.89). Interpoloinnilla näiden normaaleiden välillä saadaan normalisoimaton normaali pisteessä P n P = 2n AC +n BC = (0.18, 0.12, 0.9). Varsinainen normaali saadaan normalisoimalla eli Valon tulosuunta pisteessä P on ja heijastussuunta l P = P L P L n P = n P n P = (0.19,0.12,0.97). = 0.2(1.25,0.25, 2.0) = (0.5,0.11, 0.8) r P = l P 2(l P n P )n P = (0.5,0.11, 0.8) 2( 0.7)(0.19,0.12,0.97) = (0.80,0.28,0.52). Katsojan suunta on v P = E P E P Spekulaarin komponentin pistetulo on = 0.186(0.75,1.75,5) = (0.1,0.,0.9) r P v P 0.69, joten spekulaari komponentti on (0.69) 2 = 0.7. Diffuusi komponentti on Sijoittamalla valaistusyhtälöön saadaan l P n P = 0.7. I P = 0.1 0.2+0.5(0.6 0.7+0. 0.7) = 0.. 5