Wykład Pov-Ray
POV-Ray (Persistence of Vision Raytracer) to dostępny na wiele platform I udostępniany na zasadach otwartego kodu renderer budujący obraz metodą śledzenia promieni. Sceny zbudowane dla POV-Ray opisywane są w jego własnym języku (opartym na C++), który bazuje na prostych obiektach geometrycznych i operacjach na CSG. Język ten pozwala dodatkowo na wykorzystywanie pętli i instrukcji warunkowych, zmiennych i tablic, w celu oprogramowania bardziej złożonych powierzchni (instrukcje do programu można znaleźć w samym programie w języku angielskim w zakładce help). Program dodatkowo symuluje różne typy oświetlenia, zjawiska atmosferyczne oraz efekty powierzchniowe. Po opisaniu wszystkich zastosowanych kształtów (położenie, kolory) i ustawieniu kamery pracę kończy się poprzez wykonanie zdjęcia stworzonej scenki. Sceny generowane przy pomocy POV-Ray'a mają fotorealisyczny wygląd. Wpływają na to przede wszystkim nowoczesne techniki tworzenia obrazu, jak: caustics (symulacja załamania światła na nierównej powierzchni), wykonywanie operacji logicznych na bryłach (CSG), photon mapping (technika realistycznego rozkładu oświetlenia ), radiosity (rozkład oświetlenia rozproszonego). Wiele programów do modelowania posiada wbudowany eksport do formatu POV- Ray lub oferuje odpowiednie wtyczki (np. Blender). Program dostępny jest bezpłatnie pod adresem www.pov-ray.org.
Program operuje na opisie obiektów w przestrzeni trójwymiarowej. Każdy element opisuje się trzema współrzędnymi <x,y,z>, które odpowiadają osiom jak na rysunku poniżej: Zakłada się, że środek monitora to punkt <0,0,0> regulacja w lewoprawo powoduje zmiany na osi x (pierwsza współrzędna), góra-dół to oś y (druga współrzędna), bliżej-dalej to oś z. Na przykład zapis <-3, 2, -4> oznacza przesunięcie w lewo o 3 jednostki, w górę o 2 jednostki i przybliżenie o 4 jednostki. W celu uzyskania obrazu należy zdefiniować następujące elementy: ustawić kamerę (miejsce z którego patrzy obserwator) ustawić źródła światła (przynajmniej jedno inaczej nie zobaczymy utworzonej sceny) stworzyć obiekt
POV-Ray pierwsza scena 3 kule
Efekt uzyskany po zmodyfikowaniu położenia obserwatora (kamery) z zachowaniem punktu, na który skierowany jest jego wzrok.
Tekstury W ramach programu POV-Ray mamy dostęp do biblioteki textures.inc zawierającej zdefiniowane tekstury. Przykład: sphere{ <0,2,3> 1 texture{pigment{brown_agate}} } // brązowy agat sphere{ <-3,2,-3> 1 texture{pigment{clouds}} } // chmury Przykładowe tekstury: Brown_Agate, Pink_Granite, Blue_Agate, Sapphire_Agate, Clouds, FBM_Clouds, Blood_Marble, Jade, Red_Marble, White_Marble, Blood_Sky, Blue_Sky, Blue_Agate, Apocalypse, Pink_Granite, Red_Marble, Sapphire_Agate, White_Marble, Candy_Cane, Peel, Cherry_Wood, Dark_Wood, DMFDarkOak, Tan_Wood, Tom_Wood, White_Wood, Tło rysunku (sceny) Kolor tła można w prosty sposób zmienić poprzez polecenie background. Funkcja ta nie ma żadnych parametrów po za kolorem, gdyż kolor rozchodzi się wszędzie równomiernie. background{color White}
background{color rgb<1,1,1>} Płaszczyzna Definiowanie płaszczyzn stanowi jeden z podstawowych elementów budowy scen 3D. W programie POV-Ray płaszczyzny definiuje się poprzez polecenie plane, którego składnia jest następująca: plane{płaszczyzna, przesunięcie, kolor - wypełnienie} Przykład plane{y, -6 texture{pigment{color Yellow}}} Zdefiniowanie płaszczyzny prostopadłej do osi y i przecinającej ją w punkcie (0,-6,0) wypełnionej barwą żółtą. plane{x, -4, texture{pigment{checker Black, White}}} Zdefiniowanie płaszczyzny prostopadłej do osi x i przecinającej ją w punkcie (-4,0,0) wypełnionej czarno-białą szachownicą.
Prostopadłościan Figurę tę definiujemy słowem box wraz z współrzędnymi dwóch przeciwległych wierzchołków oraz wypełnieniem. Przykład box{<-2,-1,-1> <2,1,1> texture{jade}}
Walec Walec definiujemy poleceniem cylinder podając kolejno współrzędną środka dolnej podstawy, współrzędną środka górnej podstawy, promień walca oraz rodzaj wypełnienia. Przykład cylinder{<0,-4,0> <0,0,0> 1 texture{pigment{color Yellow}}} Stożek Stożek definiujemy poleceniem cone podając kolejno współrzędną środka dolnej podstawy, promień dolnej podstawy, współrzędną środka górnej podstawy, promień górnej podstawy oraz rodzaj wypełnienia. Przykład cone{<0,1,0> 2 <0,3,0> 1 texture{pigment{color Silver}}}
Widok uzyskany po zmianie położenia obserwatora <5,-5.5,-7>oraz otwarciu stożka i walca (rozszerzenie poleceń cylinder i cone o parametr open).
Skalowanie figur Skalowanie figur realizujemy za pośrednictwem funkcji scale podając kolejno współczynniki skalowania po osiach x, y i z. Przykład sphere{<-3,0,0> 1 texture{pigment{color Yellow}} scale<1,2,1>} sphere{<3,0,0> 1 texture{pigment{color Yellow}} scale<1,0.5,1>} cylinder{<0,1,-4> <0,3,-4> 0.25 texture{pigment{color Silver}} scale<2,1,1>}
Polerowanie figur Efekt polerowania uzyskujemy za pośrednictwem polecenia finish poprzez określenie wartości jego dwóch parametrów reflection oraz phong. reflection mówi o stopniu "wypolerowania" kuli (wartość od 0 do 1) im ten parametr bliższy 1, tym bardziej kula przypomina lustro. phong świadczy o stopniu ilości światła na kuli (wartość od 0 do 1) im ten parametr bliższy 1, tym silniej na kuli będzie widać odbicie światła. sphere{<-3,0,0> 1 texture{pigment{color Yellow}} scale<1,2,1> finish{reflection 0.9 phong 0.1}}
Grupowanie Pov-Ray posiada instrukcje grupującą obiekty union, za pomocą której można ustalić szczegóły wypełnień dla grupy obiektów (figur). union{ sphere{<-3,0,0> 1 scale<1,2,1> } sphere{<3,0,0> 1 scale<1,0.5,1>} cylinder{<0,1,-4> <0,3,-4> 0.25 scale<2,1,1> } texture{jade} finish{reflection 0.1 phong 0.8} }
Obracanie Obrót figur uzyskujemy za pośrednictwem polecenia rotate umieszczanego po zakończeniu definicji tekstury a przed ostatnim nawiasem. Parametrami polecenia rotate są kolejno wartości obrotu względem oś x, y i z (każdy obiekt odwraca się przeciwnie do wskazówek zegara). cylinder{<0,-3,0> <0,3,0> 0.6 texture{pigment{color Yellow}} rotate <0,0,45>} cylinder{<0,-2,0> <0,2,0> 0.5 texture{pigment{color Brown}} rotate<60,0,0>}
Inne kształty Trójkąt uzyskujemy za pośrednictwem funkcji triangle. triangle{<-4,-1,-2> <0,-1,-2> <-2,1,0> texture{brown_agate}} Kształt dysku uzyskujemy za pośrednictwem funkcji disc. Jako parametry podajemy kolejno współrzędne środka dysku, wektor umiejscowienia dysku w przestrzeni (płaszczyzna dysku jest prostopadła do podanego wektora), promień zewnętrzny dysku, promień wewnętrzny dysku i cechy tekstury. disc{<0,0,0> <1,0,2> 1.5 0.5 texture{jade}} Wielokąt (figura płaska) uzyskujemy za pośrednictwem polecenia poligon. Jako parametry podajemy kolejno liczbę punktów, współrzędne kolejnych punktów (wszystkie punkty muszą leżeć na jednej płaszczyźnie) oraz parametry tekstury. polygon{4 <2,0,0> <4,-2,0> <4,2,0> <1,3,0> texture{pink_granite}}
Kształt torusu (tzw. obwarzanek) uzyskujemy za pośrednictwem polecenia torus, którego parametrami kolejno są promień torusa, grubość torusa oraz cechy wypełnienia (środek figury automatycznie zostaje określony w punkcie <0,0,0>). torus{3, 1 texture{jade}} Formę prostopadłościanu z wygładzonymi narożnikami uzyskujemy za pośrednictwem polecenia superellipsoid, którego parametrami są kolejno dwie wartości (od 0 do 1) odpowiedzialne za wygładzenie narożników figury (im bliżej 0 tym superellipsoid bardziej przypomina prostopadłościan) oraz parametry wypełnienia. Na etapie tworzenia figura domyślnie jest rozciągana pomiędzy punktami <-1,-1,-1> i <1,1,1> superellipsoid{<0.3, 0.2> texture{pink_granite}}
Widok uzyskany po obróceniu figur (rotate) oraz przeskalowaniu (scale).
Przesuwanie figur Wszystkie dostępne w Pov-Ray figury i bryły geometryczne można przesuwać za pośrednictwem polecenia translate, którego parametrami są współrzędne wektora przesunięcia. Uwaga. W praktyce wszystkie figury tworzy się względem środka układu współrzędnych i po dokonaniu stosownych operacji (np. skalowania, obracania) figury przesuwane są na właściwe miejsce.
Operacje arytmetyczne na figurach Połączenie figur można realizować za pośrednictwem poleceń union oraz merge. Polecenie merge wykorzystuje się w przypadkach gdy grupujemy ze sobą jednocześnie przeźroczyste i przecinające się nawzajem ponieważ w takim przypadku Pov-Ray ignoruje wszystkie ściany znajdujące się we wspólnej przestrzeni co daje efekt spójności bryły. Przykład union { sphere{<0,0,0> 2.2 texture{glass}} cone{<0,0,0> 2 <0,3,0> 0 texture{glass} translate<0,1,0>} cone{<0,0,0> 2 <0,-3,0> 0 texture{glass} translate<0,-1,0>} } merge { sphere{<0,0,0> 2.2 texture{glass}} cone{<0,0,0> 2 <0,3,0> 0 texture{glass} translate<0,1,0>} cone{<0,0,0> 2 <0,-3,0> 0 texture{glass} translate<0,-1,0>} }
Różnica Różnicę czyli w praktyce wycinanie z jednej bryły fragmentu przez inną bryłę (inne bryły) otrzymujemy poprzez zastosowanie polecenia difference. difference{ sphere{<0,0,0> 3 texture{pigment {color Green}} translate<0,-1,0>} cone{<0,0,0> 2 <0,-3,0> 0 texture{pigment {checker Yellow, White}} translate<0,2,0>} cylinder{<0,-5,0> <0,4,0> 0.75 texture{pigment{color Yellow}} rotate<-45,45,-70> translate<1,-1,-2.5>} box{<-1,-1,-1> <1,1,1> texture{jade} translate<2,0,-1>} }
Przypadek, w którym źródło światła zostało umieszczone wewnątrz bryły.
Część wspólna Za pośrednictwem polecenia intersection możemy tworzyć figury, które stanowią część wspólną figur składowych. intersection { difference { sphere{<0,0,0> 3 texture{pigment {color Green}}} sphere{<0,0,0> 2 texture{pigment {color Yellow}}} cylinder{<0,0,0> <0,4,0> 0.75 texture{pigment{color Yellow}} rotate<-45,-45,45>} cylinder{<0,0,0> <0,0,-4> 0.75 texture{pigment{color Yellow}}} cylinder{<0,0,0> <4,0,0> 0.75 texture{pigment{color Yellow}} rotate<0,45,0>} } box{<-4,-2,-1> <4,2,2> texture{jade} translate<2,0,-1>} }
Wstawianie tekstu Do wstawiania tekstu służy instrukcja text, która ma postać: text{tff nazwa_pliku_czcionki, tekst, głębokość, offset, wypełnienie, } Pierwsza litera tekstu domyślnie umieszczana a jest w punkcie <0,0,0>. Parametr głębokość określa szerokość liter w wymiarze z. Parametr offset to wyrażenie wektorowe oznaczające przesunięcie każdej kolejnej litery tekstu o dany wektor w stosunku do jej przewidywanego, oryginalnego położenia. Offset używamy do tworzenia "schodkowych" napisów. Jeżeli wartość offset jest dodatnia każda następna litera będzie wyżej, w przypadku ujemnego offsetu literki będą coraz niżej (offset =0 oznacza napis w poziomie). W przypadku tworzenie napisów rozmiar oraz położenie tekstu ustala się za pośrednictwem poleceń scale, rotate i translate. Przykład text{ttf "Arial.ttf", "Przyklad 1", 1,0 texture{jade}} text{ttf "Arial.ttf", "Przyklad 2", 0.5,0.1 texture{jade} rotate<0,-60,0> translate<-1,2,-4.5>} text{ttf "Arial.ttf", "Przyklad 3", 0.5,0 texture{jade} rotate<60,0,0> translate<0,0,-3>}
Klonowanie obiektów Klonowanie obiektów realizujemy za pośrednictwem polecenia declare. Przykład #declare uklad=union { sphere{<0,0,0> 1 texture{pigment {color Green}} translate<-2,0,0>} sphere{<0,0,0> 1 texture{pigment {color Yellow}} translate<2,0,0>} cylinder{<0,0,0> <4,0,0> 0.5 texture{blue_sky} translate<-2,0,0>} } object{uklad} // wyświetli się pierwszy obiekt object{uklad rotate<0,0,90>} // drugi obiekt object{uklad rotate<0,90,90> translate<-3,0,-2>} object{uklad rotate<0,90,90> translate<4,0,2>} // trzeci obiekt // czwarty obiekt
Łączenie figur Za pośrednictwem polecenie blob dokonujemy połączenia dwóch lub więcej figur w jedną bryłę. Parametr threshold (od 0.001 do 1) odpowiada za płynność połączeń. Podczas definicji elementów składowych należy określić parametr (1,2, ) odpowiedzialny za stopień wygładzenia figury (im większy tym większe okrągłości; np. w przypadku kuli występuje po promieniu). blob{ threshold 0.8 sphere{<0,0,0> 2 1 texture{pigment {color Green}} translate<-2,1,0>} sphere{<0,0,0> 1.5 10 texture{pigment {color Red}} translate<-2,-1,0>} cylinder{<0,-2,0> <0,2,0> 0.75 10 texture{pigment{yellow}} translate<-2,-4,0> } } blob { threshold 0.2 sphere{<0,0,0> 2 1 texture{pigment {color Yellow}} translate<2,1,0>} sphere{<0,0,0> 1.5 10 texture{pigment {color Green}} translate<2,-1,0>} cylinder{<0,-2,0> <0,2,0> 0.75 1 texture{pigment{red}} translate<2,-4,0> } }
Figura obrotowa Powierzchnie obrotowe otrzymujemy poprzez obrót zdefiniowanej krzywej składającej się z kolejnych punktów (pierwszy współrzędne <0,0>; współrzędna z domyślnie przyjmuje 0) wokół osi Y. Bryłę obrotową otrzymujemy poprzez zastosowanie polecenia lathe w połączeniu z metodą linear_spline (punkty łączone są liniowo, występują ostre krawędzie), cubic_spline ( gładkie łącznie punktów) lub quadratic_spline (metoda pośrednia pomiędzy linear_spline a cubic_spline). Przykład lathe { linear_spline 7 <0,0> <2,0> <3,3> <3,5> <2,3> <1,3> <0,6> scale<0.5, 0.5, 0.5> texture{jade} }
W powyższym przypadku zastosowano drugie źródło światła w celu oświetlenia części wklęsłej bryły (od góry).
Ponieważ metoda cubic_spline obcina pierwszy i ostatni punkt w celu zachowania kształtu bryły punkty te są zdublowane (zapisane dwukrotnie).
Bryłę obrotową możemy również otrzymać za pośrednictwem funkcji sor. Funkcjonalność funkcji sor jest zbliżona do funkcji lathe z tym, że sor krócej generuje obiekty kosztem dokładności. Każdy następny punkt musi być na wysokości niemniejszej niż punkt poprzedni. Jeżeli warunek ten nie zostanie spełniony, program zgłosi błąd.
Żarówka (lampa) Za pośrednictwem polecenia looks_like dowolnemu obiektowi możemy nadać właściwości źródła światła (cały obiekt będzie świecił). Przykład #declare lampa=union { blob { threshold 0.8 sphere{<0,0,0> 0.5 1} cylinder{<0,1,0> <0,0,0> 0.5 1} texture{pigment{color White} finish{ambient 0.95}} } cone{<0,0,0> 1 <0,2,0> 0.5 open texture{pigment{color Silver}} translate<0,1,0>} } light_source{<-4,2,4> color White looks_like{lampa} }
Przykłady tekstur i efektów Szachownica czarno-biała pigment{checker Black, White} Trzykolorowa układanka z sześcioboków foremnych pigment{hexagon color Red, White, Green} Efekt nieotynkowanej ściany pigment{brick color Black, Orange rotate<0,0,0>} Efekt plamy benzyny pigment{color Blue} finish{irid {0.8 thickness 0.5 turbulence 0.8}} W przypadku irid najczęściej stosuje się wartości z zakresu od 0.1 do 0.5. Zmiana wartości parametru (najczęściej w zakresie 0.2-1) thickness przynosi efekt zawirowania tęczy kolorów na powierzchni obiektu. Poprzez turbulence ustala się gęstość zawirowań (najczęściej stosuje się wartości z przedziału od 0.2 do 1).
Prism jest figurą leżącą na płaszczyźnie rozpiętej na osi X i Z. Za pośrednictwem funkcji conic_sweep uzyskujemy tzw. rozciąganie stożkowe. Mając do dyspozycji figurę płaską definiujemy zakres rozciągania po osi Y (w przykładzie dwie pierwsze wartości po linear_spline)
Stosowanie tekstur z pliku Przygotowana do zastosowania tekstura powinna znajdować się w pliku o rozszerzeniu png w tym samym katalogu, w którym jest zapisany plik programu Pov-Ray. pigment{image_map { png "nazwa_obrazu.png" map_type 1}} Parametr map_typ1 jest opcjonalny. Jego zastosowanie wymusza naciągnięcie całego obrazu na wskazany element (bryłę, płaszczyznę). Przykład Plik widok.png
Mapa wysokości Mapę wysokości (np. w celu stworzenia krajobrazu górskiego) uzyskujemy za pośrednictwem polecenia height_field. Height_field pobiera plik graficzny (*.tga) z zewnętrznego źródła (plik powinien znajdować się w tym samym katalogu co główny program) i w zależności od koloru każdego piksela określa wysokość obiektu w tym punkcie. Przykład height_field { tga "widok.tga" smooth pigment{color Red} translate<-0.5,-0.7,0.3> scale<15,5,15> }