Beregning av ambient og diffus lysrefleksjon

Vedlegg 2 Beregning av diffust lys

Dette vedlegget er tilknyttet modul5 som har med lys og lysberegning å gjøre. Her gjøres en “manuell” kontrollregning av lysverdiene.

Gjennomgang 1

Bruker lysvektor = [1, 0, 0]

Her ser vi på eksempel /dell10/DiffuseSunCube1.html / .js når følgende fargeverdier brukes:

  • lysvektor = \([1, 0, 0]\)
  • ambient lys = \([0.2, 0.2, 0.2]\)
  • diffust lys = \([0.1, 0.8, 0.3]\).
  • Kameraet er plassert i \([25, 60, 100]\)

Resultat:

Kube med retningsorientert lyskilde der lysvektoren er [1, 0, 0] og kameraet står i [25, 60, 100]

For å kontrollere at det vi ser på skjermen stemmer med teorien skal vi nå regne ut refleksjonen som utgjøres av ambient og diffus belysning med de verdiene som ble oppgitt i eksemplet over.

Vi ser at kubens høyre side har en nyanse av grønn. For at vi skal kunne kontrollere mot beregnede verdier må vi finne RGB-verdier til denne grønnfargen.

Dersom man klipper ut en del av kuben som vi ser i nettleseren (f.eks. vha. Snipping tool i Windows) og limer inn i Paint. NET kan man måle/sample fargen vha. fargevelgeren i Paint .NET. På denne måten kan man finne RGB-verdiene. Se figuren under:

Fargevelgeren i Paint .NET viser RGB-verdien 76, 255, 127 for kubens høyre side

Her er grønnfargen til kubens høyre side valgt og gir RGB-verdi = \([76, 255, 127]\).

Vi regner ut og kontrollerer om vi får det samme. Her brukes kun ambient og diffuse lyskomponenter (ikke specular). Vi bruker fortsatt følgende formel:

\[ \text{Totalrefleksjon} = \text{ambient refleksjon} + \text{diffuse refleksjon} \]

Ambient-delen er enkel:

\[ \text{Ambient refleksjon} = [0.2, 0.2, 0.2] \]

Diffuse-delen av likninga krever mer regning:

\[ \begin{aligned} \text{Diffuse refleksjon} &= \text{diffust lys} \cdot \max(\cos\theta,\, 0) \\ &= [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) \end{aligned} \]

\(\cos\theta\) beregnes vha. prikkproduktet mellom normalvektor og lysvektor:

Normalvektor, \(\vec{n}\), for den grønne siden = \([1.0, 0.0, 0.0]\)
Lysvektor, \(\vec{L}\), = \([1.0, 0.0, 0.0]\)

Beregner \(\cos\theta\):

\[ \cos\theta = \frac{\vec{n}}{\left\lVert \vec{n} \right\rVert} \cdot \frac{\vec{L}}{\left\lVert \vec{L} \right\rVert} = \frac{(1,0,0)}{1} \cdot \frac{(1,0,0)}{1} = 1 \]

Finner nå at:

\[ \text{Diffus refleksjon} = [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) = [0.1, 0.8, 0.3] \cdot 1 = [0.1, 0.8, 0.3] \]

Summerer vi dette med ambient refleksjon får vi:

\[ \text{Totalrefleksjon} = [0.2, 0.2, 0.2] + [0.1, 0.8, 0.3] = [0.3, 1.0, 0.5] \]

Gjør vi dette om til verdier i området 0-255 (ved å multiplisere fargekomponenttallet med 255) får vi (avrundet):

\[ [76, 255, 127] \]

Vi ser at dette stemmer med «målt» farge til kubens høyre side.

Gjennomgang 2

Bruker lysvektor [-10, 6, 10]

Endrer lysvektoren til \([-10, 6, 10]\) og gjør samme kontrollmåling som i gjennomgang 1. Resultatet skal bli slik:

Kube med retningsorientert lyskilde der LightDirection er [-10, 6, 10]

Her brukes kun ambient og diffuse lyskomponenter (ikke specular).

Diffus refleksjon/farge for toppen av kuben

Dersom vi «måler» (sampler) fargen til toppen av kuben i figuren over, f.eks. vha. Paint .NET, får vi RGB-verdien:

Fargevelgeren i Paint .NET viser RGB-verdien 61, 131, 81 for toppen av kuben

Altså: \([61, 131, 81]\) som tilsvarer grønnfargen til toppen av kuben.

Vi regner ut for å kontrollere at vi får samme verdi, bruker følgende:

\[ \text{Totalrefleksjon} = \text{ambient refleksjon} + \text{diffuse refleksjon} \]

Ambient-delen:

\[ \text{Ambient refleksjon} = [0.2, 0.2, 0.2] \]

Diffuse-delen av likninga:

\[ \begin{aligned} \text{Diffuse refleksjon} &= \text{diffust lys} \cdot \max(\cos\theta,\, 0) \\ &= [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) \end{aligned} \]

Beregner \(\cos\theta\) vha. normalvektor og lysvektor:

Normalvektor, \(\vec{n}\), for toppen av kuben = \([0.0, 1.0, 0.0]\)
Lysvektor, \(\vec{L}\), = \([-10, 6.0, 10.0]\)

Beregner \(\cos\theta\):

\[ \cos\theta = \frac{\vec{n}}{\left\lVert \vec{n} \right\rVert} \cdot \frac{\vec{L}}{\left\lVert \vec{L} \right\rVert} = \frac{(0,1,0)}{(1)} \cdot \frac{(-10,6,10)}{\sqrt{236}} = 0{,}39057 \]

Finner nå at:

\[ \begin{aligned} \text{Diffus refleksjon} &= [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) \\ &= [0.1, 0.8, 0.3] \cdot 0{,}39057 \\ &= [0.039057, 0.312453, 0.117170] \end{aligned} \]

Summerer vi dette med ambient refleksjon får vi:

\[ \begin{aligned} \text{Totalrefleksjon} &= [0.2, 0.2, 0.2] + [0.039057, 0.312453, 0.117170] \\ &= [0.239057, 0.512453, 0.317170] \end{aligned} \]

Gjør vi dette om til verdier i området 0-255 (ved å multiplisere tallet med 255) får vi (avrundet):

\[ [61, 131, 81] \]

og vi ser at dette stemmer med «målt» verdi.

Diffus refleksjon/farge for fronten av kuben

Vi måler (sampler) fargen til fronten av kuben og får RGB-verdien:

Fargevelgeren i Paint .NET viser RGB-verdien 68, 184, 101 for fronten av kuben

Altså: \([68, 184, 101]\) som tilsvarer grønnfargen til fronten av kuben.

Vi regner ut totalrefleksjonen, dvs. fargen, for fronten av kuben vha. følgende:

\[ \text{Totalrefleksjon} = \text{ambient refleksjon} + \text{diffuse refleksjon} \]

Ambient-delen:

\[ \text{Ambient refleksjon} = [0.2, 0.2, 0.2] \]

Diffuse-delen av likninga:

\[ \begin{aligned} \text{Diffuse refleksjon} &= \text{diffust lys} \cdot \max(\cos\theta,\, 0) \\ &= [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) \end{aligned} \]

Beregner \(\cos\theta\) vha. normalvektor og lysvektor:

Normalvektor, \(\vec{n}\), for fronten av kuben = \([0.0, 0.0, 1.0]\)
Lysvektor, \(\vec{L}\), = \([-10, 6.0, 10.0]\)

Beregner \(\cos\theta\):

\[ \cos\theta = \frac{\vec{n}}{\left\lVert \vec{n} \right\rVert} \cdot \frac{\vec{L}}{\left\lVert \vec{L} \right\rVert} = \frac{(0,0,1)}{(1)} \cdot \frac{(-10,6,10)}{\sqrt{236}} = 0{,}65094 \]

Finner nå at:

\[ \begin{aligned} \text{Diffus refleksjon} &= [0.1, 0.8, 0.3] \cdot \max(\cos\theta,\, 0) \\ &= [0.1, 0.8, 0.3] \cdot 0{,}65094 \\ &= [0.065094, 0.520752, 0.195283] \end{aligned} \]

Summerer vi dette med ambient refleksjon får vi:

\[ \begin{aligned} \text{Totalrefleksjon} &= [0.2, 0.2, 0.2] + [0.065094, 0.520752, 0.195283] \\ &= [0.265094, 0.720756, 0.395283] \end{aligned} \]

Gjør vi dette om til verdier i området 0-255 (ved å multiplisere tallet med 255) får vi (avrundet):

\[ [68, 184, 101] \]

og vi ser at dette stemmer med «målt» verdi.

Ingen kommentarer:

Legg inn en kommentar