PovRay - Zestaw 2
Transkrypt
PovRay - Zestaw 2
Zajęcia z grafiki komputerowej – Pov Ray – część 2 Stwórzmy na początek pustą scenę. #include "colors.inc" camera { location <0, 1, -10> look_at 0 angle 36 } light_source { <500, 500, -1000> White } plane { <0,1,0>, -1.5 pigment { checker Green White } } Transformacje obiektów. Obiekty w przestrzeni można skalować, przesuwać i obracać. Służą do tego następujące komendy: a) scale – skaluje obiekty i tekstury, np. box { <-1, 0, -1>, // lewy dolny rog < 1, 0.5, 3> // prawy gorny rog texture { T_Stone25 // tekstura z bilbioteki stones.inc } scale <0.4,2,3> // skalowanie, inne w różnych kierunkach } b) translate – przesuwa obiekty o zadany wektor, np. box { <-1, 0, -1>, // < 1, 0.5, 3> // texture { T_Stone25 // } translate <1,2,2> } lewy dolny rog prawy gorny rog tekstura z bilbioteki stones.inc // przesuniecie o zadany wektor c) rotate – obraca obiekty o zadany kąt w zadanym kierunku box { <-1, 0, -1>, // lewy dolny rog < 1, 0.5, 3> // prawy gorny rog texture { T_Stone25 // tekstura z bilbioteki stones.inc } rotate <0,20,0> // obrot o 20 stopni względem osi y } Uwaga: Obroty dokonywane są względem osi układu współrzędnych, a nie względem środka ciężkości obiektu. Dlatego zaleca się najpierw stworzyć i umieścić obiekt w środku układu współrzędnych, następnie go obrócić, a na koniec przesunąć do żądanej lokalizacji, np. box { <-1, 0, -1>, // lewy dolny rog < 1, 0.5, 3> // prawy gorny rog texture { T_Stone25 // tekstura z bilbioteki stones.inc } rotate <7,20,0> // obrot o zadany kat względem osi <x,y,z> translate <10, 20, 15> } Obiekty CSG (Constructive Solid Geometry). Obiekty CSG powstają jako kombinacje obiektów podstawowych, tzw. prymitywów. Dzięki temu możemy stworzyć nieskończenie wiele nowych, skomplikowanych, obiektów. Rozróżniamy cztery rodzaje tych kombinacji: a) union – obiekty są do siebie dodawane, innymi słowy są łączone. union{ sphere { <0, 0, 0>, 1 pigment { Blue } translate <-0.5,0,0> } sphere { <0, 0, 0>, 1 pigment { Red } translate <0.5,0,0> } } Możemy łączyć dowolną liczbę elementów. Każdy obiekt może mieć swoją teksturę ale możemy też nadać wspólną dla całego obiektu: union{ sphere { <0, 0, 0>, 1 translate <-0.5,0,0> } sphere { <0, 0, 0>, 1 translate <0.5,0,0> } pigment { Red } //polaczone obiekty traktowane sa jako jedna calosc scale <1, 0.25, 1> rotate <30, 0, 45> } b) intersection – część wspólna obiektów intersection { sphere { <0, 0, 0>, 1 translate <-0.5,0,0> } sphere { <0, 0, 0>, 1 translate <0.5,0,0> } pigment { Red } } c) difference – różnica obiektów (zauważmy, że operacje można zagnieżdżać) difference { intersection { sphere { <0, 0, 0>, 1 translate <-0.5,0,0> } sphere { <0, 0, 0>, 1 translate <0.5,0,0> } pigment { Red } rotate <0,90,0> } cylinder { <0, 0, -1> <0, 0, 1>, 0.35 pigment { Blue } } } Aby ułatwić sobie pisanie i późniejsze zrozumienie kodu można poszczególnym obiektom składowym nadawać własne nazwy: #declare dziurawaSoczewka = difference { intersection { sphere { <0, 0, 0>, 1 translate <-0.5,0,0> } sphere { <0, 0, 0>, 1 translate <0.5,0,0> } rotate <0,90,0> } cylinder { <0, 0, -1> <0, 0, 1>, 0.35 } } Następnie, nasze składowe można wykorzystać do zbudowania bardziej złożonego obiektu: union { object { dziurawaSoczewka object { dziurawaSoczewka object { dziurawaSoczewka object { dziurawaSoczewka pigment { Red } } translate translate translate translate <-0.65, 0.65, 0> } <0.65, 0.65, 0> } <-0.65, -0.65, 0> } <0.65, -0.65, 0> } d) merge – scalanie obiektów, podobne do union ale zobaczmy różnice: merge { object object object object { { { { dziurawaSoczewka dziurawaSoczewka dziurawaSoczewka dziurawaSoczewka translate translate translate translate <-0.65, 0.65, 0> } <0.65, 0.65, 0> } <-0.65, -0.65, 0> } <0.65, -0.65, 0> } pigment { Red filter .5 } } Rodzaje oświetlenia Rozróżniamy kilka rodzajów oświetlenia: a) Zwykła żarówka: light_source { <2, 10, -3> color White } // mozliwy dowolny kolor swiatla b) Oświetlenie punktowe: light_source { <0, 10, -3> color White spotlight radius 15 falloff 20 tightness 10 point_at <0, 0, 0> } // rodzaj oswietlenia - punktowe // promien stozka swietlnego // miejsce padania swiatla c) Oświetlenie cylindryczne: light_source { <0, 10, -3> color White cylinder radius 15 falloff 20 tightness 10 point_at <0, 0, 0> } // rodzaj oswietlenia - punktowe // promien cylindra swietlnego d) Oświetlenie macierzowe: Oświetlenie to zdeterminowane jest przez dwa wektory, które określają płaszczyznę świecenia i wielkość macierzy, następnie występują dwa parametry liczbowe, które determinują liczbę żarówek. light_source { <2, 10, -3> color White area_light <5, 0, 0>, <0, 0, 5>, 5, 5 // wektory oświetlenia i liczba // zarowek w macierzy, tu 5 na 5, czyli 25 zarowek adaptive 1 jitter } Uwaga: w ramach jednej sceny można dodawać jednocześnie kilka źródeł światła. Na koniec, stosując obiekty CSG, wyrenderujmy klucz podobny do poniższego. Własne udoskonalenia będą mile widziane. Więcej informacji można znaleźć w dokumentacji PovRaya: http://www.povray.org/documentation/3.7.0/t2_2.html#t2_2_3_1