Kurs grafiki 3D

Komentarze

Transkrypt

Kurs grafiki 3D
Calisto v–hr. Kami–Chojnacka
Kurs grafiki 3D
Ministerstwo Dziedzictwa Narodowego Księstwa Sarmacji
Grodzisk 2008
Witajcie!
Ministerstwo Dziedzictwa Narodowego widząc zastój w rozwoju sztuki w Sarmacji postanowiło podać pomocną dłoń wszystkim, którzy pragną zgłębić tajniki grafiki komputerowej. W tym
celu przygotowano zestawy specjalnych kursów dla wszystkich zainteresowanych tematem.
Pierwszy kurs, złożony w kilkunastu wykładów będzie dotyczył grafiki trójwymiarowej (3D)
jako tej, której przejawów w Sarmacji znaleźć można najmniej. Następne edycje najprawdopodobniej będą dotyczyły grafiki rastrowej oraz wektorowej.
W kursie może wziąć udział każdy. W zależności od preferencji można zostać studentem
albo wolnym słuchaczem kursu. Różnica jest jedna, za to zasadnicza. Od studentów wymagamy
przesyłania na adres Ministerstwa prac zadanych na końcu każdego wykładu. Wolni słuchacze tego
obowiązku nie mają. W nagrodę za przesłanie wszystkich prac Ministerstwo na koniec kursu przyzna
studentom Certyfikat Grafika 3D.
Mam nadzieję, że cały cykl kursów graficznych będzie cieszył się ogromnym powodzeniem.
W razie jakichkolwiek uwag proszę pisać na adres [email protected] lub numer Gadu–
Gadu: 2549451. Chętnie rozważę wszystkie propozycje i odpowiem na wszystkie pytania.
Obsługa programu może się wydać problematyczna dla początkujących, jednakże ręczę, że
wystarczy odrobina chęci i wszystko pójdzie jak po maśle. W razie potrzeby pomyślę na dodatkowymi zajęciami dla tych, którzy nie będą mogli sobie poradzić z prezentowanymi przeze mnie materiałami.
(—) Calisto v-hr. Kami-Chojnacka
Minister Dziedzictwa Narodowego
2
Wykład 1: Wstęp do pracy z programem Pov-Ray
Podczas dzisiejszych zajęć poznamy program graficzny, który umożliwi nam tworzenie trójwymiarowych obrazów. Program ten noszący nazwę Pov-Ray, można pobrać bezpłatnie na stronie
www.pov-ray.org.
Ważną informacją jest, że w Pov-Rayu nie rysuje się w dosłownym tego słowa znaczeniu. Tu,
przy pomocy prostych poleceń tekstowych tworzymy scenę i dodajemy do niej różne obiekty. Dopiero gotowy obraz możemy uruchomić, a komputer przetworzy podane mu dane na konkretne
kształty. Oczywiście takie rozwiązanie może odstraszać początkujących, niemniej kurs, który dla
Was przygotowałam, będzie szczegółowy w takim stopniu, by każdy mógł poradzić sobie z tworzeniem własnych obiektów 3D.
Największym atutem Pov-Raya jest zapewne możliwość tworzenia niezwykle realistycznych
obrazów przy minimalnym wysiłku. Warto zatem poświęcić nieco czasu na naukę jego obsługi.
Zaczynamy!
Zanim po raz pierwszy uruchomimy Pov-Raya pozwolę sobie przypomnieć podstawowe
fakty dotyczące obrazów w przestrzeni. Każdemu punktowi w przestrzeni możemy przypisać określoną współrzędną oznaczając jego rzuty prostopadłe na jedną z trzech osi. Dokładny opis tego
przedstawia rysunek 1.
Czarna kropka na środku obrazu, to punkt, który chcemy opisać za pomocą podania współrzędnych jego położenia. Widzimy, że nasz punkt ma trzy współrzędne: Xsową, Ykową i Zetową.
Kolorowe odcinki przedstawiają nam wspomniane wcześniej rzuty prostopadłe na kolejne osie.
Pierwszą współrzędną odczytujemy z osi X, drugą z osi Y natomiast trzecią z osi Z. Punk przedstawiony na rysunku ma więc współrzędne (3,5,6). W programie współrzędne zapisujemy w następujący sposób: <3,5,6>. Zapis taki oznacza, że jeśli przyjmiemy za środek naszej sceny punkt <0,0,0> to
nasz punkt znajdzie się o 3 jednostki w prawo, 5 do góry i 6 w głąb od środka sceny.
Wiemy już jak wyglądają współrzędne poszczególnych punktów zatem możemy po raz
pierwszy uruchomić Pov-Raya. Powinno nam się pojawić okienko takie, jak na rysunku 2.
3
Przyjrzyjmy mu się dokładnie. Duże przyciski w górnej części okna będą Nas interesowały
najbardziej. Pierwszy: New, służy jak nie trudno się domyślić do tworzenia nowego dokumentu. Dokument w ten sposób utworzony utworzy się Nam w nowej zakładce o nazwie Untitled. Nie ma w
nim nic szczególnego, jest to po prostu czysta karta, którą będziemy później zapisywać kodem naszego obrazu. Kolejne przyciski: Open i Close, służą do otwierania i zamykania istniejących zakładek.
Warto zwrócić na to uwagę, ponieważ Pov-Ray przy wyłączeniu krzyżykiem zostawia w pamięci
wszystkie otwarte zakładki. Gdyby nie przycisk Coles, w krótkim czasie nie zaśmiecilibyśmy sobie
całe okno. Ostatnim ważnym przyciskiem jest przycisk Run. Na zamieszczonym rysunku znajduje się
on na samym końcu ciągu przycisków, w programie jest przedostatni. Dzięki niemu możliwe jest
przetworzenie naszego kodu na obraz.
Warto jeszcze wspomnieć o rozdzielczości. Nie wiele zdziałamy powiększając okno. Obraz
pozostanie w takich samych, zadeklarowanych rozmiarach. Tajemnicza deklaracja znajduje się w
małym prostokącie pod przyciskami New i Open. Na rysunku 2 rozdzielczość ustawiona jest na
640x480. Możecie poeksperymentować z rozdzielczością, warto jednak pamiętać o tym, że im większy obraz, tym dłużej będzie się on renderował.
Kiedy już zapoznaliśmy się z najważniejszymi funkcjami obsługi Pov-Raya możemy przejść
do tworzenia pierwszego obrazu. Algorytm tworzenia jest niezwykle prosty. Musimy pamiętać jedynie o kilku rzeczach.
Przede wszystkim dodajemy biblioteki kolorów i tekstur. Robimy to wpisując do nowego
dokumentu następujące komendy:
#include "colors.inc"
#include "textures.inc"
Dzięki tym prostym komendom będziemy mogli tworzonym obiektom nadać kolor lub teksturę. Następnym krokiem jest ustawienie kamery. Robimy to przy pomocy polecenia
camera {location <-2,4,7>
look_at <0,4,0>}
Jak widać funkcja kamery ma dwa parametry. Pierwszy: location, określa nam dokładnie
punkt, w którym będzie umiejscowiona kamera, drugi zaś definiuje punkt, na który patrzymy. Plik,
który w ten sposób stworzyliśmy możemy uruchomić wciskając przycisk Run. Po jego naciśnięciu
pojawi nam się okienko z pytaniem o zapisanie zmian. Rozsądnym posunięciem jest zaznaczenie
opcji: Automatically autosave files for the test of this session. Dzięki temu na resztę sesji będziemy
mogli zapomnieć o zapisywaniu zmian, gdyż będą się one zapisywały automatycznie. Po zaznaczeniu tej opcji wciskamy przycisk Save, wybieramy lokację naszego pliku, powiedzmy, że na razie
może to być Pulpit, a następnie wpisujemy nazwę tworzonego obrazu (w moim przypadku: kursik) i
wciskamy Enter. Uruchomi nam się kolejne okienko, w którym wyrenderowany zostanie obraz,
który stworzyliśmy. Nasz obraz jest cały czarny, nie ma się jednak czym przejmować, nie dodaliśmy
bowiem do niego absolutnie nic.
4
Aby umożliwić oglądanie powstałego obrazu musimy scenę oświetlić. W tym celu posługujemy się następującym poleceniem:
light_source{<0,3,5> White}
Jak nie trudno zauważyć polecenie light_source ma dwa parametry: położenie źródła światła
I jego kolor. Czasami, żeby ustalić dobre położenie źródła światła trzeba trochę poeksperymentować
jednak na potrzeby naszego pierwszego spotkania wystarczy w zupełności ulokować je w punkcie,
który podała w przykładzie.
UWAGA! Wielkość liter ma znaczenie, dlatego nazwy kolorów piszemy z wielkiej litery!
Uruchamiamy program po raz kolejny i zauważamy, że nadal nic się nie stało. O co zatem
chodzi? Powód jest prosty. Mamy kamerę, mamy źródło światła, ale nie mamy żadnego obiektu, na
który nasze światło mogłoby padać. Świeci ono po prostu w pustkę.
Zajmijmy się zatem naszymi pierwszymi obiektami: kulą i prostopadłościanem.
Nie trudno się domyślić, że parametrami określającymi kulę będą jej środek oraz promień.
Powiedzmy więc, że chcemy stworzyć kulę o środku w punkcie o środku w punkcie <1,4,1> i o promieniu 1. Do tworzenia kuli korzystamy z polecenia: sphere przypisując mu parametry wspomniane
wyżej. A oto i cała konstrukcja:
sphere{<1,4,1> 1}
Jeśli spróbowaliście wyrenderować obraz przy pomocy przycisku Run, na pewno zauważyliście, że nie wiele się zmieniło. Nadal mamy czarne tło i nic poza tym. Dzieje się tak ponieważ PovRay domyślnie nadał naszej kuli kolor czarny. Aby to zmienić musimy nieco rozszerzyć polecenie
tworzenia sfery. Mam na myśli oczywiście rozszerzenie o kolor.
W bibliotece kolorów (colores.inc), którą dodaliśmy na samym początku naszego programu
znajdziemy większość kolorów: biały (White), żółty (Yellow), pomarańczowy (Orange), złoty (Gold),
różowy (Pink), czerwony (Red), fioletowy (Violet), niebieski (Blue), zielony (Green), szary (Gray),
srebrny (Silver), czarny (Black). Jest to znaczne ułatwienie dla twórców grafiki 3D, choć oczywiście
nie jest to rozwiązanie jedyne. Na późniejszych wykładach nauczymy się komponować swoje własne
kolory, zanim jednak do tego dojdziemy, w zupełności wystarczą Nam te podane wyżej.
Jak więc nadać naszej kuli kolor? To proste, wystarczy do polecenia sphere dodać jeszcze jeden parametr, tuż za definicją długości promienia. Gotowe polecenie ma postać:
sphere{<1,4,1> 1 texture{pigment{color Silver}}}
Gratuluję! Teraz możemy obejrzeć wynik dotychczasowej pracy!
Tworzenie prostopadłościanu jest podobne. W jej realizacji pomaga funkcja box. Parametry
jakie należy zadać tej funkcji, by działała poprawnie, przedstawione są na poniższym rysunku:
5
Oczywiście, prostopadłościanowi również musimy nadać kolor. Polecenie:
box{<2,2,0> <0,3,2> texture{pigment{color Silver}}}
Ciekawym eksperymentem dla wszystkich uczestników kursu może być zmienianie położenia kamery oraz punktu na który patrzymy. Można również dodać dodatkowe źródła światła uzyskując całkiem ciekawe efekty. Życzę udanej zabawy.
Poniżej przedstawiam kod i wynik działania programu, który dziś napisaliśmy po dodaniu
dodatkowych źródeł światła:
6
Zadania na zaliczenie:
1. Narysuj bałwana. Nie zapomnij o oczach i guzikach.
2. Stwórz figurę przedstawioną na rysunku poniżej i oświetl ją tak, by wyglądała jakby znajdowała
się na sali, na której właśnie trwa dyskoteka.
7
Wykład 2: Upiększanie rysunku
Zanim przejdziemy do dzisiejszego głównego tematu chciałabym jeszcze zapoznać Was z dwiema
przydatnymi figurami, a mianowicie z walcem i stożkiem. Dla ułatwienia będziemy pracować na obrazie stworzonym ostatnio.
W przypadku stożka musimy naszej funkcji podać aż cztery parametry: współrzędne środka
podstawy, promień podstawy, współrzędne wierzchołka stożka oraz promień okręgu zamykającego
stożek. Ostatni parametr przyjmie wartość niezerową tylko w przypadku, gdy będziemy chcieli wygenerować stożek ścięty. Na razie jednak zajmiemy się stożkiem zwykłym. Do jego utworzenia służy
polecenie: cone. A oto cała funkcja wraz z parametrami.
cone{<-1,2,1> 0.5 <-1,5,1> 0 texture{pigment{color Silver}}}
Oczywiście zadane parametry zależą tylko od nas, możemy zmieniać promienie w przypadku obu okręgów oraz współrzędne punktów uzyskując dzięki temu efekt pochylenia (w przypadku zmiany pierwszej i trzeciej współrzędnej), ścięcia (w przypadku zmiany ostatniego parametru
z 0 na liczbę dodatnią) oraz wydłużenia lub skrócenia (w przypadku zmian w drugiej współrzędnej.
Zanim przejdziemy dalej przećwiczcie sobie zabawę ze stożkiem.
Kolejną figurą, która przyda nam się niewątpliwie jest walec. Polecenie generujące go jest co
do struktury bardzo podobne do polecenia generującego stożek. W czym więc tkwi różnica?
Jak widać na załączonym powyżej obrazku podstawa walca, w przeciwieństwie do stożka nie
ulega zmianie. Teoretycznie moglibyśmy stworzyć walec poleceniem generującym stożek, wpisując
te same promienie w przypadku obu podstaw. Jest jednak funkcja, która nieco nam pomaga (nieco,
bo różnic się jedynie tym, że ma trzy parametry zamiast czterech). Funkcja, o której mowa to: cylinder, a gotowe polecenie wygląda następująco:
cylinder{<-2.5,2,1> <-2.5,5,1> 0.5 texture{pigment{color Silver}}}
Potrafimy już zatem rysować podstawowe figury geometryczne. Przy ich pomocy będziemy
tworzyć bardziej złożone obiekty. Zanim jednak do tego przejdziemy musimy poznać kilka istotnych
funkcji pozwalających nam nieco uatrakcyjnić nasze obrazy.
Zacznijmy od płaszczyzn. Jak do tej pory, tworzone przez nas obiekty były zawieszone w
powietrzu. Oczywiście stan taki raczej sprzeczny jest z rzeczywistością. Na naszej planecie rzadko
się zdarza by coś wisiało w powietrzu. Trzeba to na czymś postawić. Na stole, na trawie, na łóżku. Do
wygenerowania płaszczyzny służy polecenie plane. Aby nasza płaszczyzna się pojawiła musimy
określić jej położenie i oś, po której będziemy ją przesuwać.
Najłatwiej będzie zademonstrować działanie tej funkcji na przykładzie. Dodajmy teraz do
naszego obrazu płaszczyznę, powiedzmy drewnianą.
plane{y,2
texture{Cherry_Wood}}
8
Powyższe polecenie wygeneruje nam płaszczyznę poziomą zaczynającą się na wysokości 2.
Dzięki temu nasze przedmioty będą stały właśnie na niej.
Zwróciliście na pewno uwagę na magiczne słowo, które znajduje się praktycznie w przypadku generowania praktycznie każdego obiektu. Chodzi oczywiście o polecenie texture. Do tej
pory używaliśmy konstrukcji: texture{pigment{color Red}}. Takie polecenie pozwala nam nadać naszemu obiektowi konkretny kolor. W przypadku płaszczyzny, którą generowaliśmy powyżej składnia
polecenia była jednak inna: texture{Cherry_Wood}.
Podczas pierwszego wykładu, kiedy poznawaliśmy strukturę każdego obrazu wspomniałam
nieco o bibliotekach, które musimy dodawać na początku każdego kodu. Mam na myśli biblioteki
colors.inc i textures.inc. W pierwszej zdefiniowane są podstawowe kolory, w drugiej podstawowe
tekstury. Naturalnie wszystko możemy stworzyć sobie sami od podstaw. Jest to jednak troszeczkę
wyższy poziom wtajemniczenia. Zanim go osiągniemy będziemy posługiwali się jedynie gotowymi
wzorami. Ja osobiście najczęściej używam tekstur: Jade, White_Marble i Brown_Agate. Sprawcie jakie daje to efekty. Więcej tekstur znajdziecie na stronie http://texlib.povray.org/. Tekstury pozwalają
w prosty i szybki sposób podnieść wartość estetyczną naszego obrazu.
Kolejnym przystankiem na naszej mapie jest tło. Domyślnie Pov-Ray dobiera nam tło koloru
czarnego. Przez to nasz obraz jest taki ciemny. Możemy to jednak w prosty sposób zmienić. Każdy
kto zna podstawy języka angielskiego bez problemu może się domyślić, że będzie służyło nam do
tego polecenie background. Sprawmy zatem, by nasze tło zrobiło się białe:
background{White}
Różnicę widać od razu. Oczywiście białe tło niezbyt pasuje do naszego obrazu, ale dobranie
koloru pozostawiam Wam, jako ćwiczenie.
Potrafimy już dodawać płaszczyzny, nadawać przedmiotom kolor lub teksturę oraz zmieniać
kolor tła. Podczas dzisiejszego wykładu chciałabym Wam powiedzieć jeszcze o specjalnej funkcji pozwalającej nieco upiększyć rzeczywistość naszego obrazu. Dodaje się ją jako parametr do funkcji naszego obiektu, zaraz po definicji koloru lub tekstury. Polecenie ma postać:
finish{reflection 0.5 phong 0.5}
Sami zobaczcie do czego służy. Ja pozwolę sobie jeszcze tylko wspomnieć, że wartości,
które podajemy w tej funkcji: reflection i phong mogą przyjmować wartości tylko od 0 do 1. Poeksperymentujcie.
Zasadniczo to wszystko na dziś. Mam nadzieję, że udało mi się to przedstawić w sposób klarowny i czytelny. Jednak na wszelki wypadek zamieszczam kod obrazu, który dziś wygenerowaliśmy:
#include "colors.inc"
#include "textures.inc"
camera {location <0,4,7>
look_at <0,4,0>}
light_source{<0,3,5> White}
light_source{<-2,3,5> Yellow}
light_source{<2,3,5> Red}
light_source{<3,0,5> Green}
light_source{<0,7,5> Blue}
plane{y,2
texture{Cherry_Wood}}
background{White}
9
sphere{<1,4,1> 1 texture{pigment{color Silver}} finish{reflection 0.5 phong 0.5}}
box{<2,2,0> <0,3,2> texture{pigment{color Silver}}}
cone{<-1,2,1> 0.5 <-1,5,1> 0 texture{pigment{color Silver}}}
cylinder{<-2.5,2,1> <-2.5,5,1> 0.5 texture{pigment{color Silver}}}
Zadanie: Narysuj główkę pajacyka otoczoną bańkami mydlanymi (do tworzenia baniek możecie skorzystać z tekstury Glass - przy okazji jest to najlepsza tekstura do sprawdzania działania
ostatniej podanej funkcji).
10
Wykład 3: Przekształcenia
Poznaliśmy już całkiem sporo obiektów. Potrafimy tworzyć podstawowe figury geometryczne, więc
teoretycznie potrafimy stworzyć każdy obiekt, budując go z nich. Nie trudno jednak zauważyć, że
takie rozwiązanie byłoby niezmiernie uciążliwe. Podczas kolejnych wykładów poznamy szereg funkcji w znacznym stopniu ułatwiający nam zabawę.
W dniu dzisiejszym chciałabym zapoznać Was z funkcjami umożliwiającymi przekształcanie
naszego obrazu. Nauczymy się przesuwać obiekt, skalować go oraz obracać. Teoretycznie, funkcje
te nie są nam do niczego potrzebne, gdyż każdy obiekt możemy stworzyć w taki sposób, by odpowiadał innemu obiektowi po przekształceniu. Jestem jednak pewna, że zauważycie jak bardzo te
operacje ułatwiają pracę z programem Pov-Ray.
Z wiadomości, które poznaliśmy do tej pory wynika jasno, że należy stworzyć 9 obiektów
(walców), z których każdemu należy nadać odpowiednie parametry - położenie punktu, będącego
środkiem podstawy dolnej oraz górnej, a także promień podstawy. O ile kwestia promienia nie przysporzy nawet najmniejszego kłopotu (wszystkie paliki mają być tej samej grubości) o tyle określanie
położenie środków podstaw może już być irytujące - szczególnie, jeśli płotek zamiast 9 będzie miał
mieć 90 palików.
Twórcy programu pomyśleli i o tym. Umożliwiając nam stworzenie tego płotu z jednego
obiektu, który następnie poddajemy pewnym przekształceniom. Ale zacznijmy od początku, tzn. od
stworzenia nowego pliku. Myślę, że stworzenie sceny, na której będzie jedynie podstawa nie sprawi
Wam najmniejszego problemu, dlatego pozostawiam to jako proste ćwiczenie.
Kiedy mamy już scenę rysujemy na niej jeden walec. Wymiary zależą tylko od Waszej wyobraźni, pamiętajcie jednak, żeby dobrze ustawić kamerę i źródła światła. Aby ułatwić sobie tłumaczenie a Wam rozumienie skorzystam z przykładu:
cylinder{<-1.1,-1.2,0> <-1.1,1.2,0> 0.2 texture{pigment{color Red}}}
Mamy tu walec, którego punktem środka podstawy jest p=<-1.1,-1.2,0> a promieniem r=0.2.
Aby z naszego walca powstał płotek musimy go odpowiednio poprzesuwać. Do przesuwania obiektów w programie Pov-Ray służy polecenie translate. Zanim jednak przejdziemy do jego zastosowania musimy sobie odpowiedzieć na pytanie: jak przesuwać nasz walec. Odpowie jest prosta: Chcemy
by paliki przylegały do siebie, nie nachodząc jeden na drugi i nie zostawiając przerw, dlatego mu-
11
simy przesuwać pierwszy walec o wielokrotności 2r (dwóch promieni) — sytuację obrazuje poniższy
rysunek:
Polecenie translate wpisuje się definicji danego obiektu. Aby powstał rysunek jak ten powyżej należy więc wpisać kod:
cylinder{<-1.1,-1.2,0> <-1.1,1.2,0> 0.2 }
cylinder{<-1.1,-1.2,0> <-1.1,1.2,0> 0.2 translate<0.4*1,0,0>}
Zwróćcie uwagę na to, że w deklaracji wektora przesunięcia użyłam zapisu 0.4*1 zamiast po
prostu napisać 0.4. Oczywiście obie formy są poprawne, a druga jest może nawet bardziej elegancka
na tym etapie, jednak zapis zastosowany przeze mnie ułatwi Wam dokonywanie kolejnych przesunięć oraz uzmysłowi pewną regułę, której zastosowanie pokażę na wykładzie 5. Jak widzicie, kolejne
sztachety tworzymy wpisując w miejsce 1 w deklaracji wektora 0.4*1, kolejno 2,3,.. aż do 8.
Polecenie to znacznie ułatwia pracę, jednak wciąż nie jest doskonałe. Wymaga od nas przekopiowania polecenie cylinder tyle razy ile będzie nam potrzebnych sztachet. Sami chyba jednak
przyznacie, że jest to zdecydowane ułatwienie.
Spróbujmy teraz stworzyć coś na kształt choinki. Naturalnie możemy tego dokonać stosując
tylko i wyłącznie przesunięcie względem osi Y stożka. Takie zastosowanie jest jednak mało doskonałe, a to ze względu na to, że prawdziwa choinka zwęża się wraz z wysokością, a poszczególne jej
piętra mają różne promienie. My potrzebujemy stworzyć coś takiego, co przedstawia poniższy rysunek:
Od razu widać, że poszczególne piętra różnią się od siebie wielkością. I znowu jak w przypadku naszego płotka moglibyśmy z powodzeniem za każdym razem deklarować rozmiary poszczególnych partii naszej choinki. I po raz kolejny byłoby to nużące. Zamiast bawić się w przypisy12
wanie poszczególnych parametrów wszystkim stożkom. Chcemy jednak zastosować prostsze rozwiązanie - w tym celu tworzymy jeden stożek a następnie odpowiednio go przekształcamy - przesuwamy w górę i skalujemy.
Do skalowania służy polecenie scale. Składnie tego polecenie wygląda następująco:
scale<0.7,0.7,0.7>
przy czym w wypadku, w którym mamy do czynienia ze skalowaniem takim samym po
wszystkich osiach możemy zastosować formę uproszczoną:
scale 0.7
Polecenie scale wpisujemy w tym samym miejscu, w którym do tej pory wpisywaliśmy polecenie translate. Naszą choinkę generuje zatem kod:
cone{<0,0,0> 1 <0,2,0> 0 texture{Jade} }
cone{<0,0,0> 1 <0,2,0> 0 texture{Jade} translate<0,1.5,0> scale 0.7}
cone{<0,0,0> 1 <0,2,0> 0 texture{Jade} translate<0,4.9,0> scale 0.4}
Wektor przesunięcia dobrałam sobie metodą prób i błędów, ale naturalnie bez większych
problemów można go wyliczyć. Na obecnym poziomie jednak nie jest nam to potrzebne.
Polecenie scale jest niezwykle przydatne. Proponuje je zapamiętać, na pewno jeszcze podczas tego kursu nie jeden raz nam się przyda.
Potrafimy już przesuwać i skalować obiekty. Zostało nam jeszcze ich obracanie. Co do zasady jest ono równie proste jak pozostałe funkcje, jednakże czasami może się okazać, że obiekt obraca się niezgodnie z naszymi założeniami. Zacznijmy może od stworzenia takiego obrazu:
Nietrudno zauważyć, że masz obiekt składa się z odpowiednio obróconych walców. Pytań
jednak, jakie powinien sobie postawić projektant to jednak nie rozwiązuje. A pytania te to: względem której osi się obraca przedmiot oraz co my tak właściwie obracamy. W przypadku pierwszego
pytania nie ma większych problemów, gdyż nawet jeśli ktoś nie zauważy, że obracamy walec względem osi Z, bez problemu może to sprawdzić przypisując po kolei odpowiednie wartości kąta obrotu.
W drugim przypadku sprawa nie jest już tak oczywista. Czy obracamy walec względem jego początku, końca czy środka? A może istnieje jeszcze inna oś, o której nic nam nie wiadomo?
Zasadniczo łatwo tu popełnić błąd. Mogłoby się nam bowiem wydawać, że dany obiekt obracamy względem jego środka. Tak jednak nie jest. Obracamy go względem prostej przechodzącej
przez punkt (0,0,0). Trzeba mieć to na uwadze dokonując kolejnych obrotów.
To tyle tytułem wstępu do obrotu. Przedmioty obracamy przy pomocy polecenie rotate.
Jako parametry podajemy kąty obrotu względem poszczególnych osi. Aby stworzyć powyższy kwiatek musimy wykonać następujące polecenia:
13
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}} rotate<0,0,30>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,60>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,90>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,120>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,150>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,180>}
Aby jeszcze bardziej uzmysłowić Wam potęgę osi obrotu pokaże jaki wynik otrzymamy dla
tego samego programu jeśli stworzymy walec o środkach podstawy w punktach <0,2,0> i <0,4,0>.
Zasada jest zatem prosta: Najpierw pomyśl, potem obracaj.
Na dziś to wszystko. Zapraszam za tydzień.
Zadanie: Stwórz obraz przedstawiający płot ogrodzony otoczony choinkami. Zza płotu powinny wyglądać kwiaty.
14
Wykład 4: Operacje boolowskie
Podczas dzisiejszego wykładu chciałabym Wam opowiedzieć o funkcjach, które w znacznym stopniu
ułatwią nam pracę z programem. Pamiętacie, jak robiliśmy obiekt złożony z wielu figur i za każdym
razem musieliśmy przypisywać mu parametry takie jak kolor? Po dzisiejszym wykładzie już tego robić nie będziemy musieli - a to za sprawą operacji boolowskich.
Słów kilka na temat samych operacji boolowskich. Przyjrzyjcie się uważnie rysunkowi:
Jak widać na rysunku mamy trzy podstawowe operacje boolowskie, którymi będziemy się
zajmować: sumę, różnicę oraz część wspólną.
Sumą dwóch zbiorów, jak nie trudno się domyślić, nazywamy taki zbiór, który zawiera
wszystkie elementy obu zbiorów - i nic poza tym. Dlaczego operacja ta może okazać się przydatna?
Głównie dlatego, że teraz będziecie mogli już grupować tworzone obiekty. To z kolei niesie ze sobą
mnóstwo kolejnych udogodnień. Ale zobaczmy, jak to działa na przykładzie.
Przypomnijmy sobie kwiat, który stworzyliśmy na poprzednim wykładzie. Kod wyglądał tak:
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}} rotate<0,0,30>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,60>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,90>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,120>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,150>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 texture{pigment{color Red}}rotate<0,0,180>}
Nietrudno zauważyć, że w naszym programie często pojawia się to samo polecenie
texture{pigment{color Red}}. Co prawda w przypadku podobnym do tego, gdy kolejne figury są jedynie przekształceniem figury podstawowej większej różnicy pozornie może nie zrobić nam kopiowanie linijki wraz z tym poleceniem, jednak wygląda to dość niestarannie i sprawia, że kod staje się
zdecydowanie mniej czytelny. Ponadto, gdybyśmy wzięli zupełnie inne obiekty, które miałby mieć
ten sam kolor, sprawa stałaby się znacznie bardziej uciążliwa.
Pomoc w rozwiązaniu tego problemu niesie właśnie możliwość zastosowania sumy boolowskiej — dzięki temu wszystkie obiekty wchodzące w jej skład mogą mieć ten sam bez potrzeby deklarowania go w każdym obiekcie. Efekt sumy boolowskiej zyskujemy dzięki poleceniu union. A oto
jak będzie wyglądał nasz kod jeśli użyjemy tego polecenia:
union{
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 }
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,30>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,60>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,90>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,120>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,150>}
cylinder{<0,-1.2,0> <0,1.2,0> 0.2 rotate<0,0,180>}
texture{pigment{color Red}}
}
15
Jestem pewna, że już niebawem, każdy użytkownik Pov-Raya doceni zalety tego polecenia,
ale, ale... Zobaczmy co się stanie jeśli nadamy naszemu obiektowi teksturę Glass!!!
Chyba nie do końca tego się spodziewaliśmy. Tekstura szkła pozwala zauważyć niedoskonałość polecenia union. Niedoskonałość, która zachowuje wszystkie warstwy i jedynie nakłada je na
siebie zamiast łączyć. Aby zniweczyć ten efekt można zastosować alternatywną wersję sumy boolowskiej - wersję stosowaną w przypadku obiektów przezroczystych. Mam tutaj na myśli polecenie:
merge. Stosuję się dokładnie tak jak polecenie union. Wystarczy zatem, że w kodzie zamienimy
union na merge i otrzymamy zupełnie inny efekt:
Warto mieć to na uwadze tworząc przezroczyste obiekty złożone z wielu figur.
Rozpoczynając dzisiejszy wykład wspomniałam również o możliwości wykorzystania róznicy
boolowskiej. Zastosowanie jest oczywiste - różnicę stosujemy kiedy chcemy z jednej figury wyciąć
jakąś inną. Załóżmy zatem, że mamy prostopadłościan, który jest w naszym mniemaniu ścianą i
bardzo chcemy, żeby w naszej ścianie znalazły się okna. Do wycinania służy polecenie difference.
Stosując to polecenie należy pamiętać o dwóch bardzo ważnych rzeczach: po pierwsze w składni
polecenia najpierw podajemy obiekt, z którego chcemy coś wyciąć (odjemna) a dopiero potem to,
co chcemy wyciąć (odjemnik) a po drugie obiekt wycinany musi chociaż na jednej osi mieć większy
rozmiar. Zobaczmy jak wygląda kod ściany z przykładu:
difference
{
box{<3,0,-2> <-2,2,-2> texture{pigment{color Red}}}
16
box{<2.5,0.6,3> <1,1.7,-3> }
box{<2.5,0.6,3> <1,1.7,-3> translate<-2.5,0,0> }
}
Nietrudno zauważyć, że szerokość po osi z-ów odjemnika (6 jednostek) jest większa niż szerokość odjemnej (4 jednostki). Bez tego nici z wycinania.
Ostatnim poleceniem, jakie dziś omówimy jest polecenie intersection służące do ilustrowania części wspólnej. Na podstawie własnego doświadczenia mogę stwierdzić, że jest to komenda
używana najrzadziej z całej poznanej dzisiaj trójki, niemniej radę ją zapamiętać.
Załóżmy, że chcemy stworzyć następujący obiekt:
Polecenie intersection umożliwia uzyskanie takiego efektu dzięki zaledwie kilku liniom kodu.
intersection
{
sphere{<0,0,0> 1 texture{ pigment{color Red}}}
sphere{<0.8,0,0> 1 texture{ pigment{color Red}}}
}
Jak widać obiekt został stworzony z dwóch kul. Warto zauważyć, że polecenie intersection
nie narzuca nam obowiązku określania kolejności elementów znajdujących się w nim. Bez względu
na to, którą kule wymienimy jako pierwszą efekt będzie ten sam.
To wszystko na dziś. Dziękuję za uwagę.
Zadanie: Stwórz następujący obraz:
17

Podobne dokumenty

Cześć Pierwsza

Cześć Pierwsza 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

Bardziej szczegółowo