Prosta scena na początek


Zaczynamy od wstawienia na scenę prostego prostopadłościanu, oświetlenia go i ustawienia na niego kamery. Pierwszy „program” wygląda zatem tak:

#include "colors.inc"camera {   location <7,12,-20>   look_at <1,2,0>}light_source {   < -40, 35, -10>         color White}box{   <8,0,8>,<-14,1,-7>   pigment{color Red}}

 

Na początku „includujemy” plik colors.inc, który zawiera definicje kolorów. Następnie wybieramy gdzie znajduje się kamera i na jaki punkt patrzy. Definiujemy kolor i lokalizację punktowego źródła światła. Na końcu znajduje się definicja samego „pudełka” – ma kolor czerwony i narożniki w punktach <8,0,8> i <-14,1,-7>. Tak skonstruowany kod pozwala nam na osiągnięcie mało interesującego widoku… ale przynajmniej zaczyna się coś dziać 🙂

Rys. 1. Pojedyncze pudełko w kolorze czerwonym

Kolejnym etapem będzie dodanie drugiego prostopadłościanu, tym razem w kolorze żółtym. Do naszego kodu na końcu doklejamy nowy obiekt:

box{        <5,-1,5>,<-11,2,-4>        pigment{color Yellow}}

Nowe pudełko ma nieco inne wymiary i kolor. Po renderowaniu otrzymujemy co następuje:


Rys. 2. Dwa pudełka nakładające się na siebie

Najwyższa pora na pierwszą operację wykonywaną na bryłach. Aby nasze dwa prostopadłościany zamienić w ramkę wystarczy odjąć od siebie dwa elementy. Służy do tego polecenie difference. Pozostałe polecenia operacji na bryłach to unionintersectionmergeinverse. Kod naszych dwóch pudełek po ostatnich zmianach powinien wyglądać tak:

difference{        box{                <8,0,8>,<-14,1,-7>                pigment{color Red}        }        box{                <5,-1,5>,<-11,2,-4>                pigment{color Yellow}        }  }

Efekt można zaobserwować na obrazku poniżej:


Rys. 3. Operacja odjęcia brył

Na obrazku widać, że wycięta część jest w kolorze żółtym. Gdybyśmy zamienili kolejność działania (pudełka byłyby zadeklarowane w odwrotnej kolejności) otrzymalibyśmy nieco inny efekt:


Rys. 4. Operacja odjęcia brył – zmieniona kolejność odejmowania

Wracając jednak do naszej ramki… chcielibyśmy aby nasza ramka w całości była jednobarwna. Dodatkowo, dobrze byłoby ustawić ją w odpowiednim miejscu sceny. Do przemieszczenia obiektu używamy poleceń rotatescaletranslate. Każde z nich może przyjmować parametry w różnych postaciach. Kilka przykładowych zapisów:

scale 0.5            // skaluje we wszystkich osiach jednakoworotate -45*x         //obraca o -45 stopni względem osi xtranslate <5, 3, 2>  //przemieszcza obiekt o 5, 3 i 2 jednostki w osi - odpowiednio - x, y, z.

Ponieważ już wcześniej ustaliliśmy wymiary naszego obiektu pozostaje nam teraz go tylko odpowiednio obrócić i przestawić. Cała sekcja difference ma teraz postać:

difference{        box{<8,0,8>,<-14,1,-7>}         box{<5,-1,5>,<-11,2,-4>}                  pigment{color Red}        rotate <-35,35,0>         translate 3*y}

Nasza ramka zyskała teraz jednolity czerwony kolor, została obrócona o -35 stopni względem osi x, o 35 względem osi y, a następnie przesunięta o 3 jednostki w osi y. Wynik renderowania przedstawiono na rysunku:


Rys. 5. Ramka po operacjach transformacji

Skoro na naszej scenie mamy już ramkę przydałoby się podłoże. Takowe definiujemy za pomocą polecenia plane i umieszczamy w naszym kodzie (np. na końcu). Jako parametry plane przyjmuje wektor normalny i współrzędną, w której znajduje się owa płaszczyzna. Dla urozmaicenia od razu nadamy naszej podłodze odpowiedni wzór i barwę – będzie to czarno-biała szachownica:

difference{plane{        y,-3        texture{                pigment{ checker color Black color White}                scale 5.0        }}

Tym razem pigment znalazł się wewnątrz texture. Dzieje się dlatego, że mamy możliwość określania całej zewnętrznej powłoki bryły jako całości. Korzystamy z tego natychmiast, skalując naszą szachownicę – zostaje powiększona 5-krotnie. Poza texture możemy definiować np. interior, czyli wnętrze obiektu. Uzyskany efekt przedstawia rysunek:


Rys. 6. Ramka wylądowała na podłodze w szachownicę

Pierwsze rzeczy, które rzucają się w oczy to mało realistyczny wygląd ramki, nieskończona głębia ostrości i wyjątkowo nienaturalny cień rzucany przez ramkę. Na początek zajmiemy się ostatnimi dwiema opcjami. Aby uzyskać głębię ostrości musimy minimalnie przedefiniować naszą kamerę. Ostry cień jest za to winą punktowego źródła światła, które możemy zamienić w świecący obszar. Obie operacje znacznie wydłużą jednak czas renderingu, dlatego zostaną później „porzucone” aż do uzyskania odpowiedniego kształtu sceny. Ponieważ już niedługo zaczniemy używać tekstur na początku „includujemy” odpowiedni plik, a kompletny kod powinien teraz przedstawiać się tak:

difference{#include "colors.inc"    #include "textures.inc"  camera {   location <7,12,-20>   look_at <1,2,0>   aperture 1.0   blur_samples 100   variance 1/10000   focal_point <2,5,-4>}light_source {   < -40, 35, -10>    color White     area_light <5,0,0>,<0,0,5>,5,5   jitter   adaptive 1}difference{        box{<8,0,8>,<-14,1,-7>}         box{<5,-1,5>,<-11,2,-4>}                  pigment{color Red}        rotate <-35,35,0>         translate 3*y}plane{        y,-3        texture{                pigment{ checker color Black color White}                scale 5.0        }}

Jest już trochę lepiej, co widać na kolejnym rysunku. Naszej ramce wciąż jednak brakuje tekstury, dlatego modyfikujemy nasz obiekt „difference”:

difference{        box{<8,0,8>,<-14,1,-7>}         box{<5,-1,5>,<-11,2,-4>}                  texture{DMFWood6}        rotate <-35,35,0>         translate 3*y}

Efekty dwóch ostatnich renderowań widać na kolejnych rysunkach:


Rys. 7a i 7b. Ramka przed i po nałożeniu tekstury. Zastosowana głębia ostrości i światło wielopunktowe (area_light)

Aby nie zamęczyć naszego komputera i nie stracić specjalnie na jakości renderowanego obrazu zredukujemy nieco parametry dla głębi ostrości oraz zmniejszymy ilość punktów świetlnych (ten krok nie jest konieczny… ale służy wygodzie):

difference{camera {   location <7,12,-20>   look_at <1,2,0>   aperture 1.0   blur_samples 30   //variance 1/10000   focal_point <2,5,-4>}light_source {   < -40, 35, -10>    color White     area_light <5,0,0>,<0,0,5>,3,3   jitter   //adaptive 1}

Za pomocą powyższego kodu tworzymy kulę w punkcie <2,5,-1> i promieniu 4 jednostki. Zewnętrzna tekstura zdefiniowana jest za pomocą rgbf na kolor czerwony o przezroczystości 0.95, co ma wpływ na kolor przechodzącego przez nią światła. Za pomocą finish dodany jest połysk. Dla wnętrza kuli zdefiniowany jest ior, czyli Index Of Refraction. Dzięki niemu nasza kula zachowuje się jak soczewka a nie jak tradycyjny przezroczysty przedmiot. Efekty możemy obserwować poniżej:

Rys. 8. Ramka i półprzezroczysta kula

Jeśli chodzi o tą bryłę moglibyśmy na niej poprzestać, natomiast chcieliśmy jeszcze ją urozmaicić. Na powierzchni utworzymy „wyboje”. W rzeczywistości nasza kula nadal będzie idealnie okrągła a jedyne co ulegnie zmianie to sposób odbijania przez naszą bryłę światła. Ostateczny kod kuli:

difference{sphere {        <2,5,-1>, 4            texture{                pigment{ color rgbf <1,0,0,0.95>}                finish{                        phong 1                        reflection 0.5                 }                 normal{                        bumps 1.0                        scale 0.2                }               }        interior{                ior 1.5           }}

A tak prezentuje się wyrenderowana scena:


Rys. 9. Ramka i półprzezroczysta kula z dodanymi „wybojami”

Na koniec możemy dodać do naszej sceny niebo. Ponieważ jest to już ostatni etap prezentuję od razu pełny kod. Obraz końcowy będzie też renderowany w wyższej rozdzielczości i przy „lepszych” ustawieniach kamery i źródła światła.

#include "colors.inc"    #include "textures.inc"  camera {   location <7,12,-20>   look_at <1,2,0>   aperture 1.0   blur_samples 100   variance 1/10000   focal_point <2,5,-4>}light_source {   < -40, 35, -10>    color White     area_light <5,0,0>,<0,0,5>,3,3   jitter   adaptive 1}plane{        y,-3        texture{                pigment{ checker color Black color White}                scale 5.0        }}sky_sphere {pigment{FBM_Clouds}}difference{        box{<8,0,8>,<-14,1,-7>}         box{<5,-1,5>,<-11,2,-4>}                  texture{DMFWood6}        rotate <-35,35,0>         translate 3*y}sphere {        <2,5,-1>, 4            texture{                pigment{ color rgbf <1,0,0,0.95>}                finish{                        phong 1                        reflection 0.5                 }                 normal{                        bumps 1.0                        scale 0.2                }               }        interior{                ior 1.5           }}

A oto i obraz końcowy:


Rys. 10. Końcowy widok sceny

Polecam ten kod jako wyjście do dalszych zabaw z POV-Ray’em. W załączniku plik POV oraz ostatni obrazek w formacie jpg.


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *