Eksplozja w POV-Ray

Efekty takie jak chmury, pyły, płomienie czy eksplozje osiąga się w programach do modelowana w 3D za pomocą systemów cząstek. System cząstek to nic innego jak narzędzie za pomocą którego możemy wygenerować olbrzymią ilość bardzo małych elementów, opisać ich właściwości oraz wzajemne położenie. Ten tutorial będzie traktował jak wykorzystać to narzędzie w POVRayu.  Tutaj za system cząstek odpowiada sekcja media którą wstawiamy do wnętrza obiekty czyli elementu interior. Ale po kolei, najpierw utwórzmy pusta scenę z oświetleniem, kamera i tłem w pliku eksplozja.pov:

#include "colors.inc"

global_settings
{
assumed_gamma 1
}

light_source
{
<0,15,0>
color rgb 1
}

background{rgb<0.3,0.4,0.6>}

camera
{
location<15,0,5>
look_at<0,0,0>
}

Nasz system cząstek musi sie znajdować wewnątrz jakiegoś obiektu, dla eksplozji najodpowiedniejsza będzie kula. Kolor kuli ustawmy na przezroczysty za pomocą instrukcji pigment{color rgbt 1}. Jest to skrót od instrukcji rgbt<1,1,1,1>, gdzie oprócz składowych kolorów, znajduje się jeszcze jedna składowa odpowiedzialna za stopień przeźroczystości. Wartość 1 oznacza że kula będzie całkowicie przezroczysta, toteż po wyrenderowaniu nie zobaczymy na razie żadnego efektu.

sphere
{
<0,0,0>
8
pigment {rgbt <1,1,1,1>}
}

Ponieważ chcemy niezależnie od powierzchni opisać wnętrze kuli wnętrze kuli, u żyjemy sekcji interior a konkretnie hollow interior co można przetłumaczyć jako puste wnętrze. No i faktycznie nasze wnętrze będzie na razie puste. Nasza eksplozja potrzebuje systemu cząstek, pora więc na sekcję media. Użyjmy poniższego kodu i zobaczmy jak wygląda nasz wybuch.

sphere
{
<0,0,0>
8
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
emission 1.6
density
{
spherical density_map
{
[0 rgb < 0,0,0 >]
[0.4 rgb < 1,0.0,0 > ]
[0.6 rgb < 0.1,0.6,0 > ]
[1 rgb < 0.8,0.8,0 > ]
}
}
}
}
}

eksplozja

Oczywiście to dopiero zalążek, nasza eksplozja będzie bardziej skomplikowana. Wytłumaczmy jednak najpierw powyższy kod. Pierwszą instrukcja wewnątrz sekcji media jest rodzaj cząsteczek. POVRay daje nam do wyboru: emission – emisje, absorption – pochłanianie, scattering – rozpraszanie. Do zrobienia eksplozji użyjemy typu emisson, który używany jest do wszystkich świecących obiektów takich jak iskra, płomień, piorun czy wybuch. Liczba obok emission mówi nam jak mocno świecić będą nasze cząsteczki. Następnie pojawia sie sekcja density czyli gęstość. Następnie mamy wzorzec rozkładu gęstości cząstek. POVRay pozawala tu wstawić większość wzorców wykorzystywanych do budowy tekstur jak np. bozo. My jednak w tym tutorialu zajmiemy się wzorcami, których największa przydatność odnosi sie właśnie do gęstości cząstek. Wzorzec spherical oznacza że gęstość cząstek będzie się zwiększała wraz ze zbliżaniem się do środka kuli. Oprócz tego POVRay udostępnia analogiczne do opisanego wzory: cylindrical, planer, boxed. Za nazwą wzorca umieściliśmy mapę gęstości, która ma bardzo podobne znaczenie jak mapa kolorów przy definiowaniu pigmentów. A wiec pierwsze liczby w każdym wierszu to zakres od 0 do 1 a następnie kolor przypisany do tego zakresu. Dla wzorca spherical 0 oznacza powierzchnię kuli natomiast 1 jej środek. Trzeba tu zwrócić uwagę że w przypadku opcji emission POVRray trochę inaczej interpretuje jasność koloru. Mianowicie, jasność odpowiada w tym wypadku z intensywność świecenia. Jest to zresztą dość logiczne trudno żeby np. dla koloru <0,0,0> cząsteczki świeciły na czarno. Kolor <0,0,0> oznacza, że cząstki w ogóle nie świeca a więc są niewidoczne. I taki właśnie kolor stosuje sie dla zera jeżeli chcemy uzyskać nierówną powierzchnię zewnętrzną obiektu media, w innym przypadku nasze nierówności były by „ucinane” przez powierzchnię sfery ograniczającej. Pozostałe kolory nie wymagają chyba komentarza na zewnątrz czerwony a w środku żółty. Aby nasza eksplozja wyglądała bardziej realistycznie dodajmy parametr turbulence, który wprowadzi nam trochę zamieszania do rozkładu cząstek.

sphere
{
<0,0,0>
8
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
emission 1.6
density
{
spherical density_map
{
[0 rgb < 0,0,0 >]
[0.4 rgb < 1,0.0,0 > ]
[0.6 rgb < 0.1,0.6,0 > ]
[1 rgb < 0.8,0.8,0 > ]
}
turbulence 0.4
}
}
}
}

eksplozja

Za chwilę zajmiemy się animowaniem naszej eksplozji, wprowadźmy jednak najpierw jeszcze jeden element a mianowicie dym. Aby to zrobić, zakomentujmy na chwilę nasz wybuch i dodajmy analogiczną kule zmieniając jednak parametr emisssion na absorption, w końcu dym nie świeci natomiast gesty dym jaki tworzy wybuch pochłania sporą ilość światła. Ustawmy większy promień kuli aby eksplozja znajdowała sie wewnątrz dymu, oraz ustawmy odpowiednie kolory. Dla absorption z kolorami trzeba obchodzić się dość ostrożnie, ponieważ zdefiniowane przez nas kolory to te które będą pochłaniane przez cząsteczki. Dlatego tez na ekranie zobaczymy kolory zupełnie przeciwne, swoistego rodzaju negatyw. Zwiększmy też parametr turbulence aby nasz dym był bardziej postrzępiony.

sphere
{
<0,0,0>
14
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
absorption 1.6
density
{
spherical density_map
{
[0 rgb <0,0,0>]
[0.8 rgb <1,1.1,1>]
[0.9 rgb <0.8,0.8,1>]
[0.95 rgb <0.6,0.4,1>]
[1 rgb <0.8,0.7,1>]
}
turbulence 0.6
}
}
}
}

eksplozja

Przejdźmy do animowania wybuchy i utwórzmy typowy plik animacji animacja.ini.

Initial_Frame=1
Final_Frame=20
Initial_clock=0
Input_File_Name=eksplozja.pov

Najpierw zajmiemy się efektem rozszerzalności. Dla uzyskania ciekawego efektu ustalmy, że dym będzie sie rozszerzał szybciej niż eksplozja. W POVRay do opisania zmian w czasie służy zmienna clock, która standardowo na przedziale całej animacji rośnie liniowo od 0 do 1. Dołuzmy do naszego kodu odpowiednio dwie linijki służące do skalowania pierwsze dla eksplozji, druga dla dymu.

scale 6*sin(clock/2*pi/2)
scale 12*sin(clock/2*pi/2)-1

Następnie zajmiemy się intensywnością eksplozji, uzależniając od czasu parametr emission. Nasz wzór sprawi, że eksplozja będzie słabnąć aż do połowy animacji, gdzie zaniknie zupełnie. Parametr emisson W POVRay nie może być ujemny więc zastosujemy instrukcje #if, która spowoduje, że kod eksplozji będzie analizowany tylko dla pierwszej połowy animacji.

#if(clock<0.5)
sphere
{
<0,0,0>
8
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
emission 1.6-3.2*clock
density
{
spherical density_map
{
[0 rgb < 0,0,0 >]
[0.4 rgb < 1,0.0,0 > ]
[0.6 rgb < 0.1,0.6,0 > ]
[1 rgb < 0.8,0.8,0 > ]
}
scale 6*sin(clock/2*pi/2)

}
}
}
}

Podobnie zrobimy z dymem. Wybuch będzie prezentował sie najlepiej, gdy z początku animacji dym nie będzie występował, maksymalna intensywność osiągnie dla środka a następnie powoli rozpłynie się w powietrzu. Taki elekt otrzymamy przy użyciu funkcji abs() czyli wartości bezwzględnej. Dla emission zmiana była liniowa tu taj ciekawsze efekty da odpowiednio zmodyfikowana funkcja cos().

sphere
{
<0,0,0>
14
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
absorption 1.6*(1-abs(cos(pi*clock)))
density
{
spherical density_map
{
[0 rgb <0,0,0>]
[0.8 rgb <1,1.1,1>]
[0.9 rgb <0.8,0.8,1>]
[0.95 rgb <0.6,0.4,1>]
[1 rgb <0.8,0.7,1>]
}
turbulence 0.6+0.8*sin((pi/2+pi/9)*clock)
scale 12*sin(clock/2*pi/2)-1
}
}
}

Kończąc ten tutorial wprowadzimy modyfikacje, która sprawi że wybuch będzie dużo bardziej realistyczny. Chodzi tu o zmianę zaburzeń gęstości cząstek w czasie. Dzięki temu eksplozja będzie sprawiała wrażenie bardziej dynamicznej. Efekt ten osiągniemy uzależniając od czasu parametr turbulence oraz wprowadzając obroty. Zarówno eksplozja jak i dym nie powinny zmieniać swoich zaburzeń w sposób liniowy. Aby osiągnąć wartości tylko z określonego przedziału użyjemy ograniczonej i okresowej funkcji sinus. Dzięki odpowiedniemu doborowi kątów modyfikacje będą sprawiały wrażenie losowych.Jeżeli POVRay nie będzie chciał wyświetlić obu elementów w tej samej pozycji rozsuńmy je delikatnie za pomocą translate. A oto eksplozja w całej okazałości, wystarczy tylko uruchomić plik animacji.

#include "colors.inc"

global_settings
{
assumed_gamma 1
}

light_source
{
<0,15,0>
color rgb 1
}

background{rgb<0.3,0.4,0.6>}

camera
{
location<15,0,5>
look_at<0,0,0>
}

sphere
{
<0,0,0>
14
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
absorption 1.6*(1-abs(cos(pi*clock)))
density
{
spherical density_map
{
[0 rgb <0,0,0>]
[0.8 rgb <1,1.1,1>]
[0.9 rgb <0.8,0.8,1>]
[0.95 rgb <0.6,0.4,1>]
[1 rgb <0.8,0.7,1>]
}
turbulence 0.6+0.8*sin((pi/2+pi/9)*clock)
scale 12*sin(clock/2*pi/2)-1
}
}
}
rotate<355*sin(clock*(pi/11+pi/2)),108*sin(clock*(pi/17+pi/3)),10*sin(clock*(pi/9+pi/2))>
translate<0,0,0>
}

#if(clock<0.5)
sphere
{
<0,0,0>
8
pigment {rgbt <1,1,1,1>}
hollow
interior
{
media
{
emission 1.6-3.2*clock
density
{
spherical density_map
{
[0 rgb < 0,0,0 >]
[0.4 rgb < 1,0.0,0 > ]
[0.6 rgb < 0.1,0.6,0 > ]
[1 rgb < 0.8,0.8,0 > ]
}
turbulence 0.4+0.2*sin((pi/2+pi/9)*clock)
scale 6*sin(clock/2*pi/2)
}
}
}
rotate<45*sin(clock*(pi/9+pi/2)),93*sin(clock*(pi/13+pi/3)),10*sin(clock*(pi/9+pi/2))>
translate <0,0.1,0>
}
#end

Na tej klatce eksplozja prezentuje sie wyśmienicie:

eksplozja

Natomiast cała gotowa animacja znajduje się tutaj:

povray eksplozja

Następne tutoriale wkrótce.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: