POV-Ray Wykład 2
Własne obiekty Deklarowanie własnego obiektu: #declare nazwa = definicja_obiektu; nazwa jest to nazwa do jakiej będziemy się odwoływać w dalszej części naszego skryptu, definicja_obiektu jest to właściwa definicja obiektu składająca się np. z prymitywów, obiektów powstałych przez zastosowanie CSG. Przykład #declare kolo=union { sphere{<0,0,0> 0.5 texture{pigment{color Black}} scale<1,1,0.2> } sphere{<0,0,0> 0.25 texture{pigment{color White}} scale<1,1,0.5> } } Po zadeklarowaniu własnego obiektu możemy z niego skorzystać w swoim skrypcie wielokrotnie. Aby skorzystać z własnego obiektu: object{kolo} object{kolo translate<-4.5,0.5,-1.5>} object{kolo rotate<0,45,0> translate<-4.5,0.5,1.5>}
Przykład - Autobusy #declare kolo=union { sphere{<0,0,0> 0.5 texture{pigment{color Black}} scale<1,1,0.2> } sphere{<0,0,0> 0.25 texture{pigment{color White}} scale<1,1,0.5> } } #declare reflektor=union { sphere{<0,0,0> 0.2 texture{pigment{color White} finish{ambient 0.9}} scale<1,1,0.4> } } #declare autobus=union { difference { union { box{<-6,0.5,-1.5><6,3.5,1.5> texture{pigment{color Red}}} object{kolo translate<-4.5,0.5,-1.5>} object{kolo translate<-4.5,0.5,1.5>} object{kolo translate<3.8,0.5,-1.5>} object{kolo translate<3.8,0.5,1.5>} object{kolo translate<5,0.5,-1.5>} object{kolo translate<5,0.5,1.5>} light_source{<0, 0, 0> color White looks_like{reflektor} rotate<0,90,0> translate<-6, 1,-1>} light_source{<0, 0, 0> color White looks_like{reflektor} rotate<0,90,0> translate<-6, 1, 1>} } box{<-6.1, 2, -1.3><6.1, 3, 1.3> texture{pigment{color Brown}}} box{<-5.9, 2, -1.6><-4.9, 3, 1.6> texture{pigment{color Silver}}} box{<-4, 2, -1.6><-2, 3.3, 1.6> texture{pigment{color Silver}}} box{<-1.5, 2, -1.6><0.5, 3.3, 1.6> texture{pigment{color Silver}}}
box{<1, 2, -1.6><3, 3.3, 1.6> texture{pigment{color Silver}}} box{<3.5, 2, -1.6><5.5, 3.3, 1.6> texture{pigment{color Silver}}} box{<-5.9, 2.5, -1.4><5.9, 3.4, 1.4> texture{pigment{color Yellow}}} box{<-5.9, 1, -1.4><5.9, 2.5, 1.4> texture{pigment{color Brown}}} } } object{autobus rotate<0,-75,0>} object{autobus rotate<0,-75,0> translate<-6,0,0>} object{autobus rotate<0,-75,0> translate<6,0,0>} camera { location <8,2,-20> look_at <0,2,0> }
camera { location <0,2.5,0> look_at <-6,2,-6> }
Odblaski, predefiniowane tekstury W celu dodania odblasku do obiektu po pigment dodajemy polecenie finish{specular s roughness r} gdzie s jest to liczba z [0,1] definiująca nasycenie odblasku, r jest to wielkość miejsca odblasku (domyślnie 0.05; nie może przyjmować wartości 0). Predefiniowane tekstury znajdują się w plikach: textures.inc, golds.inc, metals.inc, stones.inc, woods.inc (http://www.povray.org/documentation/3.7.0/ http://texlib.povray.org/byname.html). Przeźroczystość Przeźroczystość możemy uzyskać za pośrednictwem metody filter lub metody transmit. texture{ pigment{color Red filter 0.7 }} texture{ pigment{color Red transmit 0.7 }}
Aby utworzyć efekt podobny do szkła, należy użyć interior{ior 1.5} Domyślna wartość ior 1,0 da żadnego załamania. Współczynnik załamania światła w powietrzu wynosi 1, wody 1.33, szkła 1.5 a diamentu 2.4.
Przednie szyby autobusów są koloru zielonego z parametrem odpowiedzialnym za stopień przeźroczystości określonym na poziomie 0.9 oraz współczynnikiem załamania światła odpowiadającym szkłu (1.5).
finish - opisuje sposób rozchodzenia się, odbijania i przyjmowania światła na obiekcie. finish{parametry} Wybrane parametry funkcji finish: Ambient - symuluje światło rozproszone w przestrzeni, obiekty w cieniu oświetlone są przez światło odbite od innych przedmiotów znajdujących się na scenie, ponieważ modelowanie takiego oświetlenia za pomocą raytraycing'u jest bardzo skomplikowane i czasochłonne, wykorzystywany jest w tym celu właśnie ambient. Wartość domyślna wynosi 0.1, wartość funkcji należy do przedziału [-1, 1], ale można używać parametrów z poza tego przedziału. Diffuse - rozproszenie światła odbitego, określa ile procent padającego światła ulega rozproszeniu. Wartość domyślna wynosi 0.6 (oznacza to, że 60% światła widzianego pochodzi bezpośrednio ze źródła oświetlenia), wartość funkcji należy do przedziału [0,1], ale można używać parametrów z poza przedziału. Brilliance - połysk, ilość światła, które ulega rozproszeniu po odbiciu od powierzchni obiektów, zależy od typu powierzchni i od kąta padania
promieni świetlnych. Parametr ten pozwala na modyfikację zachowania się lśniących powierzchni. Wartość domyślna wynosi 1.0, wartość funkcji należy do przedziału [-1, 10], ale można używać parametrów z poza przedziału. Phong - opisuje punktowe rozjaśnienia powierzchni obiektu, typowy efekt dla metalowych i szklanych powierzchni. Wartość domyślna wynosi 0.0, wartość funkcji należy do przedziału [0, 1] ale można używać parametrów większych niż 1, w przypadku gdy wartość jest równa 0, nie ma żadnego efektu, gdy parametr przyjmuje wartość większą od 0, występuje rozjaśnienie. Pong_size - występuje tylko gdy wcześniej został użyty phong (jeśli nie został użyty phong, phong_size nie da żadnego efektu), opisuje wielkość rozjaśnienia wywołanego przez phong. Wartość domyślna wynosi 40.0, wartość funkcji należy do przedziału <-1,1000>, ale można używać parametrów z poza przedziału, wówczas efekt jest nieco dziwny. Specular - funkcja bardzo podobna do phong (używa nieco odmiennego modelu), opisuje zjawiska świetlne na granicy przedmiotu, dotyczy zjawisk blisko granicy (horyzontu) przedmiotu. Wartość domyślna wynosi 0.0, wartość funkcji należy do przedziału [0, 1] ale można używać parametrów
większych niż 1, w przypadku gdy wartość jest równa 0, nie ma żadnego efektu, gdy parametr przyjmuje wartość większą od 0, występuje rozjaśnienie. Roughness - funkcja bardzo podobna do phong_size, występuje tylko gdy wcześniej został użyty specular (jeśli nie został użyty specular, roughness nie da żadnego efektu), opisuje wielkość rozjaśnienia wywołanego przez specular. Wartość domyślna wynosi 0.05, wartość funkcji należy do przedziału [-1,1], ale można używać parametrów z poza przedziału, wówczas efekt jest nieco dziwny. Metallic - występuje tylko gdy wcześniej został użyty phong lub specular (jeśli nie został użyty phong lub specular, metallic nie da żadnego efektu), opisuje kolor rozjaśnienia wywołanego przez phong lub specular. Wartość domyślna wynosi 0.0,wartość funkcji należy do przedziału [0, 1] ale można używać parametrów z poza przedziału.. Reflection - funkcja symulująca odbicie lustrzane na danym obiekcie. Wartość domyślna wynosi 0.0, wartość funkcji należy do przedziału [0, 1], ale można używać parametrów większych niż 1, w przypadku gdy wartość jest równa 0, nie ma żadnego efektu, gdy parametr przyjmuje wartość większą od 0, występuje efekt odbicia, gdy parametr jest równy 1.0
wówczas mamy idealne lustro. Dodatkowo w reflection występują takie funkcje jak: Rgb - kolor odbicia, obiekt może odbijać tylko jeden kolor. Wartość domyślna funkcji wynosi rgb <0,0,0>, wartość funkcji jest ustawiana jak zwykły kolor rgb. W przypadku gdy wartość jest równa 0, nie ma żadnego efektu [brak odbicia], gdy parametr przyjmuje wartość większą od 0, występuje efekt odbicia (konkretnie, ustawionego koloru), gdy parametr jest równy 1.0 wówczas mamy idealne lustro (efekt taki jak przy reflection równym 1.0). Irid - funkcja symuluje efekt światła na powierzchni z mikroskopijną przeźroczystą powłoką (plama oleju na kałuży). Wartość domyślna funkcji wynosi 0.0, wartość funkcji należy do przedziału [0,1] ale można używać parametrów większych niż 1. W irid występują takie funkcje jak: Thickness - grubość powłoki. Wartość domyślna funkcji wynosi 0.0,wartość funkcji należy do przedziału liczb całkowitych, znak nie ma tu żadnej różnicy. Turbulence - występuje tylko gdy wcześniej został użyty thickness, opisuje wielkość turbulencji, zaburzeń w powłoce irid. Wartość domyślna wynosi 0.0, wartość funkcji należy do przedziału liczb całkowitych (najlepsze efekty są przy małych liczbach).
Zestawienie wybranych tekstur
Zmienne Do definiowania zmiennych służą dwie instrukcje #declare nazwa1 = wartość1; #local nazwa2 = wartość2; Różnica jest taka, ze declare definiuje zmienną globalną, a local zmienną lokalną (widoczna jest jedynie w pliku/funkcji, w którym ja utworzono). Operatory arytmetyczne: +, -, *, /. Wbudowane stałe: pi, true, false, yes, no, on, off. Operatory logiczne: &,,!. Operatory porównania: <, <=, =,!=, >=, > Wybrane funkcje matematyczne abs(x) wartość bezwzględna mod(x, y) modulo y z x div(x, y) dzielenie całkowite pow(x, y) potęgowanie x do y log(x) logarytm o podstawie 10 floor(x) exp(x) funkcja ekspotencjalna ceil(x) sin(x) sinus rand(x) cos(x) cosinus seed(x) zaokrągla liczby do liczb całkowitych (w dół) zaokrągla liczby do liczb całkowitych (w górę) zwraca liczbę pseudolosowa z przedziału [0,1] ustawia ziarno generatora pseudolosowego
Instrukcja warunkowa #if(warunek 1) // polecenia #elseif(warunek 2) // polecenia #else //polecenia #end Pętle #while ( warunek ) // polecenia #end #for( identyfikator, start, koniec [, krok] ) // polecenia #end Deklaracja tablicy (indeksowanie elementów zaczyna się od 0) #declare tab_name = array[r1][r2]...; #declare tab1 = array[3]{1, 2, 3}; #declare tab2 = array[2][3]{{1, 2, 3}, {4, 5, 6}}; Zapis wartości do tablicy #declare tab_name[1] = pigment{red};
Definiowanie własnego makra #macro nazwa (param1, param2,... ) // polecenia #end W przypadku gdy wewnątrz makra będzie tworzony np. obiekt to makro będzie się zachowywać jak funkcja zwracająca pojedynczą wartość (ten obiekt). Drugim sposobem zwracania wartości jest zwracanie przez parametr, np. #macro przyklad (zm1,zm2, zm3) #declare zm1 =zm2 * zm3; #end Przykład Zdefiniowanie za pośrednictwem makra postaci piłkarza, w ramach którego parametrami wejściowymi będą kolory koszulki, spodenek i rękawów koszulki.
Pętla for w praktyce tworzenie trybun stadionu
Tablice, zmienne, liczby losowe w praktyce
Kamera Definicja kamery opisuje pozycje, typ rzutowania oraz właściwości kamery. Do zdefiniowania pozycji oraz ułożenia kamery służy polecenie: camera { location <x, y, z> direction <x, y, z> right <x, y, z> up <x, y, z> sky <x, y, z> angle k look_at <x, y, z> }
Wektory right, up służą do określenia formatu obrazu (aspect ratio). Do zmiany położenia kamery możemy również używać transformacji: translate, rotate. Typy rzutowania (pierwszy parametr w camera): perspective rzutowanie perspektywiczne (domyślne), parametr angle musi przyjmować wartość z przedziału (0, 180), orthographic rzutowanie równoległe, fisheye rzutowanie sferyczne, angle=180 daje standardowe rzutowanie sferyczne. Otrzymany obraz powinien być okrągły lub eliptyczny (w zależności od formatu obrazu), ultra_wide_angle działa podobnie jak rzutowanie sferyczne z ta różnica, że rzutowanie następuje na prostokąt a nie koło, omnimax rzutowanie sferyczne z katem poziomym 180 i zredukowanym katem pionowym, cylinder typ rzutowanie cylindryczne, scena jest rzutowana na cylinder. Parametr typ przyjmuje jedną z wartości: 1, 2, 3 lub 4, spherical scena rzutowana jest na sferę, panoramic rzutowanie panoramiczne. Obchodzi problem degeneracji rzutowania perspektywicznego kiedy kąt patrzenia zbliża się do 180 stopni.
Inne własności kamery: blur_samples [value] liczba próbek - wartość całkowita określająca maksymalną liczbę promieni w użyciu dla każdego piksela. Zastosowanie większej liczby promieni daje gładszy wygląd ale generuje większą liczbę obliczeń co przekłada się na czas generowania sceny. aperture value - definiowanie przesłony, im większa wartość tym większe rozmycie focal_point <x, y, z> ogniskowa - środek strefy ostrości jest określony przez wektor focal_point. Strefa ostrości jest płaszczyzną przechodzącą przez focal_point i jest równoległa do kamery. Obiekty w pobliżu płaszczyzny ostrości są w centrum uwagi, a te położone dalej są bardziej rozmyte. Domyślną wartością jest focal_point <0,0,0>. confidence i variance parametry definiujące funkcję adaptacyjną. confidence jest stosowany do określenia czy poszczególne próbki są wystarczająco blisko danego (oczekiwanego) koloru. variance to wartość wariancji określająca dopuszczalną tolerancję w zakresie wariancji pobranych próbek. Proces tworzenia sceny jest kończony gdy prawdopodobieństwo uzyskania oczekiwanych kolorów z poszczególnych próbek osiągnie przyjęte wartości graniczne.
camera { location <12,4,-30> look_at <0,0,0>} camera { location <12,4,-30> right<5, 0> up<0,1> look_at <0,0,0>}
Tworzenie filmów animacji W ramach programu POV-Ray nie ma możliwości bezpośredniego tworzenia animacji. Jednak istnieje możliwość wygenerowania określonej liczby kolejnych scen, z których za pośrednictwem innego programu (np. bmp2avi) można zmontować film (animację). Do wygenerowania określonej liczby scen wykorzystuje się zmienną clock, która domyślnie zmienia swoją wartość od 0 do 1 z wartością kroku uzależnioną od liczby zdefiniowanych klatek (scen). W ramach podstawowego zastosowania programu POV-Ray (quickres.ini) liczbę klatek definiuje się następująco: -j +kffx gdzie x jest liczbą klatek jakie mają zostać wygenerowane. Należy zwrócić uwagę na rozmiar oraz parametry generowanych scen (im większa scen tym dłuższy czas generowania co ma duże znaczenie w przypadku generowania większej liczby scen).
Ponieważ zmienna clock domyślnie przyjmuje kolejne wartości z zakresu od 0 do 1 dlatego należy opracować metodę umożliwiającą jej wykorzystanie do zmiany płożenia ruchomych obiektów w ramach danej sceny. Przykład (animacja przykładu z wykładu 2) Przyjęte założenia: poruszająca się w kierunku górnego prawego rogu bramki piłka uderzona z 20 metra (z punktu (0,0,-20)), poruszająca się za piłką kamera, interweniujący bramkarz.
Przykład (animacja przykładu z laboratorium 1) Przyjęte założenia: obejście budynku dookoła (360 stopni, wzrok skierowany na budynek) wejście przez drzwi wejściowe a następnie odwiedzenie kuchni i dużego pokoju (płynne zmiany kierunku i miejsca na który skierowany jest wzrok - kamera).
Ponieważ budynek o wymiarach (20,15,6) był utworzony od współrzędnych (0,0,0) to przed procesem projektowania animacji należy go wyważyć względem punktu ciężkości na płaszczyźnie XY (translate<-10, 0, -7.5>).
Położenie budynku ma duże znaczenie wobec zastosowania funkcji rotate, za pośrednictwem której zrealizowano okrążenie budynku.
Pliki konfiguracyjne (*.ini) Tak jak pokazały powyższe przykłady domyślna wartość zmiennej clock [0,1] w praktycznym zastosowaniu wymaga obróbki (przemnożenia przez odpowiednią wartość). Jednak istnieje możliwość zdefiniowania własnych parametrów generowanej sceny (w tym zakresu zmiennej clock) za pośrednictwem własnego pliku konfiguracyjnego (domyślna ścieżka to C:\Users\nazwa_konta\Documents\POV-Ray\v3.7\ini).
W plikach konfiguracyjnych możemy zdefiniować różne właściwości dotyczące renderingu. [nazwa pliku, dane informacyjne] Height/Width wysokość/szerokość wynikowego obrazu, Oputput_File_Type typ obrazu wynikowego (C TGA z kompresja, T TGA bez kompresji, N PNG, P PPM, S BMP), Quality jakość renderingu liczba ze zbioru {0,...,11} (domyślnie 9),
Antialias wygładzanie krawędzi (on włączony, off wyłączony). Antialias_Threshold współczynnik wygładzania, Initial_Clock wartość początkowa zmiennej clock, Final_Clock wartość końcowa zmiennej clock, Initial_Frame numer pierwszej klatki, Final_Frame numer ostatniej klatki (Final_Frame - Initial_Frame = liczba klatek do wyrenderowania), Dodatkowo: Input_File_Name nazwa skryptu, którego dotyczy plik ini, Output_File_Name nazwa wynikowego obrazu, Antialias_Depth opisuje głębie antialiasu (wartości 1 do 9) W sytuacji jeżeli któreś sceny źle wyrenderują się (ew. chcemy coś w nich zmodyfikować) wówczas nie musimy całego procesu powtarzać od początku tylko możemy zdefiniować zakres scen, które mają zostać ponownie wygenerowane. Subset_Start_Frame numer sceny od której rozpocznie się proces renderowania, Subset_End_Frame numer sceny na której skończy się proces renderowania.
W przykładzie (moj_plik_konfiguracyjny.ini) wartość początkowa clock to 1 a końcowa 140 co przy 140 klatkach (od 1 do 140) oznacza, że wartość clock będzie przyjmowała kolejne wartości całkowite: 1, 2, 3,,139, 140. Zmodyfikowany przykład (laboratorium 1)