Cześć Pierwsza
Transkrypt
Cześć Pierwsza
(tekst jest kompilacją tekstów pochodzących z http://www.povray.pl
oraz http://jacenty.kis.p.lodz.pl/pov-ray/povkurs/index.htm)
Cześć Pierwsza
Do czego służy Povray
Na powyższe pytanie można odpowiedzieć jednym zdaniem - do tworzenia grafiki 3D
- zarówno obrazów statycznych jak i animacji. Być może nie wszyscy jednak wiedzą na czym
polega ten szczególny rodzaj grafiki. W skrócie można to przedstawić tak: tworzymy scenę
zawierającą obiekty przestrzenne, pokryte różnorodnymi materiałami, światła i kamerę, w
której powstanie obraz. Tak przygotowaną scenę poddaje się procesowi zwanemu
renderingiem. W jego trakcie komputer oblicza jak biegną promienie od źródeł, co się dzieje,
gdy światło pada na powierzchnie obiektów i co widzi kamera. W wyniku powstaje płaski
obraz trójwymiarowego świata. Raz przygotowaną scenę możemy oglądać z różnych miejsc,
przy pomocy kamer o różnych parametrach. Możliwe jest także utworzenie animacji zamiast
obrazów statycznych. Efekty pracy artystów zajmujących się grafiką 3D obserwować możecie
w postaci efektów specjalnych w wielu filmach.
Program Povray jest jednym z wielu programów do tworzenia fotorealistycznych
obrazów symulujących trójwymiarowe sceny i animacje. Można powiedzieć, że Povray pod
tym względem należy do licznej rodziny programów wśród których można wymienić choćby
3DStudio Max, Maya, Lightwave, Realsoft3D, Cinema4D i wiele, wiele innych programów.
Od wymienionych powyżej różni się jednak zasadniczo: sceny tworzymy opisując
występujące w nich obiekty przy użyciu języka programowania. Poniższy rysunek
przedstawia fragment kodu sceny napisanej w programie Povray.
Rys.1 Okno programu POvray w przykładową sceną
Strona 1 z 30
Inną cechą odróżniającą Povray od wymienionych wyżej programów jest to, iż jest on
całkowicie darmowy. Znaleźć go można w wielu miejscach w sieci a jego stroną domową jest
www.povray.org. Najnowsza wersja ma numer 3.50. Jest dostępna na wszystkie znane mi
platformy sprzętowe i systemowe - dla Windows, Linux-a, Max OS, Mac OS X. Ja pisząc te
materiały używam wersji dla Windows i wszystkie rysunki i opisy pochodzą z tej wersji.
Ze względu na sposób tworzenia sceny nie jest to program najłatwiejszy, ma jednak wiele
cech, które powodują, że posiada zwolenników na całym świecie. Autorzy podają, że w ciągu
roku pobierany jest 100 000 razy. Niewątpliwie jest świetnym narzędziem do ćwiczenia
wyobraźni przestrzennej. Napisano wiele dodatkowych programów współpracujących z
Povray-em. Są to edytory scen i tekstur, programy ułatwiające deformację obiektów,
konwertujące zbiory klatek do plików filmowych.
Zaczynamy pracę z programem
Zanim utworzymy jakąkolwiek scenę spróbujmy najpierw wykorzystać jedną z
gotowych scen przykładowych dołączonych do programu. Najpierw jednak rzućmy okiem na
interfejs programu
Rys. 2 Okno programu Povray dla Windows z opisanymi podstawowymi elementami
interfejsu
Aby rozpocząć pracę z nowym plikiem wybieramy z menu File/Open File. W otwartym
standardowym oknie dialogowym odszukajmy katalog scenes\advanced\fish13 a w nm plik
fish13.pov i otwórzmy go. W oknie roboczym pojawi się tekst sceny. Proponuję niczego w
Strona 2 z 30
nim nie zmieniać. Uruchamiamy rendering wciskając przycisk Run na pasku narzędziowym i
obserwujemy efekt. Musimy trochę poczekać bo celowo wybrałem dosyć skomplikowaną
scenę. Jeśli obrazek jest za mały wybieramy inny rozmiar w odpowiednim miejscu interfejsu patrz rysunek 2.
Ćwiczenie
Możesz otworzyć inne sceny i zobaczyć jakie obrazy otrzymasz po renderingu.
Jak Povray widzi świat
Musimy zacząć od przypomnienia pewnych niezbędnych wiadomości z matematyki.
Narysuj na kartce papieru prostokąt. Wyznaczają go cztery punkty stanowiące jego
wierzchołki. Aby precyzyjnie opisać położenie naszego prostokąta musimy użyć układu
współrzędnych. Jeśli podamy współrzędne każdego wierzchołka jednoznacznie określimy nie
tylko położenie prostokąta ale także jego wielkość. Gdybyśmy podali te współrzędne innej
osobie może ona dokładnie odtworzyć cały nasz prostokąt. Rysunek poniżej przypomina jak
definiujemy współrzędne punktu na płaszczyźnie posługując się płaskim układem
współrzędnych.
Rys. 3 Współrzędne płaskie
Budując sceny w Povray-u tworzymy bryły, które mają, podobnie do rzeczywistych
obiektów, trzy wymiary. Dwie osie płaskiego układu współrzędnych nie wystarczą do
określenia położenia punktów składających się na te obiekty. Musimy użyć układu
trójwymiarowego. Taki układ składa się z trzech wzajemnie prostopadłych osi : X, Y i Z. Na
rysunku poniżej pokazano jak określa się współrzędne punktów w przestrzeni.
Strona 3 z 30
Rys. 4 Określanie współrzędnych punktu w przestrzeni przy użyciu trójwymiarowego układu
Narysowana w rzucie oś X w rzeczywistości powinna wchodzić w kartkę ( lub ekran
monitora) prostopadle. W programie Povray używamy inaczej ustawionych osi. Jeśli patrzysz
na ekran oś X skierowana jest w prawo, oś Y do góry a oś Z wchodzi w ekran - punkty o
dodatnich współrzędnych są "wewnątrz" monitora a punkty położone pomiędzy tobą a
monitorem mają współrzędne z ujemne. Na rysunku wygląda to tak:
Rys. 5 Układ osi używany przez program Povray
Strona 4 z 30
Pierwsza scena
Komentarze
Przy pisaniu jakichkolwiek programów dobrym zwyczajem jest opisywanie poszczególnych
fragmentów tak, aby wiadomo było do czego służą. Znaczenie komentarzy docenią ci, którzy
powracają do programu po jakimś czasie od jego napisania lub szukają w programie błędów.
Tekst komentarza jest ignorowany przy tworzeniu sceny przez Povray. Komentarze
umieszczamy w następujący sposób:
//to jest tekst komentarza
lub
/* tu zaczyna się komentarz
tu ciągnie się dalej
a tu się kończy*/
Zaczynamy pisać pierwszą scenę od opisu. Z menu File wybieramy polecenie New i
wpisujemy:
//Wojciech Mickiewicz
//2002-04-03
//moja pierwsza scena w Povray-u
Oczywiście możesz wpisać inne informacje, zadbaj jednak o to aby coś mówiły o tworzonym
pliku.
Zaczynamy tworzyć scenę
Teraz wpiszemy trzy linijki, których znaczenie omówię za chwilę.
#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
Polecenia zapisane powyżej powodują, że do naszej sceny dołączamy pliki o nazwach
podanych w cudzysłowie. Oczywiście równie dobrze można byłoby te pliki po prostu
przepisać, lub nawet korzystając z funkcji kopiuj i wklej wstawić bezpośrednio do naszej
sceny. Podany tu sposób jest jednak znacznie wygodniejszy a długość naszego pliku znacznie
krótsza - co ułatwi jego przeglądanie i analizę. Zawartość dołączanych plików bardzo nam się
niebawem przyda. Pierwszy z nich - colors.inc -zawiera zdefiniowane kolory, dzięki niemu
jeśli coś ma być niebieskie to wpiszemy po prostu Blue a jeśli czerwone to Red. Drugi plik shapes.inc zawiera podstawowe bryły, nie będziemy musieli definiować kuli czy walca - już
są zdefiniowane. Trzeci plik textures.inc zawiera tekstury a co to jest - opowiemy dalej.
Do utworzenia sceny potrzebne są:
1. Obiekty tworzące elementy widzialne sceny - modele
2. Źródła światła, które oświetlą scenę
3. Kamerę, która pozwoli cokolwiek zobaczyć.
Dodajemy kamerę
Zaczniemy od kamery. Ustawmy w punkcie o współrzędnych (0,10,-15) i niech będzie
skierowana na punkt (0,0,0). Przypomnij sobie jak ustawione są osie układu współrzędnych
Strona 5 z 30
wykorzystywanego przez Povray-a i zastanów się, gdzie znajdują się wymienione punkty.
Kamerę wpisujemy tak:
camera {
location <0,10,-15>
look_at <0,0,0>
angle 35
}
// miejsce umieszczenia kamery
// punkt na który kamera jest skierowana
// kąt „widzenia” kamery – w stopniach
Oświetlenie sceny
Teraz czas na źródła światła. Umieścimy dwa punktowe źródła emitujące światło białe.
light_source
{
<-10,10,-10> White
}
light_source
{
<3,20,5> color RGB <1, 1, 1>
}
//kolor określony słownie
//kolor określony liczbowo
poćwicz trochę wyobraźnie i postaraj się odpowiedzieć na pytanie: jak względem kamery
położone są światła?
Właśnie utworzyliśmy coś co może stanowić szablon sceny do dalszych ćwiczeń. Zapiszmy
go więc pod nazwą szablon.pov. Nie będziemy musieli za każdym razem pisać wszystkiego
od początku.
Pierwsza bryła
Teraz kolej na bryły tworzące obiekty widzialne sceny. Na początek umieścimy w punkcie
(0,0,0) kulę o promieniu 2. Pomalujmy ją na czerwono.
sphere
{
<0,0,0>,
//położenie środka kuli
2
// promień kuli
texture {pigment {color red 1 green 0 blue 0}}
}
Jak zauważyłeś kolor możemy podać określając jego składowe w podstawowych barwach
modelu RGB. Ten sam efekt otrzymamy pisząc:
texture {pigment {color rgb <1,0,0>}}
udział każdego z kolorów bazowych określamy liczbą z zakresu od 0 do 1.
Rendering
Jeśli już wszystko wpisałeś do pliku zapisz go pod nazwa scena1.pov i uruchom rendering
wciskając na pasku narzędziowym przycisk Run. Teraz poczekaj chwilę na efekt. A oto on:
Strona 6 z 30
Rys.5 Pierwsza scena
Pierwsza scena za za nami. Zanim przejdziemy dalej warto zwrócić uwagę na to jak
opisaliśmy kolor naszej kuli.
texture {pigment {color rgb <1,0,0>}}
Linijka ta zaczyna się od słowa kluczowego texture Wszystko to co jest zawarte pomiędzy
klamrowymi nawiasami za tym słowem opisuje teksturę czyli najprościej mówiąc materiał,
którym pokryty jest obiekt. Będzie o tym mowa w dalszej części. Część opisu tekstury
decyduje o tym jakim kolorem (kolorami) będzie pokryty obiekt. Decyduje o tym zawarta w
klamrowych nawiasach po słowie kluczowym pigment. W naszym przykładzie określiliśmy
kolor określając jego składowe w modelu RGB. Poćwicz stosowanie różnych parametrów.
Można też zrobić inaczej. Wiele kolorów zostało utworzonych już wcześniej i zapisanych w
pliku Colors.inc, który, jak pamiętasz, dołączyliśmy do naszej sceny. Zajrzymy do tego pliku
ale nie bezpośrednio:
pracując w programie otwórz plik scena1.pov, następnie przejdź do pomocy.
w prawej ramce masz spis treści, odszukaj Standard Include Files kliknij na nim
z rozwiniętej listy wybierz colors.inc, następnie wskaż Predefined Colors
w prawej ramce masz pokazaną w wygodny sposób zawartość tego pliku. Wybierz
odpowiadający ci kolor i zapisz dokładnie jego nazwę.
5. wpisz tę nazwę do pliku opisu sceny po słowie color
6. uruchom rendering i podziwiaj efekt.
1.
2.
3.
4.
Możesz poćwiczyć stosowanie różnych kolorów w twojej pierwszej scenie. Na zakończenie
pierwszego spotkania z programem kilka ćwiczeń:
Ćwiczenie 2
Jaki obiekt można zbudować z samych kul? Zima wprawdzie skończyła się ale każdy
chyba pamięta jak wygląda bałwan śniegowy?. Zbuduj więc model bałwana,
Strona 7 z 30
dobierając odpowiedniej wielkości i odpowiednio rozmieszczone kule. Postaraj się
znaleźć odpowiedni kolor.
Ćwiczenie 3
Po utworzeniu sceny z ćwiczenia pierwszego zmieniaj ustawienie kamery aby oglądać
scenę z różnych miejsc. Jeśli efekt zawsze zgadza się z oczekiwaniami możesz
uważać, ze rozumiesz układ współrzędnych.
Ćwiczenie 4
Utwórz scenę jak na ilustracji poniżej. Osie i płaszczyznę poziomą dodano dla
orientacji. W tym przykładzie przyda się trochę matematyki. proponuję najpierw
narysować sobie rzut prostokątny układu kul i obliczyć jakie powinny być
współrzędne kul. Promień kuli jest równy 2
Rys.6 Układ kul do ćwiczenia 4
Część Druga
Trochę szerzej o obiektach
Inne bryły
Niestety kula nie wystarczy do zbudowania zbyt wielu ciekawych scen. W tej części
pokażemy jak wprowadzić do naszej sceny inne bryły.
Prostopadłościan
Dla zdefiniowania prostopadłościanu potrzebujemy współrzędne dwóch wierzchołków A i B
tak jak to pokazano na rysunku:
Strona 8 z 30
Rys.7 Współrzędne punktów A i B definiują prostopadłościan
Kiedy już ustalimy współrzędne wymaganych punktów wpisujemy do pliku sceny:
box
{
<x1,y1,z1>,
<x2,y2,z2>,
texture {pigment {color Blue}}
}
i już mamy w naszej scenie prostopadłościan, który tym razem pomalowałem na niebiesko ale
ty możesz wybrać inny kolor. Następne bryły podam już bez zbędnych opisów. Oczywiście
kolory mogą być wybrane dowolnie.
Strona 9 z 30
Walec, stożek, torus
Opis oznaczeń:
A i B - środki podstaw - górnej i dolnej
r - promień walca
cylinder
{
<x1,y1,z1>,<x2,y2,z2>, r
texture {pigment {color Green}}
}
Oznaczenia:
A - środek dolnej podstawy
r1 - promień dolnej podstawy
B - środek górnej podstawy
r2 - środek górnej podstawy
cone
{
<x1,y1,z1>,r1,<x2,y2,z2>,r2,
texture {pigment {color DustyRose}}
}
cone {<0,0,0>,3,<0,8,0>,0.5 texture
{pigment {color red 0 green 1 blue 0}}}
Jeśli nie chcesz stożka ściętego podaj promień
górnej podstawy równy 0
Strona 10 z 30
Torus wygląda dokładnie tak jak napompowana
dętka wyjęta z koła rowerowego. Określają go dwa
parametry: r1 - odpowiednik promienia koła roweru
i r2 - określający promień przekroju dętki. Aby
dodać torus do swojej sceny wpisz:
torus
{
r1,r2
pigment {color Red}
}
Zwróć uwagę na to, że nie podajemy położenia tej
bryły względem układu współrzędnych tylko jej
rozmiary. Zbuduj scenę zawierającą tylko torus i
osie współrzędnych aby zobaczyć jak program
umieścił tę bryłę w przestrzeni.
Pokazane wyżej obiekty nie wyczerpują wszystkich możliwości programu ale wystarczą do
zbudowania dosyć skomplikowanych scen dlatego na nich poprzestanę. O innych możesz
poczytać w dokumentacji programu.
Warto w tym miejscu zwrócić uwagę na wymiary obiektów. Do tej pory posługiwaliśmy się
jedynie współrzędnymi punktów. Nic jednak nie stoi na przeszkodzie aby przyjąć, że osie
naszego układu współrzędnych są wyskalowane w centymetrach i punkt o współrzędnych
(100,0,0) znajduje się na osi X w odległości 100 cm od początku układu. Mówiąc zupełnie
niefachowo możemy stwierdzić, że współrzędne wyrażone są w centymetrach.
Przy okazji jeszcze jedna uwaga - sceny tworzymy w edytorze tekstów, należy więc jak
najszerzej korzystać z tego faktu. Jeśli mamy na przykład umieścić w scenie dwa
prostopadłościany to wpisujemy jeden a potem kopiujemy i wklejamy odpowiedni fragment
tekstu i odpowiednio zmieniamy współrzędne. Na koniec tego rozdziału proponuję
wykonanie przedstawionych na ilustracjach prostych modeli.
Pudełko z trzech walców, nie
da się wprawdzie otworzyć ale
można wyobrazić sobie, że w
środku jest kapelusz
Strona 11 z 30
Model lampki nocnej
wykonany w walca i dwóch
stożków
Wykonany z
prostopadłościanów regał.
Zauważ, że zawiera on kilka
jednakowych brył. Wystarczy
napisać jedną i skopiować ją
kilka razy przez proste
powielanie tekstu a następnie
odpowiednio zmienić
współrzędne
Do wykonania tej półki
potrzebne są prostopadłościany
i walce
Prostym złożony z czterech
prostopadłościanów stoli.
Zakładamy, że stolik został
wykonany z płyty o grubości 2
cm a poszczególne elementy
mają następujące wymiary:
blat 60 x 100 cm
nogi 50 x 60 cm
poprzeczka 40 x 71 cm
Strona 12 z 30
Część Trzecia
Operacje boolowskie
Operacje, które chcę teraz przedstawić znacznie powiększają możliwości tworzenia bardziej
skomplikowanych brył. Zamiast opowiadać o tym na czym polegają operację boolowskie
pokażę to na przykładach figur płaskich:
Mamy dwa
obiekty: A i B.
Obiekty te
częściowo się
pokrywają
Operacja Union
Nowy obiekt
powstaje przez
połączenie
obiektów A i B.
union {
obiekt_A
obiekt_B
{
Operacja
Intersection
Nowy obiekt jest
częścią wspólną
obiektów A i B
Intersection
{
obiekt_A
obiekt_B
}
Strona 13 z 30
Operacja
difference A-B
W tej operacji od
obiektu A
odejmujemy
obiekt B
difference
{
obiekt_A
obiekt_B
}
Operacja
difference B-A
Tu natomiast od
obiektu B
odejmujemy
obiekt A
difference
{
obiekt_B
obiekt_A
}
Tak samo można zastosować operacje boolowskie do brył. Poniżej podaję trzy przykłady.
Operacja union
Połączymy trzy kule tak aby utworzyły bałwana
union // zapis operacji łączenia brył
//pierwsza kula
{
sphere {<0,-1,0>,1.5 pigment {color LightGray}}
//druga kula
sphere {<0,1,0>,1 pigment {color LightGray }}
//trzecia kula
sphere {<0,2.3,0>,0.6 pigment {color LightGray}}
}
Strona 14 z 30
A oto efekt:
Efektu operacji union nie widać bezpośrednio w modelu. Efekt jest taki sam jaki
uzyskalibyśmy umieszczając te same obiekty osobno. Są jednak sytuacje, w których jest ona
potrzebna - na przykład przemieszczanie obiektów.
Operacja difference
Zbudujmy prostą szklankę. Można ją utworzyć przez wycięcie jednego ściętego stożka z
drugiego. Na rysunku niżej po lewej widać jak powstanie nasza szklanka a po prawej gotowy
efekt:
A oto kod, który zdefiniował ten obiekt:
difference
//operacja boolowska
{
cone {<0,0,0>,2,<0,8,0>,2.5} //pierwszy stożek
cone {<0,0.5,0>,1.9,<0,9,0>,2.45} //drugi stożek, trochę wyżej i wyższy
pigment {color Blue}
}
Strona 15 z 30
Operacja intersection
Zastosuję tę operację aby uzyskać ćwiartkę kuli. Umieszczę kulę o promieniu 2 w środku
układu współrzędnych, Drugą bryłą będzie sześcian o boku 2 umieszczony tak, aby jeden z
jego wierzchołków znajdował się w środku kuli.
intersection
{
sphere {<0,0,0>,2}
box {<:0,0,0>,<2,2,2>}
pigment {color Scarlet}}
Tak wygląda utworzona bryła:
Zwróć uwagę na to, że wewnętrzny stożek musi być trochę wyższy od zewnętrznego. Teraz
już możesz wycinać w swoich obiektach otwory i tworzyć najprzeróżniejsze obiekty. Oto
kilka przykładów do ćwiczeń:
Klocek Lego powstał przez
połączenie prostopadłościanu z
walcami za pomocą operacji
union
Pudełeczko powstanie jeśli w
jednego prostopadłościanu
wytniemy drugi. Oczywiście
potrzebna jest tu operacja
difference
Strona 16 z 30
Inny przykład operacji
difference - ściana narożnik
pokoju z trzema oknami. Trzeba
tylko dostawić meble. Sam
narożnik pokoju powstał za
pomocą operacji union dla
dwóch prostopadłościanów.
Okna wycięto stosując jeszcze
raz tę samą operację, jako bryły
do wycięcia posłużyły trzy
odpowiednio ustawione
prostopadłościany
Bryła przypominająca kształtem
kostkę do gry utworzona jako
część wspólna sześcianu o boku
4 cm i kuli o promieniu 3.6
umieszczonych w środku
układu współrzędnych.
Zastosowano oczywiście
operację intersection
Część Czwarta
Podstawowe transformacje obiektów
Przesunięcie - translacja - obiektów
Każdą bryłę utworzoną gdziekolwiek w przestrzeni można przesunąć w dowolnym kierunku.
Dokładniej mówiąc można ją przesunąć o dowolną ilość jednostek w kierunku każdej z osi:
X, Y i Z. Robimy to przy pomocy modyfikatora translate według wzoru:
translate <x,y,z>
gdzie x, y i z określają o ile jednostek przesuwamy obiekt w kierunku osi X, Y i Z. Oto
przykład: Sześcian o boku a=4 umieszczony w początku układu współrzędnych przesuniemy
o dwie jednostki w prawo, wzdłuż osi X.
box
{
<-2,-2,-2>,<2,2,2>
texture {pigment{color Scarlet}}
translate <2,0,0>
//w tym właśnie miejscu wpisane jest przesunięcie
}
poniżej na rysunku po lewej stronie sześcian jest jeszcze w początku układu współrzędnych.
po prawej stronie jest już przesunięty. Osie umieszczono dla orientacji.
Strona 17 z 30
Obrót obiektów
Każdy obiekt możemy obrócić o wybrany kąt względem każdej z osi. Zapis obrotu wygląda
tak:
rotate <a,b,c>
gdzie:
a - kąt o jaki obracamy względem osi X,
b - kąt o jaki obracamy względem osi Y,
c - kąt o jaki obracamy względem osi Z.
Oczywiście możemy obrócić tylko względem jednej lub dwóch osi, wówczas pozostałe kąty
są równe 0. Obrócimy teraz nasz wyjściowy sześcian względem osi Y o 45 stopni. Definicja
obiektu wyglądać będzie tak:
box
{
<-2,-2,-2>,<2,2,2>
rotate <0,0,45>
pigment {color Scarlet}
}
a końcowy efekt jest następujący:
Obrót odbywa się względem osi układu współrzędnych sceny i dlatego może ci czasem
sprawić niespodziankę. Aby to lepiej rozumieć przyjrzyj się dwóm pokazanym niżej scenom.
W pierwszej z nich sześcian obrócono o kąt 45 stopni względem osi Z a następnie przesunięto
o wektor <-3,0,0>. W drugiej obie te transformacje wykonano w odwrotnej kolejności.
Zastanów się czy rozumiesz skąd wzięła się różnica efektów końcowych?
Strona 18 z 30
takich niespodzianek może być więcej, radzę uważać a w przypadku problemów najlepiej
poćwiczyć w rzeczywistymi przedmiotami.
Powiększanie lub pomniejszanie czyli skalowanie bryły
Ostatnią w transformacji jest skalowanie. Każdą bryłę możemy powiększyć lub pomniejszyć
wybrana ilość razy, względem dowolnej z osi. Wykonujemy to wpisując do definicji obiektu
następujący kod:
scale <a,b,c>
gdzie:
a - określa ile razy powiększyliśmy lub pomniejszyliśmy względem osi X
b - określa ile razy powiększyliśmy lub pomniejszyliśmy względem osi Y
c - określa ile razy powiększyliśmy lub pomniejszyliśmy względem osi Z
Dla przykładu powiększmy nasz sześcian dwukrotnie względem osi x. Definicja naszej bryły
wygląda tak:
box
{
<-2,-2,-2>,<2,2,2>
scale <2,1,1> //2 razy zwiększamy wzdłuż osi X, w pozostałych kierunkach
bez zmian
pigment {color Scarlet}
}
A tak to wygląda po zrenderowaniu:
Strona 19 z 30
Przez wykorzystanie operacji boolowskich i transformacji do omówionych do tej pory brył
możemy już uzyskać całkiem skomplikowane obiekty. Trzeba będzie jednak sporo pisać i
często powtarzać te same fragmenty kodu. Niebawem pokażę jak tego uniknąć, ale
tymczasem proponuję wykonanie kilku obiektów w ramach ćwiczeń.
Palisada
Pojedynczy pal powstał przez
połączenie walca i stożka przez
operację union. Aby utworzyć
palisadę skopiowałem
kilkakrotnie kod definiujący pal
i każdy z nich przesunąłem na
odpowiednią odległość w
kierunku osi X za pomocą
translate
Kwiatek
Płatki powstały z 6 walców,
każdy kolejny jest obrócony w
stosunku do poprzedniego o 30o
za pomocą rotate. Środek jest
kulą umieszczoną w środku
układu współrzędnych
Koło
Koło powstało podobnie jak
kwiat, tylko walce zostały tu
zastąpione przez
prostopadłościany a obręcz jest
wykonana za pomocą operacji
difference z dwóch walców
Strona 20 z 30
TEXT - Tekst
Pisać w POV-Ray'u też można. Aplikacja potrafi załadować dowolny plik czcionki TrueType
i przekształcić żądany tekst w obiekt trójwymiarowy. Obiekt tekstu ma następującą postać:
text {
ttf
"plik.ttf", "Tekst", głębokość, offset
transformacje // opcjonalnie
pigment {definicja koloru}
}
Nazwę pliku czcionki i tworzony tekst zapisujemy w
znakach cudzysłowu. Parametr głębokości liter może być
dowolną liczbą dodatnią, a offset wymaga krótkiego
wyjaśnienia. Najczęściej używa się tu wartości 0. Jest 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. Bardzo łatwo wykonać więc np. napis, którego
kolejne litery "wchodzą" lub "schodzą" po schodach. Najlepiej będzie, jeżeli sprawdzisz ten
efekt samodzielnie, ponieważ powyższy tekst może być nieco mylący. Przykład:
text {ttf "Arial.ttf" "INFORMATYKA" 1,0 texture {Aluminum} scale 0.9 rotate
<0,0,0> translate <-2,0.1,-2>}
texture – wypełnienie wybraną teksturą, scale – przeskalowanie wielkości, rotate – obrót
wokół wybranych osi, translate – przesunięcie wzdłuż odpowiednich osi
POLYGON - Wielokąt
Kod przykładowego wielokąta:
polygon {
ilość następujących wyrażeń,
<wierzchołek pierwszy>,
<wierzchołek drugi>,
... // i tak dalej
<wierzchołek ostatni>,
<ponownie wierzchołek pierwszy>
transformacje // opcjonalnie
pigment {definicja koloru}
}
Wielokąt ma bardzo wiele wspólnego ze swoim geometrycznym odpowiednikiem. Wszystkie
jego punkty leżą na jednej płaszczyźnie. POV-Ray ułatwia nieco sprawę i wszystkie
domyślnie umieszcza względem płaszczyzny wyznaczonej przez osie X i Y. W każdym więc
punkcie współrzędna Z wynosi 0. Aby oszczędzić wklepywania tego jednego zera, twórcy
POV-Ray'a zadecydowali, że w przypadku wielokąta wszystkie punkty będą miały w
wyrażeniach wektorowych tylko współrzędne X i Y. Należy jeszcze zwrócić uwagę na
konieczność powtórzenia współrzędnych pierwszego wierzchołka przy tworzeniu
wielokątów.
Strona 21 z 30
Tekstury - nowe szaty brył
Znamy już całkiem sporo figur i brył, ale czegoś im chyba do szczęścia jeszcze potrzeba.
Chciałoby się, żeby choć trochę uprzyjemnić ich wygląd zewnętrzny. Dlatego na chwilę
zajmiemy się teksturami.
Spójrzmy jeszcze raz na definicję standardowej bryły:
bryła { // ewentualnie figura
parametry
pigment {color rgb <definicja koloru>}
}
Znudzony schemat, nieprawdaż? A teraz porównajmy to z poniższą definicją
bryła { // ewentualnie figura
parametry
texture {
pigment {color rgb <definicja koloru>}
finish {parametry}
}
}
Widzimy różnicę? (Spokojnie, to tylko pytanie retoryczne) Doszło nam trochę do tej definicji.
Mowa oczywiście o tkwiącym w niej nawiasie texture, a także o partnerze pigmentu o
dziwnie brzmiącej nazwie finish. Po co to właściwie jest? Mówimy przez to POV-Ray'owi,
że nasza tekstura oprócz pokrycia litym kolorem będzie nieco bardziej skomplikowana. W
nawiasie z teksturą umieszczamy zatem najpierw określenie jej pigmentu, a następnie...
Finish - Gładka, jak pupa niemowlaka
Ogólnie rzecz biorąc, w nawiasie finish przechowywana jest seria parametrów określająca
zachowanie się tekstury pod wpływem padającego na nią światła. Ponieważ można te
parametry podawać wybiórczo i w dowolnej kolejności i nie oddzielamy ich także od siebie
przecinkami, stosowanie ich nie powinno nikomu nastręczyć żadnych kłopotów. Oto pełna
lista owych parametrów, a poniżej, szczegółowy opis:
finish {
ambient wartość
diffuse wartość
brilliance wartość
specular wartość
roughness wartość
phong wartość // alternatywa dla specular
phong_size wartość // alternatywa dla roughness
reflection wartość
reflection_exponent wartość
metallic opcjonalna wartość
irid {
wartość
thickness wartość
turbulence wartość
}
}
Strona 22 z 30
AMBIENT - jasność w cieniu
Dokładnie tak, jak napisane, parametr ambient określa względną jasność danej tekstury w
miejscach, w których nie jest ona zupełnie oświetlona. Domyślnie wynosi on 0.1, czyli 10%
jasności. Wartość ta może oscylować między 0, a 1, dając odpowiednio obiekt kompletnie
czarny w cieniu, lub jednakowo jasny na całej powierzchni. Właściwie wartość po parametrze
jest wyrażeniem wektorowym koloru, ale pełny zapis ambient <r, g, b> jest używany
bardzo rzadko. Chociaż usyskuje się przez to ciekawe efekty. Nie bronię nikomu się pobawić.
DIFFUSE - tolerancja na kąt padania światła
Ten parametr również przyjmuje wartości od 0 do 1, które również są wektorami koloru.
Domyślnie wynosi od 0.6 i określa jasność tekstury w zależności od kąta, pod którym pada na
nią światło. Im większy jest ów kąt, tym jaśniejsza powierzchnia bryły. Diffuse ustala, jak
małe kąty padania wywołują widoczne rozświetlenie tekstury w stosunku do jej jasności
określonej parametrem ambient.
BRILLIANCE - wariacja tolerancji
Spadek jasności obiektu w zależności od kąta padania światła można nieco modyfikować przy
pomocy parametru brilliance. Parametr ten domyślnie przyjmuje wartość 1 i jest
wykładnikiem potęgi funkcji, która odpowiada za sposób, w jakim tekstura traci jasność. W
przypadku wartości 1 jest to spadek liniowy. Podanie wartości 2 lub 0.5 spowoduje powstanie
opadu opartego odpowiednio na funkcji kwadratowej lub pierwiastkowej. Dozwolone są
oczywiście dowolne wykładniki. Brilliance używany jest głównie w teksturach
wypolerowanych metali.
SPECULAR vs. PHONG – Odblask
Na obiektach często można zaobserwować jasną plamkę w miejscach, gdzie są one
oświetlone pod kątem prostym. POV-Ray symuluje siłę takich odblasków używając niemal
identycznych parametrów specular oraz phong. Efekt ich działania jest prawie identyczny
(phong tworzy minimalnie bardziej matowe rozbłyski). Oba przyjmują wartości od 0 do 1
wyrażone ponownie wektorami, a ich wartość domyślna wynosi 0 (brak odblasku).
ROUGHNESS vs. PHONG_SIZE – gładkość
Bardziej wypolerowane, gładsze powierzchnie charakteryzują się mniejszymi plamkami
odblasków, bardziej matowe - większymi. Wielkość odblasku kontrolują w programie
parametry roughness (wykorzystywane tylko w parze ze specular) oraz phong_size (w
parze z phong). Jeśli nie określono żadnego odblasku, stosowanie roughness i phong_size
nie da żadnego efektu. Jeszcze tylko sprawa wartości, które w obu przypadkach niezwykle się
różnią:
PARAMETR WARTOŚĆ DOMYŚLNA TYPOWE WARTOŚCI
roughness
0.05
od 0.0005 do 1
phong_size 40
od 1 do 400
REFLECTION
Strona 23 z 30
odbicie
Ten parametr mówi praktycznie sam za siebie. Domyślnie przyjmujący wartość 0 i ponownie
określony wyrażeniem wektorowym koloru, opisuje siłę, z jaką dana tekstura odbija
otoczenie. Przypisanie mu wartości 1 stworzy idealne lustro. Pod uwagę należy jednak wziąć
fakt, że im wyższy współczynnik odbicia, tym więcej ze swojego naturalnego koloru bryła
traci. Kolor obiektu kontrolujemy w tym wypadku dodatkowo parametrem diffuse.
REFLECTION_EXPONENT - wykładnik odbicia
Parametr ten ma nieco niefortunną nazwę, gdyż nie oznacza ona dosłownie tego, co nazywa.
Ogólnie rzecz biorąc, wykładnik odbicia kontroluje siłę, z jaką odbite zostają od obiektu
obiekty jasne lub ciemne. Domyślnie wykładnik ten jest równy 1, ale można
eksperymentować z innymi wartościami dodatnimi. Opcja ta nie ma odzwierciedlenia w
rzeczywistości, jednakże może posłużyć za całkiem artystyczny przykład.
METALLIC - zabarwienie odblasku
Odbicie w wielu metalach (np. w złocie) barwi odbity obraz na kolor danego metalu. To samo
dzieje się z plamką odblasku. Dodając do tekstury parametr metallic zabarwiamy odbicie i
odblask. Opcjonalnie dodana do parametru wartość z przedziału od 0 do 1 kontroluje siłę tego
zabarwienia.
IRIDESCENCE – opalizacja
Parametr ten tworzy na powierzchni obiektu delikatne tęczowe plamki podobne do tych, jakie
powstają w kałużach benzyny bądź na powierzchni mydlanych baniek. Efekt ten powoduje
istniejąca na tych powierzchniach mikroskopijnie cienka warstewka opalizująca. Opcja
iridescence opiera się na trzech własnych parametrach, które stosujemy następująco:
irid {
wartość
thickness wartość
turbulence wartość
}
Pierwszy z nich określa nasilenie efektu. Dobrze stosować tu wartości od 0 do 1 choć inne nie
są niedozwolone. Kolejne: thickness oraz turbulence odpowiadają już tylko za wygląd
ogólny efektu, odpowiednio gęstość i turbulencję warstwy opalizującej. zakres stosowanych
wartości również oscyluje między 0 a 1.
Przykład - Dwie kulki. Która ładniejsza?
Strona 24 z 30
Dołączenie grafiki do planu
Rysunek na powierzchni kuli (z wcześniej przygotowanego obrazka drzewo.gif). Kod
zawiera wywołanie gifa.
sphere {<4,3,0> 2
pigment {image_map {gif "drzewo.gif" map_type 10 }}
finish {reflection 0.6 }}
sphere {<-0.5,3,0> 2 pigment {color Red}
finish {reflection 0.6 }}
Obrazek przedstawia taką samą kulę z powierzchnią jednobarwną i pokrytą obrazkiem:
Ćwiczenie 1 - Ołówek
Krok 1 - przygotowanie tekstur
Do wykonania ołówka potrzebne nam są cztery tekstury: grafit, drewienko (ewentualnie
plastik, jeśli ktoś się uprze, że używa tych nowych francuskich ołówków), farba (ja zrobię
niebieską) i złoto. Oto ich kody:
texture { // grafit
pigment {rgb 0.3}
finish {ambient 0.7 diffuse 0.8 specular 0.8 roughness 0.01 brilliance 2}
}
texture { // drewienko (lub plastik)
pigment {rgb <0.8, 0.55, 0.4>}
finish {ambient 0.2 diffuse 0.8 specular 0.2 roughness 0.3}
}
texture { // błękitna farba
pigment {rgb <0.2, 0.4, 1>}
finish {diffuse 0.8 specular 0.5 roughness 0.01 reflection 0.1 metallic
0.3}
}
texture { // złoto
Strona 25 z 30
pigment {rgb <0.85, 0.7, 0.3>}
finish {ambient 0.25 diffuse 0.9 specular 0.8 reflection 0.3 brilliance 4
metallic 0.5}
}
Krok 2 - baza obiektu
Składać się ona będzie z ułożonych jedna po drugiej, następujących brył:
Stożek obłożony teksturą grafitu
Stożek ścięty obłożony teksturą drewna
Walec obłożony tą samą teksturą
W tym momencie powinno to wyglądać mniej więcej tak:
Krok 3 - struktura tnąca
Ołówek powinien mieć w przekroju poprzecznym sześciokąt
foremny. Jak to zrobić? Przygotowujemy w tym celu trzy
prostopadłościany wystarczająco długie, żeby zmieścić w sobie całą
bazę ołówka i przecinające sie w taki sposób, jak pokazuje obrazek
obok:
Widzisz kształt sześciokąta wewnątrz konstrukcji? Należy tak
dobrać wysokości prostopadłościanów, aby długość boku owego
sześciokąta wyniosła dokładnie tyle, co promień walca w bazie
ołówka. Tu najprawdopodobniej trzeba będzie wziąć jakąś kartkę i
wszystko narysować. Bryłom nadajemy teksturę farby
Krok 4 - Nałożenie konstrukcji tnącej
Następnie robimy następujące operacje:
Bazę ołówka zamykamy w nawias union
Uwzględniamy tę unię w nawiasie intersection razem z utworzoną przed chwilą
konstrukcją tnącą.
I mamy (mam nadzieję) taki wynik:
Krok 5 - Ozdobne napisy
Pozostaje nam tylko dodać to stworzonej bryły wytłaczane złote napisy (tak jak na
prawdziwym ołówku). Robimy to tak:
Strona 26 z 30
Wszystko, co do tej pory zrobiliśmy zamykamy w nawias difference tak, aby
stanowiło to odjemną (bryłę ciętą)
Jako odjemnik uwzględniamy napis umieszczony tak, aby częściowo zagłębiał się w
ściance ołówka
I bryła gotowa. Prawda, że nie takie złe? Nasze dziełko prezentuje się tak:
Ćwiczenie 2 - Śrubka
Krok 1 - tekstura metalu
Zazwyczaj śrubki robi się z metalu. Wykonajmy zatem jakąś ciekawą teksturkę:
texture { // fajny metal
pigment {rgb 0.9}
finish {ambient 0.2 diffuse 0.7 brilliance 2 specular 0.7 reflection 0.3
metallic}
}
Krok 2 - baza obiektu
Stwórzmy unię, składającą się z trzech obiektów ustawionych w rzędzie: superelipsoidy,
walca i ściętego stożka. Nakładamy na nie nasz metal. Powinno to wyglądać mniej więcej tak:
Krok 3 - ścięcie główki
Wykorzystujemy identyczny tok myślenia jak w przypadku tworzenia konstrukcji tnącej
ołówka. Superelipsoidę zamykamy w nawiasie intersection wraz z trzema odpowiednio
przecinającymi się prostopadłościanami. W tej chwili główka naszego obiektu powinna
przybrać taki kształt:
Krok 4 - Stworzenie gwintu
Tu będzie sporo roboty. Jest nam potrzebne całkiem sporo torusów rozciętych na pół.
Strona 27 z 30
Wykorzystując obrót oraz przesunięcia przemieszczamy je tak, aby tworzyły spiralę. Ostatnia
połówka torusa założona najbardziej po lewej stronie powinna mieć nieco większy promień.
Cała spirala przedstawia się następująco:
Krok 5 - Nałożenie gwintu
Ta część jest chyba najgorsza. Nakładając na obiekt gwint musimy wykonać następujące
operacje:
Wokół walca i stożka tworzymy nawias union
Wokół unii tworzymy nawias difference tak, aby walec ze stożkiem były odjemną
tejże różnicy. Jako odjemniki wstawiamy połówki torusów z przygotowanego
wcześniej gwintu.
Tekstury:
Aluminum, Apocalypse, Blood_Marble, Blood_Sky, Blue_Agate, Blue_Sky, Blue_Sky2, Blue_Sky3,
Brass_Metal, Brass_Valley, Bright_Blue_Sky, Bright_Bronze, Bronze_Metal, Brown_Agate,
Brushed_Aluminum, Candy_Cane, Cherry_Wood, Chrome_Metal, Clouds, Copper_Metal, Cork,
Dark_Wood, DMFDarkOak, DMFLightOak, DMFWood1, DMFWood2, DMFWood3, DMFWood4,
DMFWood5, DMFWood6, EMBWood1, FBM_Clouds, Gold_Metal, Gold_Nugget, Jade, Lightning1,
Lightning2, New_Brass, New_Penny, Peel, Pine_Wood, Pink_Granite, PinkAlabaster,
Polished_Brass, Polished_Chrome, Red_Marble, Rosewood, Rust, Rusty_Iron, Sandalwood,
Sapphire_Agate, Shadow_Clouds, Silver_Metal, Silver1, Silver2, Silver3, Spun_Brass, Starfield,
T_Stone1, T_Stone10, T_Stone11, T_Stone12, T_Stone13, T_Stone14, T_Stone15, T_Stone16,
T_Stone17, T_Stone18, T_Stone19, T_Stone2, T_Stone20, T_Stone21, T_Stone22, T_Stone23,
T_Stone24, T_Stone25, T_Stone26, T_Stone27, T_Stone28, T_Stone29, T_Stone3, T_Stone30,
T_Stone31, T_Stone32, T_Stone33, T_Stone34, T_Stone35, T_Stone36, T_Stone37, T_Stone38,
T_Stone39, T_Stone4, T_Stone40, T_Stone41, T_Stone42, T_Stone43, T_Stone44, T_Stone5,
T_Stone6, T_Stone7, T_Stone8, T_Stone9, T_Wood1, T_Wood10, T_Wood11, T_Wood12,
T_Wood13, T_Wood14, T_Wood15, T_Wood16, T_Wood17, T_Wood18, T_Wood19, T_Wood2,
T_Wood20, T_Wood21, T_Wood22, T_Wood23, T_Wood24, T_Wood25, T_Wood26, T_Wood27,
T_Wood28, T_Wood29, T_Wood3, T_Wood30, T_Wood31, T_Wood32, T_Wood33, T_Wood34,
T_Wood35, T_Wood4, T_Wood5, T_Wood6, T_Wood7, T_Wood8, T_Wood9, Tan_Wood,
Tinny_Brass, Tom_Wood, Water, White_Marble, White_Wood, Yellow_Pine
Strona 28 z 30
STANDARDOWE OPCJE STARTU:
#include "COLORS.INC" // definiowanie kolorów
#include "TEXTURES.INC" // definiowanie tekstur i pigmentów
#include "CHARS.INC" // Biblioteka znaków
#include "CONSTS.INC" // Odmiany stałych
#include "FINISH.INC" // Wykończenia
#include "GLASS.INC" // Szkło
#include "GOLDS.INC" // Złoto
#include "METALS.INC" // Metal pigmenty, wykończenia i tekstury
#include "RAD_DEF.INC" // Gradacje
#include "SHAPES.INC" // Standardowe obiekty z POV-Ray's
#include "SHAPES2.INC" // Przydatne kształty
#include "SHAPESQ.INC" // Ćwierć kształty
#include "SKIES.INC" // Definiowanie nieba
#include "stars.inc" // Gwiazdozbiory
#include "stdcam.inc" // Standardowe kamery
#include "STONES.INC" // Związane z definiowaniem STONES1 i STONES2
#include "STONES1.INC" // Duże tekstury kamienne
#include "STONES2.INC" // Inne
#include "WOODMAPS.INC" // Podstawowe słoje drewna
#include "WOODS.INC" // Tekstury drewna
Zestaw gotowych pigmentów (layered patterns)
agate = pigment agatowy, kolisty
boxed = pojedyńczy czworokątny element w centrum obrazu
bozo = kolorowe czerwono-zielone plamy
brick = Łączenie kafelków- pigment {brick pigment{Jade}, pigment{Black_Marble}} lub
normal {brick normal{bumps 0.2}, normal{granite 0.3}}
bumps = ciapki
checker = szachownica - normal { checker 0.5 }
crackle = popękane szkło
cylindrical = pojedyńczy kolisty element w centrum obrazu
dents = pofałdowania
gradient = liniowanie - pigment { gradient x }
granite = pigment szlifowanego kamienia
hexagon = klepka z sześciokatów - normal { hexagon 0.5 }
leopard = plamy skóropodobne
mandel = mglisty pejzaż- normal {mandel 0.5}
onion = koliste fale niby cebula
marble = linie zbieżne do horyzontu ?marmur
planar = koliste kręgi o dużym promieniu
quilted = pikowany materiał
radial = promienie - pigement {radial color_map{[0.5 Black][0.5 White]} frequency 10 }
ripples = koliste falowanie wody
spherical = pojedyńczy kolisty element w centrum obrazu
spiral1 = pigment spiralopodobny kolisty - normal {spiral1 0.5}
spiral2 = pigment spiralopodobny z osobnych elementów
spotted = centkowanie, nakrapianie
waves = koliste fale, wir chmur, trąba powietrzna
wood = drewnopodobny
Strona 29 z 30
Modyfikacja kształtów obiektu
Należy dopisać do kodu opisującego dany kształt (np. kula - sphere), w wierszu
poprzedzającym ostatni zamykający nawias klamrowy , definicję polecenia modyfikującego.
Modyfikatory:
bounded_by = ograniczenie dla box = bounded_by { box { -(x+y+z) +(x+y+z) }
clipped_by = wycięcie fragmentu kuli = clipped_by { sphere { 0.5*y, 2.5 } }
hollow = wgłębienie, wydrąrzenie w box?
interior = pokazanie wnętrza
media = zaawansowane
no_shadow = bez cienia padającego od obiektu
open = otwiera jeden z boków walca (cylinder). Walec przypomina teraz rurkę
Proszę zaprojektować choinkę jak na obrazku poniżej:
Tło:
sky_sphere { pigment { gradient <0,1,0>
color_map { [0
color rgb<1,0,1>]
[0.4 color rgb<0.14,0.14,0.56>]
[0.6 color rgb<0.14,0.14,0.56>]
[1.0 color rgb<1,1,1>]
}
scale 2 }
}
plane { <0,1,0>, 0 texture { pigment{color Grey}} }
Co oznaczają powyższe zapisy?
Strona 30 z 30