Tektura obiektów Tekstura opisuje wygląd powierzchni obiektów. W PovRay'u do opisu tekstury wykorzystuje się trzy parametry: barwnik - pigment (ang. pigment) określa kolor powierzchni obiektu; wektory normalne do powierzchni (ang. normals) umożliwiają symulacji różnych wzorców występujących na powierzchni obiektów: nierówności, wybojów, wgnieceń lub zmarszczek; wykończenie (ang. finishes) określa odbicia i refleksje światła na powierzchni obiektów. Ogólnie sekcja opisująca teksturę wygląda następująco: // definicja pigmentu normal { // definicja wektorów normalnych finish { // definicja parametrów wykończenia obiektu scale wspskalolwania rotate wspobrotu translate wspprzesunięcia Nie musimy definiować wszystkich parametrów, zostaną wówczas użyte wartości domyślne. Definiując jedną z sekcji np. pigment, można użyć formy skrótowej pomijając słowo texture i nawiasy { (patrz przykłady poniżej). 1. Pigment Jednolity kolor obiektów otrzymujemy wstawiając specyfikacje koloru do sekcji pigment: color Red Wzorce kolorów: dostępne są 3 wzorce kolorów: szachownica (ang. checker), sześciokąt (ang. hexagon), cegła (ang. brick) {rys. 1.. Stosując szachownicę lub cegłę należy podać dwa kolory oddzielone przecinkiem, dla sześciokąta trzy. W przypadku niewystarczającej ilości kolorów, brakujące są uzupełniane kolorami domyślnymi. #include "colors.inc" camera { location <-10, 7, -10> look_at <0, 0, 0> light_source {<-2, 10, -10> color White * 1.5 shadowless // brak cieni plane {<0, 1, 0>, 0 hexagon Red, Green, Blue scale.4 rys. 1. Wzorce kolorów. plane {<0, 0, 1>, 0 brick White Red plane {<1, 0, 0>, 0 checker White Black Dodajemy do pliku źródłowego definicje dwóch walców:
cylinder { 0, <0, 1, 0>, 1 hexagon Red, Green, Blue scale 0.2 translate <-2, 1, -2> cylinder { 0, <0, 0, -1>, 1 hexagon Red, Green, Blue scale 0.2 rotate x * 90 + y* 60 translate <-4, 1, -2>. rys. 2. Wzorzec sześciokątny na walcach Zwróć uwagę jak nałożone są wzorce na walcach (rys. 2). Uwaga! W podsekcjach sekcji texture można używać instrukcji: scale, rotate i translate (działają analogicznie jak dla obiektów), które oddziaływają tylko na elementy zawarte w tej sekcji. W powyższych listingach skalowanie dotyczy wyłącznie sześciokątnego wzoru nałożonego na walce. Ćwiczenie 1. Narysuj dowolną płaszczyznę pionową z naniesionym wzorem w kształcie sześciokątów. Ćwiczenie 2. Narysuj dowolną płaszczyznę z naniesionym wzorem w kształcie karo. Mapy kolorów umożliwiają zarówno wykorzystanie większej liczby kolorów jak również płynne przejścia pomiędzy nimi (rys. 4). Pierwszym parametrem jest gradient, który określa kierunek ułożenia warstw kolorów. W drugim parametrze definiujemy kolory oraz przedziały, w których będą obowiązywały. Każdemu punktowi powierzchni obiektu zostaje przypisana wartość liczbowa z przedziału <0, 1>, która następnie jest zastąpiona kolorem z mapy kolorów. W poniższym przykładzie dla wartości mniejszych od 0.1 zostanie użyty kolor czerwony, w przedziale (0.1, 0.3> kolor będzie się płynnie zmieniał od czerwonego do żółtego, w przedziale 0.3-0.6 następuje płynna zmiana koloru żółtego na niebieski, w przedziale 0.6 0.7 otrzymujemy czystą barwę niebieską, (dwa razy wyszczególniony ten sam kolor), dokładnie dla wartości 0.7 otrzymamy barwę zieloną, następnie pomiędzy 0.7 i 0.8 płynne przejście koloru z zielonego na pomarańczowy, dla wartości gradientu powyżej 0.8 otrzymamy czystą barwę pomarańczową (rys. 4a i 4b). cylinder { 0, <0, 0, -1>, 1 gradient x color_map { [0.1 color Red] [0.3 color Yellow] [0.6 color Blue] [0.7 color Blue] [0.7 color Green] [0.8 color Orange] rotate x * 90 + y* 60 translate <-3, 1, -2> rys. 3. Rysunek walca rys. 4b. Mapa kolorów (gradient x) rys. 4a. Mapa kolorów (gradient y) Mapy pigmentów umożliwiają z utworzenie obiektu składającego się z wielu warstw, gdzie każda warstwa może być zrobiona z innego materiału. Sześcian na rys. 5 zbudowany jest trzech warstw materiału: drewna, nefrytu i marmuru. Gotowe wzorce materiałów zdefiniowane są w plikach nagłówkowych, między innymi: textures.inc, stones.inc, woods.inc.
box { -1, 1 gradient x pigment_map { [0.33 wood ] // drewno [0.33 Jade] // nefryt [0.5 Jade] [.86 marble] // marmur rotate x * 60 scale 1.5 Mapy pigmentów można zagnieżdżać, np. jako wzorce umieszczone na szachownicy (rys. 6): cylinder {0 <0, 0, 2>, 2 checker Jade wood scale 0.2 scale 0.5 rotate -30 * x Mapy obrazów umożliwiają naniesienie 2D obrazu zapisanego w pliku na 3D obiekt. Obrazek nanoszony jest wielokrotnie na obiekt tak, aby pokryć całą jego powierzchnię. box { -2, 0 image_map { sys"grenadine.bmp" rotate -10* x+y*30 translate 4*x + 2*y cylinder {0 <0, 0, 2>, 2 image_map { "chess2.bmp" rotate 90 * x rotate -60 * x translate - 2.5 * x Pierwszy argument oznacza typ pliku graficznego. PovRay odczytuje pliki następujących typów: gif, tga, iff, ppm, pgm, png, jpeg, tiff, sys. Sys oznacza format pliku specyficzny dla danego systemu operacyjnego, np. bmp dla Windows'ów. Pliki obrazów najlepiej umieścić w tym samym katalogu co plik źródłowy. Ćwiczenie 3. Utwórz scenę przedstawiającą ścianę z powieszonymi na niej obrazami. Zadbaj również o szczegóły: ramy do obrazów, posadzka w karo, listwy przypodłogowe, drzwi. 2. Wektory normalne do powierzchni obiektu. Bardzo trudno modeluje się takie zjawiska jak nierówności powierzchni. W PovRay'u do tego celu wykorzystano wektory normalne, tzn. wektory, które w danych punktach są prostopadłe do powierzchni i skierowane w kierunku do niej przeciwnym. Poprzez sztuczną modyfikację lub zaburzanie wektorów normalnych można uzyskać efekt nierówności. Tak naprawdę powierzchnia jest nadal gładka, natomiast pojawiające się na niej refleksje światła sprawiają wrażenie nierówności. Do sekcji opisującej teksturę obiektu należy dodać sekcję normal. Wykorzystując wektory normalne można w prosty sposób modelować różnego rodzaju powierzchnie:
#include "colors.inc" #include "textures.inc" #include "golds.inc" #include "stones.inc" camera { location <0, 0, -5> look_at <0, 0, 0> background{white light_source {<-50, 150,-75> color White light_source {<-0, 10, -10> color White * 1.5 shadowless sphere {0, 0.8 color Red normal {bumps scale 0.1 rotate 45 * x translate -0.5 * x -y sphere {0, 0.8 color Red normal {agate scale 0.1 rotate 45 * x translate -1.3 * x +y box {0, 1 color DarkBrown normal {wood scale 0.1 * z rotate -45 * x translate 1 * x cone { 0,.6, 2 * y, 0 Jade scale 0.5 prism { linear_spline 0, 4, 7 <-1, 0> <1, 0> <0.5, 0.8> <0.45, 0.8> <-0.45, 0.8><-0.5, 0.8> <-1, 0> T_Gold_1A scale 0.5 translate -2 * x rotate -135 * x rys.8. Przykładowe tekstury Mapa pochyłości (ang. slope_map) jest wzorcem wektorów normalnych, który daje użytkownikowi duże możliwości indywidualnego określania nierówności powierzchni. Mapa nierówności może składać się od 2 do 256 sekcji parametrów ujętych w nawiasy: [wartość, <wysokość, nachylenie>]. Pierwszy parametr może zawierać liczby od 0 do 1, jest on porównywany z wartością obliczoną dla każdego punktu obiektu, zależną od jego położenia (podobnie jak przy mapie kolorów). Drugi parametr stanowi wektor przedstawiający wysokość (z przedziału od 0 do 1) oraz nachylenie (z przedziału [-3, 3]). Wartość 1 odpowiada kątowi 45 0. Nachylenie dodatnie odpowiada wznoszeniu się, ujemne opadaniu nierówności powierzchni.
Powtórzenie wzorca plane{z, 0 pigment{ Green normal { gradient x // kierunek gradientu slope_map { [0 <0.5, 1>] // początek pośrodku i wznoszenie się nierówności [0.25 <1.0, 0>] // płasko na szczycie [0.5 <0.5,-1>] // opadanie nierówności do połowy wysokości [0.75 <0.0, 0>] // płasko na dole [1 <0.5, 1>] // wznoszenie się nierówności do połowy wzniesienia rys. 9. Płaszczyzna z mapą pochyłości Mapy wektorów normalnych (ang. Normal Maps) definiuje się analogicznie jak mapy kolorów. Definiujemy podprzedziały (przedziału [0, 1]) i określamy jakie tekstury mają być w nich wykorzystane. Podobnie jak dla mapie kolorów każdemu punktowi obiektu zostaje przyporządkowana wartość z przedziału od 0 do 1. Na podstawie tej wartości wybierana jest odpowiednia tekstura. plane {z, 0 color Green normal { gradient x normal_map { [0.3 bumps ] [0.6 dents] [0.9 marble turbulence 1] * z rotate -45 * x translate 1 * x 3. Wykończenie powierzchni obiektów (ang. finish) Własności wykończenia wpływają na ostateczny wygląd powierzchni. Decydują o takich jej parametrach jak: odbicia światła, cienie, rozbłyski światła na powierzchni itp. Światło otoczenia (ang. ambient) decyduje o jasności obiektu i jest niezależne od oświetlenie sceny. Może być wyrażone przez liczbę z przedziału od 0 do 1 (czym większa wartość tym jaśniejszy obiekt) lub poprzez określenie koloru: finish{ambient 0.4 finish {ambient Red Światło odbite (ang. diffuse) określa jaka ilość światła jest odbijana od powierzchni obiektu. Wartość z przedziału od 0 do 1. 0.5 oznacza, że 50% światła jest odbijana od obiektu.
Odbicie zwierciadlane (ang. highlights) występuje na powierzchniach gładkich. Najczęściej stosuje się model odbicia Phonga. Wartość parametru phong z przedziału od 0 do 1 określa stopień odbicia, natomiast parametr phong_size (wartość z przedziału od 1 do 250) wielkość plamki. finish { phong 0.9 phong_size 50 sphere {0, 0.8 color Red finish { ambient 0.7 phong 0.9 phong_size 150 rotate 45 * x translate -1.3 * x +y rys Przykład odbicia zwierciadlanego