20061207 G csoport

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 22:16-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzgGrafPZH20061207G}} __TOC__ <b>Adott egy háromszög, csúcsai képernyőkoordinátákban: (11,11,0), (1,21,5), (21,31,8). A hozzájuk ta…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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, csúcsai képernyőkoordinátákban: (11,11,0), (1,21,5), (21,31,8). A hozzájuk tartozó árnyalónormálok a világ koordináta rendszerben rendre (1,0,0), (0,1,0), (0,0,1). Az [1,1,1] irányból az RGB csatornákon (1,2,3) intenzitással fényforrás világít. A háromszög diffúz visszaverési tényezője ( 0.3, 0.2, 0.1). Milyen színű a (2,21) pixel, ha Phong-árnyalást alkalmazunk? (Tisztázza magában a Phong-árnyalás fogalmát! Ez itt nem Gouraud-árnyalás, sem Phong BRDF.) J -- SzaMa - 2006.12.09.

Skiz:

_(lásd süni 204. oldal)_

a(11,11,0)
b(1,21,5)
c(21,31,8)

n=(c-a) x (b-a) = [10 20 8] x [-10 10 5]= [20 -130 300]
C= n_x*a_x + n_y*a_y + n_z*a_z = 11*20+11*(-130)+ 0*300= -1210


Z(2,21)= (C-nx*2-ny*21)/nz = (-1210-20*2-21*(-130))/300= 74/15


P(2,21,74/15)

11a+b+21c=2
11a+21b+31c=21
		 +5b+8c=74/15
----------------------
a=1/30 b=14/15 c=1/30  

[math] \cos{\alpha} = \frac{(1/30, 14/15, 1/30) \cdot (1, 1, 1)}{|(1/30, 14/15, 1/30)| \cdot |(1, 1, 1)|} = \frac{1}{0.935 \sqrt{3}} [/math]

R = cos(α) · 0.3 · 1
B = cos(α) · 0.2 · 2
G = cos(α) · 0.1 · 3

-- adamo - 2006.12.30.

Egy kicsit bővebben... :)

A feladat megoldásának elve (link): A Phong árnyalás arról szól, hogy van egy felületünk, és nem szeretnénk pontról pontra kiszámolni a színeket, ezért csalunk. Felbontjuk a felületet háromszögekre, és, hogy azért ne veszítsünk sokat, minden csúcspontban eltároljuk, hogy az eredeti felületnek ott mi a normálisa. Utána, ha kérdezik egy belső pont színet, akkor a normálist abban a pontban a csúcspontokban lévőkből számoljuk, majd a felület BRDF-jéből, a fény és nézeti irányból számoljuk a színt. Diffúz felulet esetén a BRDF-e konstans, ezt kell megszorozni a fényforrás intenzitásával és a normálvektor és a fényforrás felől mutató vektor coszinuszával. (Ha több fényforrásunk lenne, ezt kellene szummázni az egyes fényekre.) Mivel irányfényforrásunk van, így az intenzitása nem csökken a távolsággal. Tehát Phong algoritmusa nem a színeket, hanem a háromszög-csúcspontokban érvényes normálvektort interpolálja a háromszög felületén, és az illuminációs képletet minden pixelre külön kiértékeli.

<img src = "%ATTACHURLPATH%/phong.png"">

Tehát először meg kell határozni a pixel normálvektorát. A lineáris interpoláció során felhasznált módszer a következő. Meghatározzuk a [math]P[/math] ponton átmenő Y pászta metszéspontjait a háromszög oldalaival. A metszéspontok normálvektorát az oldalak csúcsainak normálvektorából interpoláljuk, majd a metszéspontok normálvektorait felhasználva számoljuk ki a belső [math]P[/math] pont normálvektorát.

A [math]P_1[/math] és [math]P_3[/math] pontok közötti oldal egyenlete:

[math](y - y_1)(x_2 - x_1) = (x - x_1)(y_2 - y_1)[/math]

[math]10(y-11)=20(x-11)[/math]

[math]y=2x-11[/math]

A [math]P_1[/math] és [math]P_3[/math] pontok közötti oldal és az [math]Y=21[/math] pászta közötti metszéspont ([math]Q[/math]) koordinátái:

[math]21=2x-11[/math]

[math]Q=(16,21)[/math]

A [math]Q[/math] pont normálvektorát a [math]P_1[/math] és [math]P_3[/math] csúcspontok normálvektorából az alábbiak szerint számoljuk ki:

[math]N_{x}^{Q} = u*N_{x}^{P_1} + (1-u)*N_{x}^{P_3}[/math],

[math]N_{y}^{Q} = u*N_{y}^{P_1} + (1-u)*N_{y}^{P_3}[/math],

[math]N_{z}^{Q} = u*N_{z}^{P_1} + (1-u)*N_{z}^{P_3}[/math].

Ahol az [math]u[/math] azt adja meg, hogy melyik csúcs milyen súllyal szamít (természetesen a közelebbi jobban). Mivel a [math]Q[/math] pont az oldal felezőpontja, ezért [math]u=\frac{1}{2}[/math]. Ebből a [math]Q[/math] normálvektora:

[math]N_Q = (\frac{1}{2},0,\frac{1}{2})[/math].

A [math]P[/math] pont normálvektorát a [math]Q[/math] és [math]P_2[/math] (mivel az Y pászta másik metszéspontja a második csúcs) pontok normálvektorából interpoláljuk:


[math]N_{x}^{P} = u*N_{x}^{P_2} + (1-u)*N_{x}^{Q}[/math]

[math]N_{y}^{P} = u*N_{y}^{P_2} + (1-u)*N_{y}^{Q}[/math]

[math]N_{z}^{P} = u*N_{z}^{P_2} + (1-u)*N_{z}^{Q}[/math]

Az [math]u[/math] értéke ebben az esetben:

[math]u=\frac{|PP_Q|}{|P_{2}{Q}|}=\frac{14}{15}[/math], ahol a számláló és a nevező a pontok alkotta szakaszok hossza. A [math]P[/math] normálvektora tehát:

[math]N_P = (\frac{1}{30},\frac{14}{15},\frac{1}{30})[/math].

Megjegyzés: A fenti képletben szerintem [math]u=\frac{|{P}{Q}|}{|P_{2}{Q}|}=\frac{14}{15}[/math]. Ez az eredményen nem változtat, csak egy apró elírás.
Tehát [math]P_{2}[/math] súlya az interpolációban [math]\frac{14}{15}[/math], míg [math]Q[/math] súlya [math]\frac{1}{15}[/math]
-- Bandita - 2008.06.03.

Ezután ki kell számolni a beeső sugár és a normálvektor szögének koszinuszát. Legyen a fényforrás iránya L a normálvektor N.

[math]\cos\theta' = \frac{L \cdot N}{|L|*|N|} = \frac{(1*\frac{1}{30})+(1*\frac{14}{15})+(1*\frac{1}{30})}{(\sqrt{1^2+1^2+1^2})+(\sqrt{(\frac{1}{30})^2+(\frac{14}{15})^2+(\frac{1}{30})^2})} = \frac{5\sqrt{10}}{\sqrt{131}} \sim 1,3814[/math].

Végül a pixel színe:

[math]L = L_{in}*k_d*\cos\theta'=L_{(fény)}*k_d=[0.3,0.2,0.1]*[1,2,3]*1,3814 = [0.4144,0.5526,0.4144][/math]

<img src = "%ATTACHURLPATH%/szin.png"">

-- Samirello - 2007.01.02.

A bővebb megoldás végén mégsem ugyanaz az eredmény jön ki, mint az elsőben. Gondolom ez azért lehet, mert a [math]\cos\theta'[/math]-nál a nevezőben összeadás van a szorzás helyett. Addig ugyanis ugyanaz a részeredmény... Szerintem a szorzás a jó!

-- Atex - 2007.10.29.

Revízió: Miután ismét átnéztem a feladatot ismét, rájöttem, hülyeséget írtam, [math]\vec{N}[/math] és [math]\vec{L}[/math] hossza semmiképpen nem egységnyi, ahhoz normálnunk kellene. Továbbá ahogy Atex mondta, a képletbe való behelyettesítés el van írva, ott szorzás lenne a helyes. Ha szorzunk ugyanazt az eredményt kapjuk, mint a skiz esetén, ami végülis a jó megoldás :)
-- Bandita - 2008.06.17.