2006-11-09 B. csoport

A VIK Wikiből
(SzgGrafZH20061109B szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


Adott egy háromszög világkoordinátarendszerben (1,1,0), (0,2,1), (0,4,2) csúcsokkal amelyekben az árnyalónormálok rendre (2,0,0), (0,3,4), (3,0,4). A világban egy irányfényforrás van, amely a (3,4,0) irányból világít. A fényforrás intenzitása az RGB csatornákon (5,25,25). A felület diffúz visszaverődési tényezője (1,0.5,0.25). A nézeti transzformáció a következő:

-- Petika - 2006.11.29.

Adott egy háromszög: (1,1,0), (0,2,1) és (0, 4, 2) pontokkal. Fényforrást helyezünk el a [3 4 0] pontba, amely RGB (5, 25, 25) intenzitással sugároz. A háromszög csúcsainak normálisai rendre (2, 0, 0), (0,3,4) és (3,0,4). A felület diffúz visszaverési tényezője pedig (1 0.5 0.25).

Transzformációs mátrix:


1. feladat

A képernyő mely pixeleken jelenik meg a háromszög, ha a képernyő 200x200-as méretű?

1/1.MO

Ha jól látom, ehhez, és a 3. feladathoz is szükség van az első vágósík helyzetére, hogy a projektív transzformációt el lehessen végezni, majd a képernyő koordinátát meg lehessen határozni belőle. Ha valaki emlékszik ezekre az adatokra is, tegye közzé plz.

-- NeoXon - 2006.11.10.

1/2.MO

Tfh. "világkoordináta - normált képernyőkoordináta" transzformációs mátrix volt megadva.

Ekkor a vektor-mátrix szorzás és a homogén osztás után:

r1' = [0.4 0.4 0.2]
r2' = [0.1 0.3 0.1]
r3' = [0.05 0.25 0.05]

A 200*200 -as viewport alapján minden x és y koordinátát megszorzunk 100-al és hozzáadunk 100-at:

r1' = [140 140 ]
r2' = [110 130 ]
r3' = [105 125 ]

-- adamo - 2006.11.12.

Es ez mi alapjan jott,ki? (Marmint az,hogy 100-al kell szorozni es 100-at hozzaadni? Nezeti trafonak nem epp az volna a lenyege, hogy kapasbol kepernyo koordinatakba adja vissza az ertekeket?)

Nem, a nézeti trafó a (-1,-1)(1,1) négyzetre transzformál a síkban, utána külön kell a viewport felbontásának még felszorozni és eltolni. Lehetne másként is, de így van. -- FarkasGabor - 2006.12.04.


2. feladat

Milyen színűek a háromszög csúcspontjai?

2/1.MO (Konstans árnyalással. Gouraud árnyalásos megoldáshoz lásd a 2/2.MO részt!)

A transzformáció (egyszerű vektor-mátrix szorzás) után a háromszög koordinátái:
r1' = [0.4 0.4 0.2]
r2' = [0.1 0.3 0.1]
r3' = [0.05 0.25 0.05]

A háromszög normálvektora kell ahhoz, hogy meg tudjuk mondani, milyen színűek lesznek a csúcsok (és persze a teljes háromszög felülete - Lambert-törvény).

N = (r3' - r1') x (r2' - r1') // feltételezve, hogy a körüljárási sorrend r1', r2', r3'

Ez egy szimpla vektoriális szorzat számítás, amihez először ki kell számítani a két különbségvektort, majd azok vektoriális szorzatát véve megkapjuk, hogy:

N = [0 0.01 -0.01]

Ezt normalizáljuk, azaz elosztjuk az N vektor hosszával:

Az illuminációs képlet diffúz felületre:

Ahol az L legyen a visszavert, pedig a beérkező ( jelenleg: [5, 25, 25] )fényintenzitás, a visszaverődési tényező (hullámhossz/szín függő, jelenleg: [1 0.5 0.25] ), a megvilágítási irány és az N normálvektor közötti szöget jelöli a Θ'.

Szükségünk van tehát a megvilágítási irány és a háromszög normálvektora közötti szög koszinuszára.

Ezen a helyen volt linkelve a diffvisszav.PNG nevű kép a régi wiki ezen oldaláról. (Kérlek hozd át ezt a képet ide, különben idővel el fog tűnni a régi wikivel együtt)


(az elszámolás javításáért thx to -- palacsint - 2006.12.01.)



RGB = [2.82 7.08 3.54]



-- NeoXon - 2006.11.10.


2/2.MO (Gouraud árnyalással)

Adott a három pont normál vektora: ==[2 0 0]==, ==[0 3 4]== és ==[3 0 4]==. A hosszuk , és .

Az illuminációs képlet diffúz felületre:

Ahol az L legyen a visszavert, pedig a beérkező ( jelenleg: [5, 25, 25] )fényintenzitás, a visszaverődési tényező (hullámhossz/szín függő, jelenleg: [1 0.5 0.25] ), a megvilágítási irány és az N normálvektor közötti szöget jelöli a Θ'.

Szükségünk van tehát a megvilágítási irány és a háromszög normálvektora közötti szög koszinuszára. Mindhárom pontra külön kiszámítjuk a  :



Ezáltal a pontok szinei:

RGB = [3 7.5 3.75]

RGB = [2.4 6 3]

RGB = [1.8 4.5 2.25]

-- adamo - 2006.11.12.

Neoxon a te megoldásod elfogadták? Én az AdamO féle megoldással lettem kiváló. Bár végülis itt még nem írta a feladat, hogy Gouraud vagy Flat shading van-e. -- FarkasGabor - 2006.12.04.

Én nem B csoportot írtam, és amikor ezt a kidolgozást csináltam, még fogalmam sem volt róla, hogy mi a 3. feladat pontos szövege, így nem tudtam, hogy Gouraud árnyalással kell csinálni, csodálkoztam is, hogy a csúcspontokban megadták a normálvektorokat. Adamo megoldása a helyes, de ha a harmadik feladatban nem lett volna megadva, hogy Gouraud árnyalás kell, akkor a fenti konstans árnyalás is megállná a helyét. -- NeoXon - 2006.12.06.

3. feladat

Milyen intenzitású a (111, 130)-as pixel R csatornája, ha Gouraud árnyalást alkalmazunk?

Előző hozzászólásomat akkor pontosítom: Szirmay azt mondta, hogy ha aki nem tudja egy ilyen feladatnál, hogy az "a"-t a normálvektorból számoljuk (-Nx/Nz), azt nem engedi át azon a zh-n/vizsgán. (Konkrét esetünkben a megoldáshoz a megfelelő színkomponenes lesz a 3. koordináta a normálvektor számításához.)

-- gedeon__^ - 2006.12.7

Ez nem a Z koordináta megadásánál van csak így? Ugyanis ott igaz az, hogy [Nx, Ny, Nz]*[X,Y,Z] = C, és ebből Z-t kifejezve Z(X,Y) = (C - Nx*X - Ny*Y)/Nz. Az inkrementáls elv alkalmazásával: Z(X+1,Y) = Z(X,Y) - Nx/Nz. Szerintem Gouraud árnyalásnál R(X,Y) = dRx*X + dRy*Y + c, az inkrementális elv miatt pedig R(X+1,Y) = R(X,Y) + dRx. Ahol dRx az R színkomponens változása az X függvényében egy adott scanline-on belül. Vagyis dRx = (R2 - R1)/(P2_x - P1_x). Ha pedig arra vagyunk kíváncsiak, hogy Y mentén hogyan változik az R színkomponens, akkor dRy = (R2 - R1)/(P2_y - P1_y). Javítsatok plz, ha nem jól gondolom!

-- NeoXon - 2006.12.07.

---! Itt pedig arra lennék kíváncsi, hogy az előbbi állítás (2. feladat by NeoXon), miszerint a háromszög teljes felülete azonos színű lesz, nem válasz erre?
-- LiFeX - 2006.11.27.

Mivel itt már egyértelműen Gouraud shading van, nem lesz azonos a háromszög egész felülete. Ki kell számolni a három pont színét úgy, mint adamo megoldásában, majd ezen pontokra alkalmazunk lineáris interpolációt a háromszög pontjaira. Megjegyzendő, hogy perspektíva-korrekció esetén az interpoláció nem lineáris, hanem reciprok alapján történik, de ilyennel most nem foglalkozunk.

Ha felrazjoljuk a háromszögünket segítségképpen, láthatjuk, hogy a háromszög y szerint középre eső pontja (legyen B), a felső (A) és alsó (C) között húzott éltől balra helyezkedik el. Láthatjuk továbbá, hogy a kérdéses pixelünk a B-nek megfelelő ponttól eggyel balra esik. A háromszög rajzolásakor scanline-onként haladunk, a vertexekre számított tulajdonságokat lineárisan interpoláljuk a pontok között az élek minden pixelére. Az A-C szakasz a B pont magaságában az x=116 pixelre esik (D pont), ez a pont az A-C szakaszon egyharmad úton van. Az erre a pontra eső szín tehát color(D) = (2*color(A) + 1*color(B))/3. Ezen scanline-on belül is lineárisan interpolálunk: color(X) = (5*color(B) + 1*color(D))/6.

-- FarkasGabor - 2006.12.04.

Csak egy észrevétel: a végén (2*color(A) + 1*color(B))/3 helyett (2*color(A) + 1*color(C))/3 a helyes, természetesen. Hogy egy kicsit kevésbé tűnjék varázslásnak ez a fajta intuitív megoldás, leírom én hogy csináltam meg. Tudjuk, hogy a Gouraud árnyalás esetén nem a normálvektorral, hanem a csúcspontokban kiszámított színekkel kell machinálni. Az előző feladatban ezeket kiszámoltuk, így felrajzolhatjuk a háromszöget, ahogy a kolléga fentebb is írta. Érdemes mellé írni a csúcsokhoz azok R értékét: 3, 2.4, 1.8. Ezután azt kell megtudnunk, hogy a (110, 130) csúcstól jobbra, a háromszög oldalát hol metszi az y=130 egyenes. Nézzük a lenti (105, 125) pontot és a fenti (140, 140) pontot összekötő szakaszt. Ennek emelkedése 140-105 / 140-125 = 35/15. A lenti pontból y mentén lépünk 5-öt, ez alatt kérdés, hogy x mentén mennyit lépünk. x = 5*dy/dx = 5*35/15= 11,67. Tehát a lenti pont x koordinátájához 11,67-et adva azt kapjuk, hogy a [105+11.67, 130] pontban fogja metszeni a háromszög oldalát. Ezt nyugodtan kerekíthetjük [117, 130]-ra. Ezután nézzük az R színkomponens függését y-tól ezen a szakaszon. A felső pontban R=3, az alsóban R=1.8. Mialatt y 125-ről 140-re változik, az R 1.8-ról 3-ra emelkedik. Tehát dRy = (3-1.8)/(140-125) = 0.08. Ebből a [117, 130] R komponense: 1.8 + 5*dRy = 2.2, hiszen az y tengely mentén 5 pixelt haladtunk. Most nézzük az y=130 egyenesen levő szakaszt a (110, 130) és (117, 130) pontok között. A bal oldalán R=2.4, jobb oldalán R=2.2. Hasonlóan felírhatjuk, hogy dRx = (2.2 - 2.4)/(117-110) = -0.029. Ebből a keresett (111, 130) pixel R komponense: 2.4 + 1*dRx = 2.4-0.029 = 2.371, ami gyakorlatilag ugyanolyan színt fog jelenteni, hiszen 8 bites színfelbontással 2.4 és 2.371 között nincs különbség (a piros színskála 0-255-ig egész számokkal adott). -- NeoXon - 2006.12.06.

Adalék a Gouraud árnyaláshoz általános esetben:

la=l1-(l1-l2)*(y1-ys)/(y1-y2) lb=l1-(l1-l3)*(y1-ys)/(y1-y3) lp=l1-(lb-la)*(xb-xp)/(xb-xa)


http://www.stack.nl/~dimitri/3dsview/gouraud.html


Ezen a helyen volt linkelve a gouraud.gif nevű kép a régi wiki ezen oldaláról. (Kérlek hozd át ezt a képet ide, különben idővel el fog tűnni a régi wikivel együtt)


-- adams - 2009.05.25.