Nie przypuszczałem, że na stare lata zacznę robić karierę w branży filmowej... a jednak! I choć żona nie daje mi szans w Hollywood, mam zaszczyt zaprezentować mój pierwszy, niemy film - 30 sekundowy obraz, pt.: "Paprotka", mam nadzieję, że się będzie podobał!
Kombinowałem od jakiegoś czasu jak tu w najprostszy sposób, z fraktalami, przejść od "statycznej" grafiki, do "dynamicznej" akcji... Wreszcie coś tam się udało wykombinować - rozwiązanie nie jest idealne, jeszcze jest dość niedopracowane, ale na zrobienie pierwszego filmiku wystarczyło :) Pomysł polega na małej modyfikacji metody rysującej fraktal - wartości skalowania grafiki przekazywane są jako parametr wywołania, to pozwala wykorzystać metodę do wielokrotnego wykonania - tworzenia klatek filmu, dla minimalnych zmian w skalowaniu wykresu funkcji. Do tego dodajmy metodę obliczającą skalowanie dla kolejnych klatek:
public double[] getParams(int i)
{
// start - od takiej skali zaczynamy
double[] a = {-3,0,3,10};
// 12 klatek/s * 30 sek
int iter = 12 * 30;
// stop - na takiej skali kończymy
double[] b = {-0.1,5,0.1,5.5};
// aktualne skalowanie
double[] res = {0,0,0,0};
// wyliczamy skalowanie dla aktualnej klatki
if(i <= iter) {
res[0] = a[0] - (((a[0]-b[0])/iter) * i);
res[1] = a[1] - (((a[1]-b[1])/iter) * i);
res[2] = a[2] - (((a[2]-b[2])/iter) * i);
res[3] = a[3] - (((a[3]-b[3])/iter) * i);
}
else res = null;
return res;
}
i pętlę główną tworzącą kolejne klatki filmu:
int i = 0;
// jeżeli ciągle mamy jakieś klatki do narysowania, to pobierz skalowanie dla danej klatki i...
while((params = f.getParams(i+1)) != null) {
// wylicz fraktal
BufferedImage image = f.draw(params);
// zapisz klatkę
zapisz(image, outfilename + "-" + i++);
// info o zapisanej klatce
System.out.print( ".");
}
w wyniku otrzymamy mnóstwo plików graficznych - klatek filmu, teraz wystarczy je tylko "połączyć" w film wykorzystując np. avconv:
avconv -r 12 -i klatka-%d.png -b:v 1000K film.mp4
i można wrzucać na youtube! :)
Dla zainteresowanych, pełne kody dostępna są na javaforge: http://www.javaforge.com/scm/dir/268686/trunk/trunk/open
Strona mojego projektu związanego z fraktalami: http://luka.sh/projekty/fraktale
Wykorzystany w filmie fraktal, paprotkę, można "spotkać" również na: http://luka.sh/fraktale/f06