• Welcome to Forum graficzne Burning-Brushes.pl. Please log in or sign up.
 

Podstawy POV-Raya - poradnik

Zaczęty przez Abik, Grudzień 03, 2011, 18:10:36

Poprzedni wątek - Następny wątek
Witam wszystkich w moim nowym tutorialu. Powiedzmy, że zbliżają się święta i czuję się zobowiązany coś wam sprezentować. Nie wiem czy wam się ten tutek spodoba czy nie bo nie oszukujmy się, POV-Ray nie jest zbyt mainstreamowym programem, co wg mnie czyni go nawet bardziej interesującym.
Zanim zaczniemy faktyczną naukę, to powiedzmy sobie chociaż trochę jaki jest sens uczyć się POV-Raya i czy w ogóle taki sens istnieje? Szczerze mówiąc to sam nie wiem tak do końca. Ponoć lepiej uczyć się rzeczy zbędnych niż żadnych, z czym w 100% się zgadzam, ale nie każdy musi uważać tak samo. No ale to raczej marna zachęta, co nie? Osobiście uważam POV-Raya za bardzo przydatne narzędzie do eksperymentowania, tworzenia napisów 3d. Do tego używam go ja. Ale możliwości tego programu są nieograniczone, o czym sami się przekonacie i chociażby dla tych ogromnych możliwości POV-Ray jest wart waszego czasu.
Czy POV-Ray jakoś się wyróżnia na tle innych programów do grafiki 3D? Ma może jakieś mocne strony, które dają mu przewagę? Dobrze byłoby sobie odpowiedzieć na takie pytania, które mogłyby być jednocześnie odpowiedzią na to, dlaczego warto nauczyć się obsługi tego programu. POV-Ray jest bardzo charakterystycznym oprogramowaniem 3D, zapewniam was, że drugiego takiego łatwo nie znajdziecie, dlaczego? Bo w POV-Rayu grafiki się "nie wyklikuje" tylko "wypisuje" czy programuje jak kto woli. Praca w POV-Rayu polega na opisywaniu sceny, wydawaniu pewnych poleceń, konfigurowaniu obiektów, a nie na przeciąganiu ich myszką tu i tam. Dla niektórych może to być przerażające, ale to właśnie jest tym co najbardziej POV-Raya od reszty odróżnia, jest jednocześnie jego dużą zaletą, pod warunkiem, że umie się sprawnie pisać i pozna się język POV-Raya dokładnie.
No i wiecie, jest jeszcze inna kwestia, że z POV-Raya korzysta mało osób i to jest na prawdę mega szpan gdy się go opanuje. Osobiście znam tylko dwie osoby, które miały styczność z tym programem, oboje uczyli mnie na polibudzie fizyki, więc jak sami widzicie nie jest to wcale program zabawka i poważni ludzie z niego korzystają. Z drugiej strony, jego obsługa jest na prawdę prosta, ale wymaga pewnych umiejętności. Po pierwsze wyobraźni. Bez tego praca w POV-Rayu to ekstremalna udręka bo tu nie widzimy naszej sceny cały czas. No chyba, że trochę się wysilicie i podejmiecie próbę wyćwiczenia tej wyobraźni bo POV-Ray właśnie w takim celu treningowym też jest świetny. Druga sprawa- zwłaszcza na początku przydają się jakieś podstawowe umiejętności matematyczne, typu odróżnianie kuli od stożka, średnicy od promienia, rozumienie trójwymiarowych układów współrzędnych i parę innych. Znów może brzmieć to przerażająco, ale w praktyce zobaczycie, że nawet jeśli wydaje wam się, że nie macie o tym wszystkim pojęcia, to POV-Ray pokaże wam, że jednak macie i pozwoli wam je dodatkowo przećwiczyć. Warto pamięć przy tej okazji, że grafika komputerowa w 100% opiera się na matematyce czy to 3d, czy 2d, to jest czysta matematyka, w POV-Rayu po prostu widzimy to bezpośrednio i dzięki temu może niektórzy z was będą wstanie matematykę lepiej zrozumieć, a może nawet polubić. Nawet jeśli nie, to nie jest to aż tak bardzo niezbędne do pracy w tym niezwykłym programie.

1. Podstawowe podstawy podstaw.
Zacznijmy może od tego co najważniejsze, czyli od interfejsu programu. Wygląda on tak:

No szału nie robi, ale nie o to chodzi. Co tu mamy za narzędzia i inne bajery? To co najważniejsze, z czego będziemy bez przerwy korzystać możemy dokładniej zobaczyć tutaj:

Pierwsza ważna ikona to ta zaznaczona na czerwono, która pozwala nam bardzo szybko tworzyć nowe pliki. Kolejny przycisk (kolor zielony) to skrót to funkcji otwierania plików. Na niebiesko zaznaczona funkcja szybkiego zapisu. To takie oczywiste oczywistości. Pierwszą ciekawą rzeczą jest ten gadżet zaznaczony na żółto, opisany jak RUN. Polecenie RUN służy do wyrenderowania naszego obrazu, jest to bardzo istotna funkcja, no bo przecież po to tworzymy nasze grafiki, żeby móc je zobaczyć, w tym celu właśnie korzystamy z polecenia RUN! Powiązana z nim jest pewna opcja, którą zaznaczyłem na różowo. Jest to lista, z której możemy wybrać jak duże obrazy ma renderować POV-Ray oraz czy ma to robić z antyaliasingiem (AA) czy bez, czyli w uproszczeniu, czy ma wygładzać linie, czy nie. Te wielkie białe pole na dole to miejsce gdzie będziemy pisać nasze grafiki, pozostałe funkcje są mniej istotne i chyba nie będziemy z nich korzystać, w najgorszym wypadku opiszę je jak przyjdzie potrzeba.

Znamy już interfejs programu, jesteśmy mega czadowi, ale musimy jeszcze poznać pewne zasady, jakimi kieruje się POV-Ray. Chodzi mi o przestrzeń 3D. Niby prosta sprawa, długość, szerokość wysokość i gra gitara, ale warto jakoś to sobie wyobrazić tak żeby nie utrudniać całej sprawy. Najprościej jest przyjąć, że oś X jest osią poziomą, równoległą do górnej i dolnej krawędzi monitora, oś Y jest osią pionową, równoległą do bocznych krawędzi monitora i przecina się z osią X gdzieś w środku monitora. Do tego mamy jeszcze oś Z, która też jest pozioma (tak jak X), ale w stosunku do górnej i dolnej krawędzi monitora (gdybyśmy mieli rzut z góry) jest prostopadła.
Nie wiem czy ktoś to rozumie, więc niech będzie rysunek:

Myślę, że tu widać wyraźnie to o czym piszę. W środku naszego monitora przecinają się wszystkie osie, co zaznaczone jest zielonym punktem, o współrzędnych 0,0,0. W kierunku gdzie znajduje się grot osi, wartości danej współrzędnej rosną, w przeciwnym kierunku maleją (poniżej zera przyjmują wartości ujemne oczywiście). Pierwsza współrzędna to X, druga Y, trzecia Z. Jeśli to zrozumiemy to praca w POV-Rayu będzie dla nas czystą przyjemnością.

Ostatnie co musimy wiedzieć zanim zaczniemy umieszczać obiekty na scenie, to jak ustawić kamerę i światło. Oba te elementy są bezwzględnie niezbędne, żeby móc zobaczyć coś na naszej scenie, na szczęście ich konfiguracja jest całkiem prosta.
Zacznijmy może od kamery. Nie powinniśmy się tak do końca przywiązywać do wstępnych ustawień bo przecież w każdej chwili możemy je zmienić, ale osobiście na początku lubię mieć kamerę ustawioną mniej więcej jakby z rzutu izometrycznego, czyli tak jakbym patrzył na przestrzeń trochę z przodu, z góry i z boku jednocześnie, tak żeby widzieć wszystkie osie (mniej więcej tak jak na poprzednim rysunku). Musimy zatem pooperować na wszystkich współrzędnych. Chcemy być trochę u góry, czyli Y musimy przyjąć dodatnią wartość, nieco z boku (np. z prawej strony), czyli X też przyjmuje wartość dodatnią i przed sceną czyli Z musi być ujemne.
Np. Niech X = 5, Y = 5, Z = - 10 (aby uzyskać w pełni izometryczny rzut, wszystkie składowe powinny być równe, więc jak ktoś woli może sobie zmienić).
Jak pisałem, w POV-Rayu grafikę opisujemy, więc jak mamy opisać naszą kamerę? Mamy taki obiekt jak camera, wystarczy nadać mu kilka opcji i gotowe, o tak:
camera{
location<5,5,-10>
}

Świetnie! Mamy kamerę, no ale pokażę wam coś. Gdybyśmy teraz na scenie coś umieścili w samym środku (punkt 0,0,0) to efekt byłby następujący:

Mamy kulę na środku, ale za dobrze to nie wygląda bo zamiast patrzeć na nią, kamera patrzy gdzieś w dal. Bo tak domyślnie się dzieje, kamera patrzy "w przód". Możemy to zmienić opcją look_at:
camera{
location<5,5,-10>
look_at<0,0,0>
}

Efekt:

Widać kulę! Jako że trudno do końca zauważyć skąd na nią patrzymy, obok mamy drugi obrazek sześcianu przy identycznych ustawieniach, tam widać wyraźnie, skąd patrzymy.
Troch was jednak oszukuję bo gdybyśmy taki kod jak przed chwilą, uruchomili to nic nie zobaczymy. Po pierwsze - nie wiemy jak zapisać obiekty(o tym nieco później), po drugie - nie mamy światła!
Światło jest tak samo proste w utworzeniu jak kamera. Zróbmy sobie światło od przodu (składowa Z o wartości ujemnej) trochę z góry (składowa Y dodatnia), coś jak wstające rano Słońce. Korzystamy w tym celu z obiektu light_source, o tak:

light_source{
<0,3,-8>
color <1,1,1>
}

Wszystko jasne poza jedną rzeczą, o której nie ostrzegłem. Światło musi mieć jakiś kolor. Co to za kolor 1,1,1 ? Jest to kolor biały. Dlaczego? No w POV-Rayu koloru opisujemy składowymi RGB z wartościami od 0 do 1. 0,0,0 to kolor czarny. Możliwości doboru koloru jest wiele bo możemy korzystać z ułamków oczywiście, np. 0.314, 0.529, 0.192. Możemy zrobić pewien trik. Na początku pliku dopisać taką linijkę:

#include "colors.inc"

Co oznacza, że pożyczamy sobie od POV-Raya plik colors.inc, który zawiera kilka podstawowych kolorów. Pomoże nam on uprościć nasz zapis do następującej postaci:

light_source{
<0,3,-8>
color White
}

Wspaniałe co nie? No raczej nie, ale na pewno pomocne :D
Nie da się tak dokładnie w jakiś bardzo prosty sposób manipulować siłą światła. Jedną z rzeczy, które możemy zrobić to dać kilka źródeł w jednym miejscu. Spójrzcie sami:

Ten pierwszy obrazek jest nam dobrze znany, to właśnie kula oświetlona takim światłem jak w naszym przykładzie, ta druga kula oświetlona jest dwoma takimi samymi światłami, różnica jest wyraźna. Dzięki temu, że można umieścić kilka świateł na scenie, możemy nie tylko zwiększać moc, możemy tworzyć bardzo skomplikowane oświetlenie, różnych kombinacji, z różnych miejsc, o różnym kolorze, co pozwala  dobrze dopasować światło do danej sceny. Czad!

2. Podstawowe bryły.
Mamy już podstawowe informacje o tym jak obsługiwać POV-Raya i jak ustawić dwa podstawowe i najważniejsze elementy naszej sceny czyli światło i kamerę. Nasz kod, wygląda w tym momencie tak:

#include "colors.inc"

camera{
location<5,5,-10>
look_at<0,0,0>
}                 
             
light_source{
<0,3,-8>
color White
}   

No, ale ja w moich przykładach mam jakieś fajne kulki, sześciany, a wy nie. I coś z tym musimy zrobić. Nie będę przedłużał tego chwalebnego momentu, kulę tworzymy poleceniem sphere, musimy ustalić punkt, który będzie środkiem kuli, jej promień no i kolor. Tadam:

sphere{
<0,0,0>,3
pigment{color<0.5,0.5,0.5>}
}

to jest dokładnie taka kula jak ta z wcześniejszych przykładów. Zainteresowanie może wzbudzić ten "pigment", ale on służy do nadawania obiektom wskazanych kolorów. No dobra, wiemy już jak zrobić sobie kulę, nadać jej kolor, umieścić w przestrzeni, oświetlić. Z tego da się coś już zrobić, zabawcie się trochę, pokombinujcie.

:D ... tia... w każdym razie pamiętajcie, piszemy sphere{<x,y,z,>,r} gdzie x,y,z to współrzędne środka, prościzna.


Czas poznać coś więcej niż tylko kule. Czas na prostopadłościan. Taki schemat prostopadłościanu to box{<x1,y1,z1>,<x2,y2,z2>} gdzie x1,y1,z1 opisują dolny lewy przedni róg, a x2,y2,z2 górny prawy tylni (chociaż to zależy w dużej mierze od tego jakie nadamy im współrzędne), w każdym razie spójrzcie o co mi chodzi:

to powinno wszystko wyjaśnić. Przy czym to jest bardzo umowne bo tak jak pisałem zależy od tego jakie wartości nadamy x,y,z.
Ten prostopadłościan z obrazka ma następujący kod:

box{
<-1,-1,-1>,<2,2,2>
pigment{color<0.5,0.5,0.5>}
}   

Kamera i światło oczywiście takie jak we wszystkich wcześniejszych przykładach. Swoją drogą mój przykładowy prostopadłościan jest sześcianem bo różnice między wszystkimi składowymi są takie same. Teraz znając już te dwie bryły możemy zrobić jeszcze więcej!


Dobra jedziemy dalej to może jeszcze dziś skończę tego tuta :D
Kolejną bryłą jaką mamy do dyspozycji jest walec. Poleceni cylinder{<x1,y1,z1>,<x2,y2,z2>,r} x,y,z1 opisują punkt, w środka pierwszej podstawy walca, x,y,z2 opisują punkt drugiej podstawy, a r to promień naszej figury. No wiecie jak wygląda walec chyba co nie? W POV-Rayu, tak:

cylinder{
<0,-1,0>,<0,2,0>,4
pigment{color<0.5,0.5,0.5>}
}

czyli tak:

Znając tyle brył możemy sobie zrobić np. bałwana.

Czad no nie? :>
A to dopiero 3 bryły. A prostopadłościanu i tak nie użyliśmy!

Kolejną bryłą do przeanalizowania będzie dla nas stożek. Stożek w POV-Rayu w zasadzie jest stożkiem ściętym, tzn. nie ma takiego tego czubeczka. ALE stożek nieścięty to tak na prawdę stożek ścięty z promieniem jednej z podstaw równym zero. Dlaczego o tym mówię, zaraz zobaczycie. Komenda do umieszczania stożka na scenie jest taka: cone{<x1,y1,z1>,r1,<x2,y2,z2,r2}. Widzicie dwa promienie? Spójrzcie na różnice pomiędzy zerowym i niezerowym promieniem:

z takiego kodu:
cone{
<0,0,0>,3,<0,2,0>,2
pigment{color<0.5,0.5,0.5>}
}

mamy ten pierwszy, a z takiego:
cone{
<0,0,0>,3,<0,2,0>,0
pigment{color<0.5,0.5,0.5>}
}

ten drugi. Prościzna co nie? Możemy sobie dorobić ładny nosek do naszego bałwana.


Teraz czas na bryłę, której możecie nie znać tak do końca tak dobrze jak te, które dotąd poznaliśmy. Torus.
To jest... albo co będę się produkować, jak i tak nikt tego nie czyta, spójrzcie, torus, to jest coś takiego... albo nie! Jeszcze chwila. W POV-Rayu torus wprowadzamy poleceniem torus{r1, r2}, domyślnie tworzony jest ze środkiem w punkcie 0,0,0, a żeby go przemieścić będziemy potrzebować umiejętności, o której powiem nieco później. I teraz dopiero mogę pokazać wam torus, z zaznaczonymi promieniami:

Widzicie, to coś.. to to jest właśnie torus. Taki gadżet, przydatny zapewniam.

To by było tyle na temat podstawowych brył, ale jest jeszcze jedno o czym chciałbym wam powiedzieć, coś takiego jak nazwijmy to "płaszczyzna". Możemy sobie zrobić taką figurę, jeśli da się tak to nazwać. Poleceni plane{oś_do_której_płaszczyzna_ma_być_prostopadła, odległość_płaszczyzny_od_punktu_zero}. Co to w ogóle znaczy? No tyle, że jeśli np. podamy płaszczyznę y, to będziemy mieć ziemię! :D na jakiej wysokości, to zależy od drugiego parametru. Przykładowy kod:

plane{
y, -3.5
pigment{color White}
}

W przykładzie z bałwanem np. dodajmy sobie trochę gleby:

No teraz nasze obiekty nie będą musiały fruwać w powietrzu, pro!

3. Operacje na bryłach.
Umiemy trochę już porobić, pogrzebać itp itd etc, ale wiele rzeczy robimy w strasznie toporny sposób, można by to poprawić i przy okazji nauczyć się kilku nowych rzeczy. Ale jak? Już mówię.
Wolicie zacząć od operacji na pojedynczych obiektach czy od operacji łączenia, odejmowania obiektów? Buehehe gówno mnie to obchodzi, więc zaczniemy od operacji na pojedynczych obiektach :D
Pierwszą, chyba najprostszą, ale dość ważną operacją jest przesuwanie. Tak, w górę, dół, lewo prawo i w co się da. Polecenie translate<x,y,z> gdzie x,y,z mówią nam o ile jednostek mamy przesunąć dany obiekt. Przykładowy kod:
sphere{
<0,0,0>,3
pigment{color<0.5,0.5,0.5>}
translate<0,0,2>
}

To po prostu przesunie naszą kulkę trochę do tyłu. Proste? Pewnie, że proste, ale o tyle ważne, że korzystanie z translate jest wygodne nie tylko do przesuwania obiektów, ale wręcz ustalania ich pozycji. W przypadku kuli to może akurat mniej bo mamy tylko jedną współrzędną (środka), ale np. taki walec do opisania potrzebuje dwóch współrzędnych i gdy chcemy go przesunąć to trzeba zmienić obie współrzędne. Dlatego wiele osób robi coś takiego, że wszystkie figury umieszcza w punkcie 0,0,0 (plus ewentualna druga współrzędna jeśli jest wymagana) i korzysta z polecenia translate do umiejscowienia obiektu w przestrzeni. Pamiętajcie o tym bo to ułatwia bardzo życie.

Równie prostą i jednocześnie przydatną opcją jest polecenie rotate<x,y,z> gdzie tym razem x,y,z są kątami o jaki ma zostać obracóna figura względem wybranej osi. Spójrzcie na ten kod:
box{
<0,0,0>,<2,2,2>
pigment{color<0.5,0.5,0.5>}
rotate<60,0,0>
}

Przy naszym standardowym oświetleniu i kamerze wyglądałoby to tak(po lewej bez obracania, po prawej z):


Ostatnią na dziś operacją tego typu jest skalowanie. Zapis: scale<x,y,z> co oznacza skalowanie wzdłuż danej osi. Możemy dzięki tej operacji łatwo przerobić sobie kulę na elipsoidę:

sphere{
<0,0,0>,2
pigment{color<0.5,0.5,0.5>}
scale<3,0,0>
}


Drugi rodzaj operacji jaki dziś poznamy, to coś w na wzór operacji matematycznych na zbiorach. Wiecie suma zbiorów, różnica, część wspólna. Jest to przydatne do tworzenia bardziej złożonych kształtów, gdzie możemy zrobić bryłę, wsadzić w nią inną, i wyciąć.
Pierwsza z tych operacji jest banalnie prosta, ale równie ważna. Union{A B}, gdzie A to pierwszy obiekt, a B, to drugi. Union, jest sumą obu obiektów. Teoretycznie nie jest to żeby ciekawa opcja bo wizualnie niczego nie zmienia, ale praktycznie przydaje się do stosowania różnych transformacji na kilku obiektach na raz. Spójrzcie na ten kod, który to wszystko obrazuje:
union{

//ta kula jest naszym obiektem A
sphere{
  <0,0,0>,2
  pigment{color<0.5,0.5,0.5>}
  scale<3,0,0>
}     

//a ten box to nasz obiekt B
box{
  <0,0,0>,<2,2,2> 
  pigment{color<0.5,0.5,0.5>} 
  translate<0,0,-3>
}

rotate<0,0,60>
}

w efekcie:


Druga operacja to część wspólna obu obiektów. Czyli nowy obiekt, stworzony na podstawie dwóch, w przestrzeni gdzie na siebie nachodzą. Zapisujemy to intersction{A B}, przykład:
intersection{

//ta kula jest naszym obiektem A
sphere{
  <0,0,0>,2
  pigment{color<0.5,0.5,0.5>}
}     

//a ten box to nasz obiekt B
box{
  <0,0,0>,<2,2,2> 
  pigment{color<0.5,0.5,0.5>} 
  translate<0,0,-1>
}

}


Wycięliśmy sobie ćwiartkę kuli ;D

Ostatnią rzeczą jakiej się dziś nauczymy to tworzenie różnicy dwóch obiektów. Zapis difference{A B}. Co ważne, difference{B A} da nam inny wynik, pamiętajcie o tym w przyszłości, a teraz popatrzcie na przykład:

Obrazek po lewej to difference{A B} o następującym kodzie:
difference{
//ta kula jest naszym obiektem A
sphere{
  <0,0,0>,2
  pigment{color<0.5,0.5,0.5>}
}     
     
//ten box to nasz obiekt B
box{
  <0,0,0>,<2,2,2> 
  pigment{color<0.5,0.5,0.5>} 
  translate<0,0,-1>
}

}

Drugi obrazek, difference{B A}:
difference{
   //ten box to nasz obiekt B
box{
  <0,0,0>,<2,2,2> 
  pigment{color<0.5,0.5,0.5>} 
  translate<0,0,-1>
}

//ta kula jest naszym obiektem A
sphere{
  <0,0,0>,2
  pigment{color<0.5,0.5,0.5>}
}     

}


Tutaj możecie przeczytać jeszcze w jaki sposób możemy tworzyć napisy 3D w POV-Rayu: http://burning-brushes.pl/pozostale-tutoriale/jak-zrobic-napisy-3d-w-pov-rayu/ część wiedzy z tamtego tutoriala dubluje się z tym, ale powtórka nigdy nie zaszkodzi i nikt was nie zmusza do czytania od dechy do dechy.

Umiejętność wykorzystania wszystkich tych operacji i brył teoretycznie daje nam możliwość wymodelowania wszystkiego, w praktyce może to wymagać ogromnego nakładu pracy, który dałoby się zmniejszyć używając bardziej wyspecjalizowanych instrukcji. W tym tutorialu niestety to już wszystko, czy będzie następny tego obiecać nie mogę, w dużej mierze zależy to od was, będzie zainteresowanie, będą tutoriale, nie to nie, więc pożyjemy zobaczymy.

TUTORIAL WYKONANY TYLKO I WYŁĄCZNIE DLA BURNING-BRUSHES.PL


4. Przykłady.
Tutaj macie kody przykładowych obrazków. Najlepiej byłoby jakbyście patrzyli na obrazek i sami próbowali go zrobić, ewentualnie do kodu zaglądali tylko gdy macie jakieś wątpliwości. Spróbujcie to po prostu potraktować jak ćwiczenia.

#include "colors.inc"

camera{
location<5,5,-10>
look_at<0,0,0>
}                 
             
light_source{
<0,3,-8>
color Red
}


light_source{
<10,3,-8>
color Blue
}
     

box{
<-1,-1,-1>,<2,2,2>
pigment{color<0.5,0.5,0.5>}
}   

sphere{
<-1,-1,-1>,0.5
pigment{color Red}
}

sphere{
<2,2,2>,0.5
pigment{color Red}
}

sphere{
<-1,2,2>,0.5
pigment{color Red}
}

sphere{
<2,-1,-1>,0.5
pigment{color Red}
}

sphere{
<2,2,-1>,0.5
pigment{color Red}
}

sphere{
<-1,2,-1>,0.5
pigment{color Red}
}

sphere{
<2,-1,2>,0.5
pigment{color Red}
}


box{
<2,2,2>,<5,5,5>
pigment{color<0.5,0.5,0.5>}
}


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


box{
<-1,-1,-1>,<-4,-4,-4>
pigment{color<0.5,0.5,0.5>}
}


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



#include "colors.inc"

camera{
location<-5,1,-10>
look_at<0,0,0>
}                 
             
light_source{
<0,3,-8>
color White
}
     

//cialo balwana
sphere{
<0,-2,0>,2
pigment{color White}
}

sphere{
<0,0.5,0>,1.5
pigment{color White}
}

sphere{
<0,2.6,0>,1
pigment{color White}
}


//wegle jako guziki
sphere{
<0,-0.9,-1.7>,0.15
pigment{color Black}
}

sphere{
<0,-0.2,-1.4>,0.15
pigment{color Black}
}


sphere{
<0,0.5,-1.6>,0.15
pigment{color Black}
}

sphere{
<0,1.2,-1.4>,0.15
pigment{color Black}
}


//wegle na oczy i usta
sphere{
<-0.4,2.4,-1>,0.1
pigment{color Black}
}

sphere{
<-0.2,2.3,-1>,0.1
pigment{color Black}
}

sphere{
<0.1,2.3,-1>,0.1
pigment{color Black}
}

sphere{
<0.3,2.4,-1>,0.1
pigment{color Black}
}

sphere{
<0.2,2.9,-1>,0.1
pigment{color Black}
}

sphere{
<-0.2,2.9,-1>,0.1
pigment{color Black}
}

//kapelusz
cylinder{
<0,3.3,0>,<0,3.45,0>,1.2
pigment{color Red}
}

cylinder{
<0,3.45,0>,<0,4,0>,0.6
pigment{color Red}
}

//miotla
cylinder{
<1,1,0>,<3,4,0>,0.1
pigment{color Brown}
}

sphere{
<3,4,0>,0.16
pigment{color Brown}
}

cylinder{
<3,4,0>,<3,5,0>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<4,5,-0.1>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<3.5,5,0.1>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<3.6,5,-0.2>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<3.9,5,0.2>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<4.2,5,0>,0.01
pigment{color Brown}
}

cylinder{
<3,4,0>,<3.5,5,-1>,0.01
pigment{color Brown}
}


Istnieje możliwość, że dodam tu w przyszłości jakieś przykłady, ale raczej bym na to nie liczył ;D


Nie to abym coś mówił czy pisał ale prawie po 10 miesiącach wywiązałeś się z umowy :)

ja jestem cierpliwy i zawsze słowa dotrzymuję, wystarczy też być cierpliwym ;D
mam tylko nadzieję, że komuś się to przyda ;p

Cóż, mi się nie przyda, bo povray jakoś mnie nie przekonuje, co nie oznacza, że nie odwaliłeś dobrej roboty ; )
Cinis et manes et fabula fies.