POV-Ray Wykład 3
Typy źródeł światła: rozproszone, kierunkowe, punktowe i reflektor. źródło zewnętrzne
Źródło światła kierunkowe Źródło światła bardzo oddalone od oświetlanego obiektu Można założyć że promienie biegną równolegle do siebie Na przykład światło słoneczne lub światło innej odległej gwiazdy Źródło światła punktowe Promienie rozchodzą się we wszystkich kierunkach Podkreśla nierówności oświetlanych obiektów Na przykład nieosłonięta żarówka Źródło światła reflektor Światło skierowane o kształcie stożka Zazwyczaj wyróżnia się stożek wewnętrzny w którym natężenie światła jest stałe oraz stożek zewnętrzny w którym natężenie maleje ku zewnętrznej granicy Przykładem może być reflektor samochodowy Źródło światło rozproszone Światło padające ze wszystkich kierunków z równomiernym natężeniem Nie generuje cieni
Światło Światło otaczające (ambient light) Jest to światło emitowane równomiernie we wszystkich kierunkach. Bez tego światła obszary, które nie byłyby bezpośrednio oświetlone przez źródło światła mogłyby być zupełnie ciemne. Domyślnie światło otaczające ma kolor biały (rgb <1, 1, 1>). Zmiana koloru światła otaczającego global_settings { ambient_light rgb <r, g, b> } global_settings { ambient_light rgb <1, 0.0, 0.0> }
Przykład stadion Oświetlenie stadionu #declare zarowka=union { sphere{<0,0,0> 1 texture{pigment{color White} finish{ambient 0.2}} scale<1,1,0.3>} } #declare lampa=union { box{<-6.5,-2.5,-1> <6.5,2.5,2> texture{pigment{color Black}}} #for(krok, 0, 2, 1) light_source{<-3+krok*3,-1.2, -1> color White looks_like{zarowka}} light_source{<-3+krok*3,1.2, -1> color White looks_like{zarowka}} #end } #declare slup=union { cone{<0,0,0> 1.2 <0,20,0> 0.6 texture{pigment{color Brown}}} object{lampa rotate<-30,0,0.> translate<0,20,-3>} } object{slup rotate<0,-45,0> translate<-40,0,15>} object{slup rotate<0,45,0> translate<40,0,15>} object{slup rotate<0,-135,0> translate<-40,0,-115>} object{slup rotate<0,135,0> translate<40,0,-115>}
Światło punktowe (point light) Nie ma rozmiaru, światło rozchodzi się ze źródła jednakowo we wszystkich kierunkach. Jest to domyślny rodzaj światła. light_source { <x, y, z> color rgb <r, g, b> }
Światło miejscowe (spot light) Światło miejscowe tworzy stożek światła, który jest jasny w środku i łagodnie ciemnieje zbliżając się do krawędzi. light_source {<x, y, z> color rgb <r, g, b> spotlight [radius r] [falloff f] [tightness t] [point_at <x, y, z>] [(opt.)]} tightness współczynnik zanikania światła
Definicja środkowych z żarówek słupa oświetleniowego light_source { <0,-1.2, -1> color White spotlight radius 5 falloff 10 point_at<0,-1.2,-50> looks_like{zarowka} } light_source { <0,-1.2, -1> color White spotlight radius 1 falloff 1 point_at<0,-1.2,-50> looks_like{zarowka} }
light_source { <0,-1.2, -1> color White spotlight radius 25 falloff 50 point_at<0,-1.2,-50> looks_like{zarowka} }
Światło cylindryczne (cylindrical light) Światło punktowe, w którym zamiast stożka światła tworzony jest walec światła. Promienie światła nie są równoległe. light_source { <x, y, z> color rbg <r, g, b> cylinder [radius r] [falloff f] [tightness t] [point_at <x, y, z>] [(opt.)] } cylinder radius 15 falloff 15
light_source { <0,1.2, -1> color White cylinder radius 30 falloff 60 point_at<0,-1.2,-50> looks_like{zarowka} }
Światło obszarowe (area light) Źródło światła obszarowego zajmuje skończony obszar przestrzeni jedno lub dwuwymiarowej. light_source { <x, y, z> color rgb <r, g, b> area_light u, v, lsw, lsk [addaptive a] [jitter] [circular] [orient] [(opt.)] } u, v wektory definiujące prostokąt (muszą być prostopadłe), lsw - liczba świateł w wierszu, lsk - liczba świateł w kolumnie, [addaptive a] - adaptacyjne próbkowanie świateł, [jitter] - losowe przesuwanie świateł, [circular] - światła umiejscawiane są na kręgu, [orient] - lepsze tworzenie miękkich cieni (tylko z circular, wektory musza być jednakowej długości a liczba świateł w lsw=lsk).
light_source { <0,-1.2, -1> color White area_light <0,2> <1,0> 2 2 looks_like{zarowka} }
projected_through generuje efekt odwrotny od klasycznego światła otaczającego. Rzucane światło przyjmuje kształt cienia jaki utworzyłaby zdefiniowana przeszkoda przy klasycznym oświetleniu.
Metody modelownia krzywych i powierzchni Krzywe Beziera, Krzywe wymierne Beziera Powierzchnie Beziera Krzywe B-sklejane (NURBAS) Powierzchnie B-sklejane Inne metody modelowania np.: Krzywe Hermite a Płaty Coonsa Powierzchnie Gordona Płaty trójkątne
źródło: Grafika wektorowa, Helion 2012 Krzywa Beziera Genealogia krzywej Beziera 1. Karl Weierstras (1815-1897). Niemiecki matematyk, autor twierdzenie głoszącego, że każdą funkcję ciągłą można przybliżyć z dowolną dokładnością wielomianami. 2. Siergiej Natanowicz Bernstein (1880-1968) Radziecki matematyk, twórca tzw. wielomianów bazowych 3. Paul de Casteljau (1930-1999) francuski fizyk i matematyk, pracujący dla firmy Citroen użył wielomianów Bernsteina przy tworzeniu algorytmu obliczającego krzywe. 4. Pierre Bezier (1910-1999) francuski inżynier, pracownik firmy Renault, który spopularyzował algorytm znajdując dla niego zastosowanie w programie CAD.CAM.
Rys. Portret Pierre Bezier a utworzony za pośrednictwem tysięcy krzywych źródło: Grafika wektorowa, Helion 2012
Krzywa Beziera Krzywa Beziera to krzywa wielomianowa trzeciego stopnia, czyli taka która może być definiowana za pomocą trzech wielomianów z pewnym parametrem t (odpowiednio dla współrzędnych x, y i z). Wielomiany trzeciego stopnia są używane najczęściej, ponieważ wielomiany niższego stopnia są zbyt mało elastyczne, jeśli chodzi o sterowanie kształtem krzywej. Natomiast wielomiany wyższego stopnia wprowadzają niepożądane oscylacje, a ponadto wymagają większej liczby obliczeń. Krzywe trzeciego stopnia są również krzywymi najniższego stopnia, które nie leżą w jednej płaszczyźnie w 3D. Współczynniki wielomianów są tak dobierane, żeby krzywa przebiegała wzdłuż pożądanej ścieżki. Krzywa określona jest przez dwa punkty końcowe oraz dwa punkty pośrednie nie należące do krzywej. Krzywa Beziera interpoluje więc oba końcowe punkty i aproksymuje dwa pozostałe. Dzięki swoim zaletom, takim jak łatwość interakcyjnego kształtowania i istnienie sprawnych algorytmów przetwarzania, reprezentacje te obecnie używane powszechnie nie tylko w inżynierskich systemach projektowania wspomaganego komputerem, ale także w wielu innych zastosowaniach graficznych (np. w projektowaniu czcionek).
Rys. Interpolacja wykresu 3D zrealizowane w programie Matlab
Punkty należące do krzywej Beziera obliczane są z równań: P. x = (1 t) 3 P 1. x + 3(1 t) 2 tp 2. x + 3(1 t)t 2 P 3. x + t 3 P 4. x P. y = (1 t) 3 P 1. y + 3(1 t) 2 tp 2. y + 3(1 t)t 2 P 3. y + t 3 P 4. y P. z = (1 t) 3 P 1. z + 3(1 t) 2 tp 2. z + 3(1 t)t 2 P 3. z + t 3 P 4. z gdzie: P.x, P.y, P.z - współrzędne x, y i z punktu P t - parametr z przedziału [0,1] określający, w którym miejscu krzywej znajduje się szukany punkt. Przykładowo dla t=0 otrzymujemy punkt P1, a dla t=1 punkt P4. Aby otrzymać obraz (współrzędne punktów) całej krzywej należy zmieniać wartość t z odpowiednio małym krokiem. Przy łączeniu kilku segmentów krzywej Beziera należy dopilnować, aby zachowana była ciągłość w punkcie łączenia dwóch punktów końcowych.
Oznacza to, że wspólny punkt końcowy oraz dwa punkty pośrednie muszą być różne i współliniowe. Krzywe Béziera mają następujące własności: Niezmienniczość afiniczna reprezentacji. Suma wielomianów Bernsteina stopnia n jest równa 1, a zatem dla dowolnego t R punkt p(t) jest kombinacją afiniczną punktów kontrolnych. Ponieważ przekształcenia afiniczna zachowują kombinacje afiniczne więc dla ustalonego przekształcenia afinicznego f i dla każdego t odpowiedni punkt krzywej Béziera reprezentowanej przez punkty kontrolne f(p 0 ),, f(p n ) jest równy f(p(t)). Innymi słowy, aby otrzymać obraz krzywej Béziera w dowolnym przekształceniu afinicznym, wystarczy poddać temu przekształceniu jej punkty kontrolne.
Własność otoczki wypukłej. Dla t [0,1] punkt p(t) jest kombinacją wypukłą punktów kontrolnych (wielomiany Bernsteina są w przedziale [0,1] nieujemne), a więc należy do otoczki wypukłej ich zbioru. Zachodzi interpolacja skrajnych punktów kontrolnych: p(0) = p 0, p(1) = p n Dla t [0,1] krzywa Béziera nie ma z żadną prostą (na płaszczyźnie) albo płaszczyzną (w przestrzeni) większej liczby punktów przecięcia niż jej łamana kontrolna (to się nazywa własnością zmniejszania wariacji). Istnieje możliwość podwyższenia stopnia, czyli znalezienia reprezentacji stopnia n+1. Związek obu reprezentacji wyraża się wzorami n n+1 p(t) = p i B i n (t) = p ib i n+1 (t) i=0 p i = i n + 1 p n + 1 i i 1 + n + 1 p i Podwyższanie stopnia możemy iterować, dostając reprezentacje coraz wyższych stopni. Ciąg łamanych kontrolnych otrzymanych w ten sposób zbiega jednostajnie do krzywej dla t [0,1]. Zbieżność tego ciągu jest jednak zbyt wolna, aby miała praktyczne znaczenie. i=0
Jeśli kolejne punkty kontrolne leżą na prostej, w kolejności indeksów i w równych odstępach, to krzywa Béziera jest odcinkiem sparametryzowanym ze stałą prędkością. Najłatwiej jest udowodnić to rozpatrując reprezentację odcinka w postaci krzywej Béziera stopnia 1 i jego reprezentacje otrzymane przez podwyższanie stopnia. Pochodna krzywej Béziera o punktach kontrolnych p 0,, p n wyraża się wzorem n 1 n 1 p (t) = n(p i+1 p i )B i n 1 (t) = n p i B i n 1 (t) i=0 i=0
Na podstawie własności otoczki wypukłej mamy więc własność hodografu, według której kierunek wektora p (t) t [0,1] jest zawarty w stożku rozpiętym przez wektory P i = p i+1 p i dla i=0,, n-1. Ponadto zachodzą równości p (0) = n(p 1 p 0 ) oraz p (1) = n(p n p n 1 ). Podział krzywej. Punkty p 0 (0),, p0 (n) oraz p0 (n),, pn (0), otrzymane w trakcie wykonywania algorytmu de Casteljau, są punktami kontrolnymi tej samej krzywej, w innych parametryzacjach. Dokładniej, dla dowolnego s R zachodzą równości:
n p(s) = p i B i s (s) = p 0 (i) Bi n ( s t ) i=0 n i=0 (n i) = p n s t i Bi ( 1 t ) Aby narysować krzywą, możemy dzielić ją na,,dostatecznie krótkie łuki i rysować zamiast nich odcinki. Otoczka wypukła łamanej kontrolnej,,całej krzywej jest z reguły znacznie większa niż suma otoczek łamanych kontrolnych kilku jej fragmentów, a zatem przez podział możemy uzyskiwać znacznie dokładniejsze oszacowania położenia krzywej. Algorytm szybkiego obliczania punktu p(t) (o koszcie O(n) zamiast O(n 2 )), jak w przypadku algorytmu de Casteljau) możemy uzyskać, adaptując schemat Hornera. Podstawiając s=1-t, otrzymujemy n i=0
Krzywe B-sklejane Określenie krzywych B-sklejanych Modelowanie figur o skomplikowanym kształcie wymagałoby użycia krzywych Béziera wysokiego stopnia, co oprócz niewygody (z punktu widzenia użytkownika programu interakcyjnego) sprawiałoby różne kłopoty implementacyjne (bardzo duże wartości współczynników dwumianowych, wysoki koszt algorytmów obliczania punktu). Dlatego często stosuje się krzywe kawałkami wielomianowe w reprezentacji B-sklejanej; jest ona uogólnieniem reprezentacji Béziera krzywych wielomianowych. Rys. Porównanie krzywej Béziera z krzywą B-sklejaną
Krzywa B-sklejana jest określona przez podanie: stopnia n, ciągu N+1 węzłów u 0,, u N (ciąg ten powinien być niemalejący, a ponadto N powinno być większe od 2n), oraz N-n punktów kontrolnych d 0,, d N n 1.Wzór, który jest definicją krzywej B-sklejanej ma postać: N n 1 s(t) = d 1 N i n (t) i=0 t [u n, u N n ] We wzorze tym występują funkcje B-sklejane N n i stopnia n, które są określone przez ustalony ciąg węzłów. Istnieje kilka definicji funkcji B-sklejanych, które różnią się stopniem skomplikowania, a także trudnością dowodzenia na podstawie takiej definicji różnych własności tych funkcji (w zasadzie więc wychodzi na jedno, której definicji użyjemy, jeśli chcemy dowodzić twierdzenia, to trudności nie da się uniknąć). Ponieważ w tym wykładzie ograniczamy się do praktycznych aspektów zagadnienia, więc przytoczę rekurencyjny wzór Mansfielda-de Boora- Coxa, który w książkach o grafice chyba najczęściej pełni rolę definicji: N 0 i (t) = { 1 dla t [u i, u i+1 ] 0 przewiwnym razie N i n (t) = t u i u i+n u i N i n 1 (t) + u i+n+1 t u i+n+1 u i+1 N i+1 n 1 (t) dla n > 0
Podstawowe własności krzywych B-sklejanych Własności krzywych B-sklejanych najbardziej istotne w zastosowaniach związanych z grafiką komputerową, są takie: Jeśli wszystkie węzły od u n do u N n są różne (tworzą ciąg rosnący), to krzywa składa się z N-2n łuków wielomianowych. W przeciwnym razie (jeśli występują tzw. węzły krotne), to liczba łuków jest mniejsza. Algorytm de Boora dokonuje liniowej interpolacji kolejno otrzymywanych punktów (liczby α i (j) należą do przedziału [0,1]) stąd wynika silna własność otoczki wypukłej: wszystkie punkty łuku dla t [u k,, u k+1 ] leżą w otoczce wypukłej punktów d k n,, d k. Mamy też afiniczną niezmienniczość tej reprezentacji krzywej. W celu otrzymania jej obrazu w dowolnym przekształceniu afinicznym, wystarczy zastosować to przekształcenie do punktów kontrolnych d 0,, d N n 1. Rys. Silna własność otoczki wypukłej
Lokalna kontrola kształtu. Ponieważ punkt s(t) dla t [u k,, u k+1 ] zależy tylko od punktów d k n,, d k więc zmiana punktu d i powoduje zmianę fragmentu krzywej dla t [u i, u i+n+1 ]. Pochodna krzywej B-sklejanej stopnia n jest krzywą stopnia n-1 N n 2 s n (t) = (d u i+n+1 u i+1 d i )N n 1 i+1 (t) i+1 i=0 Jeśli dwa sąsiednie węzły są n-krotne, to łuk krzywej między nimi jest krzywą Béziera
Powierzchnie Béziera i B-sklejane Płaty tensorowe Do określenia powierzchni potrzebne są funkcje dwóch zmiennych. Najczęściej wykorzystuje się iloczyn tensorowy przestrzeni funkcji jednej zmiennej. Użycie go prowadzi do wzorów, które opisują odpowiednio płat powierzchni Béziera i płat powierzchni B-sklejanej stopnia (n,m). W przypadku płata B-sklejanego, nawet jeśli stopień ze względu na każdy parametr jest taki sam, można podać inny ciąg węzłów określających funkcje bazowe. p(u, v) = n m i=0 j=0 p ij B n i (u)b m j (v) s(u, v) = N n 1 M m 1 d ij N n i (u)n m j (v) i=0 j=0 Rys. Płat B-sklejany
Dziedziną płata Béziera jest zwykle kwadrat jednostkowy. Dziedziną płata B- sklejanego jest prostokąt [u n, u N n ] [v m, v M m ]. Często dziedzinę otrzymuje się przez odrzucenie fragmentów takiego prostokąta wówczas mamy wtedy płat obcięty. Rys. Obcięty płat Béziera Punkty kontrolne płata każdego z tych rodzajów dla wygody kształtowania przedstawia się w postaci siatki. Wyróżniamy w niej wiersze i kolumny. Wyznaczenie punktu na powierzchni, dla ustalonych parametrów u i v można sprowadzić do wyznaczania punktów na krzywych (Béziera albo B-sklejanych): p(u, v) = n m i=0( j=0 p ij B m j (v)) B n i (u) = n i=0 q i B n i (u)
Wszystkie działania wykonujemy na kolumnach siatki, traktując je tak, jakby to były łamane kontrolne krzywych. Punkty tych krzywych, odpowiadające ustalonemu v, są punktami kontrolnymi krzywej stałego parametru u leżącymi na płacie. Można też postąpić w odwrotnej kolejności i najpierw przetwarzać wiersze, a potem kolumnę otrzymanych punktów. Zasada przetwarzania reprezentacji płata w celu podwyższenia stopnia, podziału na kawałki, wstawienia węzła i obliczenia pochodnych cząstkowych jest identyczna. Płaty trójkątne Dziedziną trójkątnego płata Béziera jest zwykle trójkąt, którego wierzchołki stanowią układ odniesienia układu współrzędnych barycentrycznych r, s, t. Suma tych współrzędnych jest równa 1, wewnątrz trójkąta mają one wartości dodatnie. Płat jest określony wzorem, w którym występują wielomiany Bernsteina trzech zmiennych stopnia n i punkty kontrolne r, s, t będące wierzchołkami siatki kontrolnej płata trójkątnego. p(r, s, t) = p ijk B n ijk (r, s, t) i,j,k 0 i+j+k=n
Rys. Trójkątny płat Béziera i jego siatka kontrolna Płaty Béziera w praktyce Bicubic_patch jest zakrzywioną powierzchnią 3D utworzoną z siatki trójkątów. POV-Ray obsługuje typ Bicubic o nazwie patch Beziera. Funkcja bicubic_patch jest zdefiniowana w następujący sposób bicubic_patch { type t // 0 lub 1 (0 - mniej pamięci) [u_steps nu] // liczba wierszy w siatce końcowej [v_steps nv] // liczba kolumn w siatce końcowej [flatness f] // test gładkości <x1, y1, z1> <x2, y2, z2> <x16, y16, z16> // punkty kontrolne
[(opt.)] } Parametry u_steps i v_steps przyjmują wartości całkowite, które określają ile wierszy i kolumn trójkątów zostanie minimalne użytych do utworzenia zdefiniowanej powierzchni. Maksymalną liczbę poszczególnych kawałków plastra, które są testowane przez POV- Ray można obliczyć z następującego równania: 2 u_steps 2 v steps. Przykład Powierzchnia rozpięta pomiędzy 16-oma zdefiniowanymi punktami.
Powierzchnia uzyskana poprzez odpowiednie obrócenia i przesunięcia 6-ciu obiektów typu plat
Krzywe Béziera w praktyce
Program generuje gotowy kod do POV-Ray a (daje możliwość wyboru pomiędzy lathe a prism)
Przykład
Przykład
Przykład połącznia dwóch osobno opracowanych elementów.
Siatka (mesh) Obiekty mesh są bardzo przydatne ponieważ pozwalają nam na tworzenie obiektów zawierających setki lub tysiące trójkątów. W praktyce oznacza to możliwość utworzenia niemal dowolnej bryły konstrukcji (bardziej złożone kształty oraz duża dokładność odwzorowywanego elementów wiążą się z zastosowaniem dużej liczby trójkątów). Wszystkie tekstury, których chcemy zastosować wewnątrz siatki musimy zdefiniować przed jej utworzeniem. Tekstury (w tym parametr color) nie może być określony wewnątrz siatki ze względu na niską wydajność pamięci. mesh { triangle { <x1, y1, z1>, <x2, y2, z2>, <x3, y3, z3> [(opt.)] } triangle { <x1, y1, z1>, <x2, y2, z2>, <x3, y3, z3> [(opt.)] }... [inside_vector <x, y, z>] [(opt.)] } W przypadku gdy siatka jest zamknięta to możemy jej użyć do CSG, ale musimy podać inside_vector (wektor definiujący kierunek do wewnątrz).
Przykład
Rysunek wygenerowany w programie Matlab (zastosowanie czworokątów)