Hlavní navigace

Praktické ukázky možností aplikace Mandelbulber při tvorbě 3D fraktálů

Pavel Tišnovský

Ve druhém článku o aplikaci Mandelbulber si ukážeme některé další možnosti tohoto pravděpodobně nejpropracovanějšího nástroje určeného pro vykreslování trojrozměrných fraktálů i jejich animací.

Doba čtení: 28 minut

Sdílet

11. Tvorba animací

12. Animace založená na klíčových snímcích (keyframes)

13. Animace postupných změn dalších parametrů fraktálů

14. Převod jednotlivých snímků do souboru s animací

15. Vykreslení fraktálu typu Mandelbox v rovině (vylepšený příklad)

16. Repositář s demonstračními příklady

17. Literatura

18. Odkazy na Internetu

1. Praktické ukázky možností aplikace Mandelbulber při tvorbě 3D fraktálů

Na úvodní článek o aplikaci Mandelbulber navážeme článkem dnešním, v němž si popíšeme některé praktické způsoby použití této aplikace, a to jak při renderingu statických obrázků s trojrozměrnými fraktály, tak i při tvorbě jednoduchých animací, v nichž se mění jak pohled na fraktál, tak i popř. některé jeho parametry. Na rozdíl od předchozího článku, který byl v úvodní části pojat více teoreticky, se dnes zaměříme na ukázky grafického uživatelského rozhraní Mandelbulberu i na způsob jeho použití (zejména tvorba animací může být zpočátku poněkud matoucí).

Obrázek 1: Základní rozložení okna s grafickým uživatelským rozhraním programu Mandelbulber.

Nejprve si však vysvětlíme, jakými prostředky se vůbec trojrozměrné modely fraktálů vykreslují, protože vlastní algoritmy vykreslování se zcela odlišují od algoritmů, které známe z klasických dvourozměrných fraktálů, ať již se jedná o fraktály vykreslované v komplexní rovině, L-systémy či o systémy iterovaných funkcí (IFS). Problematika trojrozměrných fraktálů je v tomto ohledu poměrně rozsáhlá a navíc se ještě postupně vyvíjí, neboť vlastnosti 3D fraktálů jsou značně odlišné od běžných „spojitých“ trojrozměrných těles, s nimiž se běžně v počítačové grafice setkáváme.

Obrázek 2: Běžný fraktál vykreslený v komplexní rovině.

2. Algoritmy použité při vykreslování trojrozměrných scén s fraktály a multifraktály

Při vykreslování trojrozměrných fraktálů lze použít hned několik technik, které se od sebe liší kvalitou výsledku, rychlostí (resp. spíše pomalostí) vykreslování a taktéž nabídkou či naopak absencí dalších možností, například vytvoření řezu fraktálem, aplikací Booleovských operací na dvojici či trojici těles atd. atd. Dnes si popíšeme zejména metodu nazvanou integrace (barvy, průhlednosti) podél paprsku a samozřejmě i klasické renderovací metody raycastingu a raytracingu. Již na tomto místě je vhodné poznamenat, že Mandelbulber sice obě metody dokáže využít, ovšem navíc nabízí uživatelům i velké množství dalších voleb ovlivňujících vykreslování. O některých těchto volbách se zmíníme v dalším textu.

Obrázek 3: Další fraktál vykreslený v komplexní rovině.

3. Integrace podél paprsku

První důležitou a relativně často používanou metodou je metoda nazvaná integrace podél paprsku. Jedná se o v principu vlastně velmi jednoduše pochopitelnou metodu vycházející z rastrové objemové reprezentace prostorových objektů. Tento způsob reprezentace těles vznikl jednoduchým a přímočarým rozšířením dvourozměrných rastrových obrazů (bitmap resp. pixmap) do třech rozměrů. Část trojrozměrného prostoru je rozdělena na množství pravidelných elementárních objemových jednotek, které se nazývají voxely. Termín voxel přitom vznikl zkrácením anglického termínu Volume Element. Svou (na první pohled nelogickou) zkratkou – písmeno X ve slovním základu – ukazuje na svou podobnost s pixelem, což je zkratka termínu Picture Element. Původně spojitý trojrozměrný prostor se tedy diskretizuje na jednotlivé mikroobjemy, podobně jako je tomu v případě bitmap a pixmap u dvourozměrných obrazů, kde je původně spojitá plocha rozdělena na dále nedělitelné plošky (pixely).

Poznámka: důležité upozornění – většina obrázků vykreslených touto metodou není „fotorealistická“, což ovšem v mnoha oborech vůbec nevadí, spíše naopak.

Obrázek 4: Výsledek simulace vykreslený metodou integrace podél paprsku.

Pro účely zde popisovaných algoritmů můžeme za voxely poněkud nepřesně považovat osově orientované krychličky nebo kvádry, ve skutečnosti se však jedná o pouhé navzorkované bezrozměrné body, stejně jako pixely. V základní podobě, kdy potřebujeme pouze vyjádřit, zda daná část v prostoru náleží či nenáleží do tělesa, mohou voxely nabývat pouze dvou stavů – obsazeno, neobsazeno. Pro každý voxel tedy v tomto případě stačí zaznamenat pouze jeden bit, jehož hodnota signalizuje obsazenost či neobsazenost voxelu tělesem. Druhá možnost spočívá v záznamu počtu provedených iterací. To je právě případ zde popisované metody integrace podél paprsku. Jak tedy můžeme tuto metodu použít? Celý postup si můžeme shrnout do několika bodů:

  1. Nejprve je zapotřebí zvolit jednu dimenzi, která bude při vykreslování konstantní. Typicky se za konstantu volí poslední dimenze vztažená k jednotkovému vektoru k, není to však podmínkou (v Mandelbulberu je možné celým tělesem otočit, takže nejsme vázáni na osy souřadného systému).
  2. Vlastní vykreslování probíhá ve čtyřech do sebe vnořených smyčkách. V prvních třech vnějších smyčkách se postupně mění hodnoty čtyřrozměrné konstanty c=cx+cyi+czj+cwk. Postačují nám pouze tři smyčky, protože čtvrtá hodnota je zvolena v prvním bodu zpracování jako konstantní.
  3. Nejvnitřnější smyčka vykonává vlastní iterační výpočet. Výsledkem tohoto výpočtu je celočíselná hodnota říkající, kolik iterací bylo zapotřebí provést, aby se dosáhlo podmínky |z|>bailout. Pokud této podmínky nebylo dosaženo, tj. došlo k divergenci orbitu, je výsledkem nejvnitřnější smyčky hodnota odpovídající maximálnímu počtu iterací.
  4. Hodnota vrácená z iterační smyčky je vložena do trojrozměrného voxelového pole, které uchovává hustoty jednotlivých voxelů. Čím vyšší je uložená hodnota (vyšší počet iterací), tím větší je hustota v okolí daného voxelu.
  5. Výsledné zobrazení scény probíhá tak, že se zvolí souřadnice pozorovatele a promítací roviny. Posléze se od pozorovatele do scény vrhají paprsky (podobně jako u raytracingu popsaného v navazující kapitole). Na rozdíl od raytracingu se však nehledá průsečík s nějakým povrchem, ale sčítají se hustoty voxelů, které paprsek protne při svém průletu scénou. Rychlým algoritmem výpočtu průsečíků paprsku s voxely je například algoritmus DDA či Bresenhamův algoritmus pro 3D úsečku. Existují však i vylepšené metody, které dokážou spočítat délku paprsku při průletu jednotlivými voxel a výsledek je váhován touto (normalizovanou) délkou.
  6. Na základě vypočtené sumy hustot je obarven příslušný pixel na obrazovce. Výsledkem je tedy obrázek podobný rentgenovému či ultrazvukovému snímku. Předností tohoto postupu je, že se zobrazí i odlehlé části fraktálního objektu, nevýhodou pak fakt, že není zvýrazněn povrch a nelze zde použít klasické osvětlovací modely.

Nevýhodou tohoto postupu je fakt, že se vůbec nepočítají normály povrchu (žádný povrch se neuvažuje, pouze voxely s různou hustotou), takže není možné přímočaře použít osvětlovací modely.

Obrázek 5: Tepelné proudění, opět vykresleno metodou integrace podél paprsku.

4. Raytracing či raycasting

Mnohem častěji používanou vykreslovací metodou, která je sice mnohem pomalejší, ale vede ke kvalitnějším výsledkům, je metoda nazvaná raycasting popř. její jednodušší varianta pojmenovaná raycasting.

Raycasting neboli vrhání paprsků je často užívanou metodou pro vykreslení prostorových scén v případě, kdy nemáme k dispozici hardwarový akcelerátor nebo je scéna složená z těles, která se složitě převádí na polygony (může se jednat o implicitní plochy, uložení objemu ve formě voxelů atd.). Nejčastěji se můžeme s raycastingem setkat v různých programech typu CAD, které důsledně využívají CSG (Constructive Solid Geometry), neboli konstruktivní geometrii těles, což je způsob vytváření složitějších těles pomocí jednoduchých základních trojrozměrných tvarů (typicky koule, kužele, válce, toroidu a roviny/poloprostoru), které jsou navzájem kombinovány pomocí operací sjednocení, průniku a rozdílu.

Princip metody raycastingu je poměrně jednoduchý: představme si pozorovatele, který stojí před stínítkem představovaným plochou (rastrového) displeje, za kterým je umístěna celá sledovaná scéna, včetně světelných zdrojů. Jakým způsobem je možné scénu vykreslit tak, aby se zobrazila na stínítku ve formě různě obarvených pixelů? Způsobů je samozřejmě více, ovšem raycasting je postavený na jednoduché myšlence. Z pozice pozorovatele budeme do scény vysílat pomyslné paprsky a zjišťovat, která tělesa tyto paprsky protnou.

Pokud nebudeme brát v úvahu průhlednost těles, bude nás zajímat ten průsečík, který se nachází nejblíže k pozorovateli, protože ostatní průsečíky nejsou z jeho pozice viditelné (jsou skryté dalšími tělesy). Kolik paprsků se však má vysílat a jakým směrem? Základním principem (ne nutně s nejkvalitnějšími výsledky) je vyslat jeden paprsek pro každý pixel displeje, čímž je automaticky určen i jeho směr. Ovšem jsou možné i jiné způsoby, kterými se nyní nebudeme zabývat, abychom se nevěnovali nyní nepodstatným detailům.

Obrázek 6: Termín „fotorealistická grafika“ nevznikl náhodou…

Po výpočtu průsečíku paprsku s nejbližším povrchem je ještě nutné provést výpočet světelných poměrů v místě průsečíku. Vytvoří se tedy další pomyslné paprsky, které směřují k jednotlivým světelným zdrojům a zjišťuje se odchylka těchto paprsků od normálového vektoru popř. od odraženého paprsku (tvorba odlesků – „prasátek“). Také se zjišťuje, zda jsou vůbec světelné zdroje z daného místa viditelné, čímž se ve vykreslované scéně automaticky vytváří stíny. Může samozřejmě nastat situace, že primární paprsek neprotne žádné těleso – v tomto případě je příslušný pixel obarven nastavenou barvou pozadí.

Ukažme si na jednoduchém příkladu, jak výpočet průsečíku probíhá. Předpokládejme, že se ve scéně nachází jedna koule popsaná rovnicí:
(x-x0)2+(y-y0)2+(z-z0)2-r2=0
kde [x0, y0, z0] je souřadnice středu koule a r je její poloměr.

Výpočet průsečíku paprsku s koulí je poměrně snadný, což mimochodem výrazně urychlí všechny výpočty a tím i dobu zobrazování scény (proto byly obrázky s koulemi při prezentaci možností raytracingu velmi často používány). Pro zjištění, zda paprsek protíná kouli je potřeba zjistit přesnou pozici průsečíku paprsku s jejím povrchem. V rovnici paprsku:

R(t)=A+tq

musíme pro zadané hodnoty A (pozice pozorovatele) a q (směr paprsku) zjistit hodnotu parametru t. Bude-li hodnota kladná, je povrch viditelný (před kamerou/pozorovatelem). Bude-li hodnota záporná, je povrch neviditelný (za kamerou). Přesnou hodnotu parametru t zjistíme dosazením rovnice paprsku do rovnice popisující kouli. Ve skutečnosti se může stát, že nám vyjdou dvě hodnoty t, popř. jedna hodnota (dvojitý kořen) či rovnice nebude mít reálné kořeny. To je v pořádku, neboť to odpovídá možným vzájemným postavením paprsku a koule:
  1. dva kořeny – paprsek kouli protíná, samozřejmě ve dvou místech
  2. jeden kořen – paprsek se koule pouze dotkl, tj. je tečný k povrchu
  3. žádný reálný kořen – paprsek kouli zcela minul

Velkým problémem zůstává potažení koule či jiného obecného tvaru texturou. Pro běžná tělesa se používá promítání textury z vhodně zvoleného tělesa. U koule není zcela zřejmé, které promítací těleso se má použít. Kvůli topologicky „nekompatibilnímu“ tvaru povrchu koule s tvarem plošné textury je však zřejmé, že textura bude nanesena s velkou chybou, především na vzniklých pólech. Tento problém nastává pouze u dvoudimenzionálních textur nanášených na povrch tělesa. U třídimenzionálních textur tento problém není zřetelný, což je jeden z důvodů, proč se například v POV-Rayi často pracuje s třídimenzionálními procedurálními texturami (v Mandelbulberu jsou použity oba typy textur).

Obrázek 7: Odlesky na kovu a skleněné povrchy byly vždy doménou raytracerů.

Raytracing, neboli zpětné sledování paprsku vznikl jednoduchým a přitom z hlediska vizuálních výsledků významným rozšířením předchozí metody. Sledování paprsku vrhaného od pozorovatele do scény totiž nekončí už po nalezení průsečíku s nejbližším tělesem, ale pokračuje sledováním dalších paprsků, odvozených podle odrazivosti a průhlednosti (přesněji řečeno lomových vlastností) nalezeného tělesa. Na barvě tělesa se tedy podílejí světelné příspěvky vypočtené s pomocí obecně většího počtu paprsků.

První test průsečíku (primárního) paprsku s plochou tělesa je proveden stejným způsobem jako u raycastingu. Jediný rozdíl spočívá v tom, že je po výpočtu průsečíku spočítán odraz a lom paprsku na povrchu tělesa a výpočet probíhá rekurzivně s dále vzniklými paprsky, které se nazývají sekundární paprsky. Hloubka rekurze musí být omezena, aby výpočet skončil v konečném čase. Pro reálné scény většinou postačí volit tři až čtyři odrazy. Už při této hloubce rekurze lze docílit fotorealistického zobrazení celé scény.

Při výpočtu světelných poměrů na povrchu tělesa potřebujeme znát orientaci normálového vektoru v místě průsečíku paprsku s povrchem. Problém potažení povrchu texturou je stejně složitý jako v metodě vrhání paprsku.

Zbývá dodat, proč se tato metoda česky nazývá zpětné sledování paprsku. Paprsek totiž vysíláme skutečně opačným směrem – od pozorovatele směrem do scény a zjišťujeme, z jakých světelných zdrojů mohl vzniknout. Tím se původně neprakticky složitá úloha (vysílání paprsků ze všech zdrojů všemi směry, ovšem jen velmi málo z nich dosáhne oka/kamery pozorovatele) stává výpočetně zvládnutelnou.

5. Fraktály bez spojitého povrchu versus klasický raytracing?

Výše zmíněné algoritmy raycastingu a raytracingu byly primárně vyvinuty pro ty trojrozměrné scény, v nichž jsou tělesa popsána nějakou implicitní funkcí, která by měla být v ideálním případě spojitá. Pouze při zajištění této podmínky je totiž možné zaručit, že bude možné vypočítat průnik paprsku s povrchem tělesa a navíc i určit normálový vektor v místě tohoto průniku. A znalost normálového vektoru je důležitá pro to, aby bylo možné vypočítat barvu plošky tělesa na základě nějakého osvětlovacího modelu (těch existuje větší množství typů, klasický osvětlovací model je založen na vyjádření světla na základě ambientní složky, difúzní složky a odlesků). Ovšem základní vlastností trojrozměrných fraktálů a multifraktálů je fakt, že jejich povrch vůbec spojitý není. Je tomu ve skutečnosti přesně naopak – na některých místech povrchu je zcela nespojitý, protože samotný povrch má větší dimenzi než 2.

Základní otázkou, kterou museli tvůrci programu Mandelbulber vyřešit je tedy určení, jakým způsobem se má reálný povrch fraktálu nahradit ve chvíli, kdy se počítá (renderuje) 3D scéna a jak vlastně určit průsečík paprsku s takovým složitým povrchem. Pro tento účel byly vyvinuty algoritmy nazvané Distance estimation (DE) a ray-matching.

Obrázek 8: Nástrojový pruh s výběrem typů fraktálů, které aplikace Mandelbulber dokáže vykreslit.

6. Distance estimation a algoritmus ray matchingu

Tyto metody se snaží zjistit průsečík paprsku s (mnohdy nekonečně komplikovaným) povrchem tak, že se na stopě paprsku tvoří pomyslné koule a zjišťuje se, zda tato koule protne alespoň určitou část prostoru či nikoli. Pokud k protnutí dojde, koule se zmenší a celý proces se iterativně opakuje. Nakonec se dojde do situace, kdy je koule dostatečně malá na to, aby se dalo prohlásit, že její průsečík s paprskem je současně i průsečíkem s „reálným“ povrchem fraktálu. Nevýhodou této metody je její časová náročnost a velká závislost na požadované přesnosti výpočtu.

Poznámka: v postarším manuálu k programu Mandelbulber je princip této metody naznačen na obrázcích na čtvrté straně

Obrázek 9: Tento fraktál (zobecněný trojrozměrný IFS) budeme používat v dalším textu.

7. Nastavení kamery při konfiguraci trojrozměrné scény

Při tvorbě jakýchkoli trojrozměrných scén je klíčovým prvkem správné nastavení kamery takovým způsobem, aby se dívala na zajímavou oblast 3D prostoru. Nastavení kamery lze samozřejmě provést i v programu Mandelbulber a to několika způsoby. Základem je následující nemodální dialog:

Obrázek 10: Dialog, ve kterém je možné nastavit všechny základní parametry kamery, kromě její ohniskové vzdálenosti.

Další možnost spočívá v použití myši, kterou je možné ukázat na zajímavou oblast ve scéně. Myš pracuje v několika různým režimech – posun kamery (beze změny její orientace v prostoru), otočení kamery či přiblížení popř. naopak vzdálení kamery od scény. Implicitní volbou je první režim, ovšem velmi snadno můžeme kameru zamířit na oblast zvýrazněnou mřížkou:

Obrázek 11: Interaktivní nastavení kamery na zajímavou oblast ve scéně s využitím myši. Mřížka naznačuje vypočtený povrch fraktálu.

Obrázek 12: Po kliknutí se fraktál přiblíží a jsou vidět jeho další detaily.

Obrázek 13: Další detaily soběpodobného IFS systému.

8. Vliv parametru „smoothness“ na vzhled vykreslovaného fraktálu

Na výsledný vzhled vykreslovaného fraktálu má velký vliv parametr „smoothness“, který ovlivňuje algoritmus DE a ray matchingu. Po vypočtení průsečíku paprsku s povrchem se totiž určuje normálový vektor, a to s využitím okolního povrchu (fraktál není reprezentován implicitní plochou, kde je výpočet analytický, takže se používá numerický výpočet):

Obrázek 14: Zvýrazněné vstupní pole, v němž se parametr „smoothness“ může měnit.

Čím vyšší je hodnota tohoto parametru, tím „zakulacenější“ bude povrch fraktálu, ovšem tím méně detailů bude zvýrazněno (můžeme si představit i 2D analogii tohoto parametru – rozmazání obrázku).

Obrázek 15: Parametr smoothness je nastavený na implicitní hodnotu 1.

Obrázek 16: Parametr smoothness je nastavený na implicitní hodnotu 16.

U dalších obrázků je výhodnější si je zobrazit v jejich původní velikosti, aby byly jednotlivé rozdíly dobře patrné:

Obrázek 17: Parametr smoothness je nastavený na implicitní hodnotu 1.

Obrázek 18: Parametr smoothness je nastavený na implicitní hodnotu 2.

Obrázek 19: Parametr smoothness je nastavený na implicitní hodnotu 4.

Obrázek 20: Parametr smoothness je nastavený na implicitní hodnotu 8.

Obrázek 21: Parametr smoothness je nastavený na implicitní hodnotu 0,625.

Poznámka: pro většinu scén je ideální tento parametr nastavit na hodnotu ležící v rozsahu 0,7 až zhruba 2,5.

9. Změna tvaru fraktálu při změně počtu iterací (IFS apod.)

Velký vliv na tvar a vzhled fraktálu má i změna počtu iterací, což se týká především zobecněných trojrozměrných systémů iterovaných funkcí (IFS). Čím menší je totiž počet iterací, tím menší počet bodů v 3D prostoru je vypočten a algoritmus konstrukce fraktálu tedy ideální geometrické body zvětší takovým způsobem, aby se z nich staly koule, které se překrývají. To znamená, že velký počet iterací zvýší počet bodů, které budou velmi malé a fraktál se začne podobat své ideální podobě:

Obrázek 22: Počet iterací je nastaven na hodnotu 6.

Obrázek 23: Počet iterací je nastaven na hodnotu 7.

Obrázek 24: Počet iterací je nastaven na hodnotu 8.

Obrázek 25: Počet iterací je nastaven na hodnotu 9.

Obrázek 26: Počet iterací je nastaven na hodnotu 10.

10. Editor materiálů

Zapomenout nesmíme na velmi důležitou součást aplikace Mandelbulber. Jedná se o editor materiálů. Vzhledem k tomu, že se díky rayracingu kombinovaného s metodami DE a ray matchingu při vykreslování vypočte i normálový vektor k povrchu fraktálu (jakkoli je to matematický nesmysl), je možné využít klasické osvětlovací modely a tím pádem i určovat ambientní, difúzní a odrazovou složku materiálu. Bližší informace o takto pojatých materiálech a osvětlovacím modelu jsme si vysvětlili v seriálu o raytraceru POVRay.

Poznámka: může být užitečné, že i parametry materiálu jsou „animovatelné“, tj. měnitelné v čase.

Obrázek 27: Základní materiál s několika (konkrétně šesti) gradientními barvovými přechody.

Obrázek 28: Materiál připomínající plast (velký vliv difúzní složky, málo odlesků).

Obrázek 29: Toto má být napodobenina bronzu (i když to tak zdálky nemusí vypadat).

Obrázek 30: Další materiál s několika gradientními barvovými přechody.

11. Tvorba animací

Již v úvodním článku o aplikaci Mandelbulber jsme si řekli, že kromě statických snímků je možné vytvářet i animace. Existují přitom dva způsoby tvorby animací. První z nich, který se jmenuje Flight Mode, spočívá v tom, že se myš použije pro okamžitou změnu souřadnic kamery, podobně jako v některých počítačových hrách při řízení letadla (FPS). Mandelbulber se v tomto případě snaží o rychlé (resp. většinou pouze „rychlé“) vygenerování snímků tak, aby vznikla plynulá animace. Ovšem výpočetní výkon současných strojů dostačuje pouze pro vyrendrování animací s velmi nízkým rozlišením, například jen 320×240 pixelů nebo dokonce pouze 160×120 pixelů.

Při zapnutí flight režimu se směr letu řídí posunem myši (bez tlačítek), ovšem kurzorovými šipkami je navíc možné posunovat vlastní pozici kamery. Levé a pravé tlačítko myši v tomto režimu slouží k urychlení popř. naopak ke zpomalení letu. Jiné parametry není možné změnit – jinými slovy se flight režimu používá skutečně pro animaci průletu okolo fraktálu nebo do jeho vnitřních struktur.

Poznámka: oba typy animací budou podrobněji popsány v závěrečné části článku o programu Mandelbulber.

12. Animace založená na klíčových snímcích (keyframes)

Druhý režim tvorby animací je již mnohem pokročilejší. Je založen na vytvoření takzvaných klíčových snímků (keyframes), mezi nimiž jsou automaticky dopočítány parametry mezisnímků, kterých může být libovolný počet (například třicet mezisnímků mezi každým klíčovým snímkem). Tento typ animací lze vytvářet velmi precizním způsobem, protože pozice kamery a její orientaci, stejně jako další parametry vykreslovaného fraktálu, je možné nastavit bez nutnosti sledovat neustále se překreslující snímky, jak je tomu ve flight režimu. Ve výchozím stavu se zaznamenává pozice a orientace kamery, tj. i tento typ animace se používá pro podobné účely jako režim flight. Takto byla vytvořena následující animace ze čtyř klíčových snímků:

Obrázek 31: Dialog s jednotlivými mezisnímky a jejich vlastnostmi.

13. Animace postupných změn dalších parametrů fraktálů

Ve skutečnosti je ovšem možné animaci vytvořit změnou prakticky jakéhokoli číselného parametru, ať již se jedná o nastavení rendereru nebo parametrů fraktálu. Nelze měnit, resp. nemá to význam, například typ fraktálu nebo ty parametry, které mají pouze předem známý počet stavů.

Poznámka: aby se změna parametru zaznamenala, je nutné kliknout pravým tlačítkem myši do textového vstupního políčka s daným parametrem a z kontextového menu zvolit položku Add to keyframe animation. V opačném případě se parametr (jeho změna) nebude měnit a tudíž ani animovat.

Obrázek 32: Animace IFS systému založená na pouhých dvou mezisnímcích, mezi nimiž se provádí lineární interpolace.

14. Převod jednotlivých snímků do souboru s animací

Mandelbulber při počítání animací tvoří jednotlivé snímky, které mohou být uloženy v několika různých rastrových formátech. Typicky se používají formáty JPEG nebo PNG. Tyto statické snímky je nutné složit do výsledné animace, k čemuž je možné použít hned několika různých nástrojů ovládaných jak z příkazové řádky, tak i z grafického uživatelského rozhraní. Mezi nejpoužívanější nástroje ovládané z CLI patří ffmpeg a mencoder.

Převod do formátu MPEG4 s využitím nástroje MEncoder (součást nástrojů MPlayeru):

mencoder mf://*.png -mf w=320:h=240:fps=10:type=png -ovc lavc \
    -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi

Použití nástroje ffmpeg:

ffmpeg -r 60 -f image2 -s 320x200 -i frame%04d.png -vcodec libx264 -crf 25  -pix_fmt yuv420p test.mp4

Výsledek je možné publikovat například na https://www.youtube.com/. Právě tímto způsobem budou prezentovány výsledky Mandelbulberu ve třetí a současně i poslední části tohoto článku.

15. Vykreslení fraktálu typu Mandelbox v rovině (vylepšený příklad)

Vzhledem k zaměření Rootu mj. i na programátory se v dnešním článku podíváme ještě na jednoduchý prográmek, který po svém překladu a spuštění vykreslí 2D fraktál typu Mandelbox, přičemž výsledný obrázek je reprezentován ve formátu PGM. Jednotlivé parametry fraktálu je pochopitelně možné změnit a prvním vylepšením pravděpodobně bude podpora pro barovou paletu:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 
#define WIDTH  400
#define HEIGHT 400
 
void writeImage(const int width, const int height, const unsigned char *image)
{
    int i;
    puts("P2");
    printf("%d %d\n", width, height);
    puts("255");
    for (i=0; i<width*height; i++) {
        printf("%d ", image[i]);
    }
}
 
void toLogarithmicScale(const int width, const int height,
                        unsigned char *pixels, const float *floatPixels, const float max)
{
    int i;
    for (i = 0; i < WIDTH*HEIGHT; i++) {
        if (floatPixels[i] == -1) {
            pixels[i] = 0x00;
        }
        else {
            int val = (int)(log(floatPixels[i])/log(max)*255);
            pixels[i] = val;
        }
    }
}
 
void calcMandelbox(const int width, const int height, float *floatPixels, const int maxiter, float *max)
{
    float cx, cy;
    float zx, zy;
    float magnitude, squared;
 
    int i, j, n;
 
    cy = -4.0;
    for (j = 0; j < height; j++) {
        cx = -4.0;
        for (i = 0; i < width; i++) {
            float zx = 0, zy = 0;
            for (n = 0; n < maxiter; n++) {
                if (zx>1.0) {
                    zx = 2.0-zx;
                }
                else if (zx<-1.0) {
                    zx = -2.0-zx;
                }
                if (zy>1.0) {
                    zy = 2.0-zy;
                }
                else if (zy<-1.0) {
                    zy = -2.0-zy;
                }
                float zx2 = zx * zx;
                float zy2 = zy * zy;
                squared = zx2 + zy2;
                magnitude = sqrt(squared);
                if (squared > 256.0) {
                    break;
                }
                if (magnitude < 0.5) {
                    zx = zx * 8.0 * magnitude;
                    zy = zy * 8.0 * magnitude;
                }
                else if (magnitude < 1.0) {
                    zx = zx * 2.0 / (magnitude*magnitude);
                    zy = zy * 2.0 / (magnitude*magnitude);
                }
                else {
                    zx = zx * 2.0 * magnitude;
                    zy = zy * 2.0 * magnitude;
                }
                zx += cx;
                zy += cy;
                zx2 = zx * zx;
                zy2 = zy * zy;
                squared = zx2 + zy2;
            }
            if (squared > *max) {
                *max = squared;
            }
            if (n == maxiter) {
                floatPixels[i+j*WIDTH] = squared;
            }
            else {
                floatPixels[i+j*WIDTH] = -1;
            }
            cx += 8.0 / WIDTH;
        }
        cy += 8.0 / HEIGHT;
    }
 
}
 
int main(int argc, char **argv)
{
    char pixels[WIDTH * HEIGHT];
    float floatPixels[WIDTH * HEIGHT];
    float max = 0;
 
    calcMandelbox(WIDTH, HEIGHT, floatPixels, 4, &max);
    toLogarithmicScale(WIDTH, HEIGHT, pixels, floatPixels, max);
    writeImage(WIDTH, HEIGHT, pixels);
 
    return 0;
}

Obrázek 33: Obrázek vykreslený předchozím příkladem při použití standardních parametrů.

Obrázek 34: Obrázek vykreslený předchozím příkladem při úpravě parametrů výpočtu.

16. Repositář s demonstračními příklady

Zdrojové kódy dvoudimenzionálních variant fraktálů typu MandelBox a MandelBulb naprogramované v jazyce C byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/frac­tals.git (stále na GitHubu :-). V případě, že nebudete chtít klonovat celý repositář (ten je ovšem – alespoň prozatím – velmi malý, můžete namísto toho použít odkazy na jednotlivé příklady, které naleznete v následující tabulce:

# Příklad Popis příkladu Cesta
1 mandelbox.c 2D varianta fraktálu typu MandelBox https://github.com/tisnik/frac­tals/blob/master/3d_fractal­s/mandelbox.c
2 mandelbox2.c vylepšení předchozího příkladu https://github.com/tisnik/frac­tals/blob/master/3d_fractal­s/mandelbox2.c
3 mandelbox3.c předchozí příklad, ovšem s odlišnými parametry https://github.com/tisnik/frac­tals/blob/master/3d_fractal­s/mandelbox3.c
4 mandelbulb_2d.c 2D varianta fraktálu typu MandelBulb https://github.com/tisnik/frac­tals/blob/master/3d_fractal­s/mandelbulb_2d.c
5 mandelbulb_anim.c vytvoření animace fraktálu typu MandelBulb https://github.com/tisnik/frac­tals/blob/master/3d_fractal­s/mandelbulb_anim.c

17. Literatura

Klasické knihy i vybrané články o fraktálech:

  1. Barnsley Michael: „Fractals Everywhere“,
    Academic Press Inc., 1988, ISBN 0–12–079062–9
  2. Barnsley Michael, Devaney R. L., Mandelbrot Benoit B., Peitgenn Heinz-Otto, Saupe Dietmar, Voss Richard: „The Science of Fractal Images“,
    Springer-Verlag, New York, 1988
  3. Barnsley Michael, Hurd Lyman P.: „Fractal Image Compression“,
    A. K. Peters, 1993
  4. Bowman Richard L.: „Fractal Metamorfosis: A Brief Student Tutorial“
    Computer and Graphics, 19, strany 157–164, 1995
  5. Bulín Jan: „Vykreslování výškových map“,
    Ročníkový projekt, VUT Brno, FEI, 1998
  6. Cahalan R. F. a Joseph J. H.: „Fractal statistics of cloud fields“,
    Mon. Wea.Rev. 117, 261–272, 1989
  7. Cahalan R. F., W. Ridgway, W. J. Wiscombe, T. L. Bell and J. B. Snider: „The albedo of fractal stratocumulus clouds“,
    Atmos. Sci. 51, 2434–2455, 1994
  8. Devaney Robert L.: „A First Course In Chaotic Dynamical Systems“,
    Addison-Wesley, Reading, MA, 1992
  9. Dewdney A. K: „Computer Recreations“,
    časopis Scientific American
  10. Douady, A., Hubbard, J.: „Itération des polynomes quadratiques complexes“,
    C. R. Acad. Sci., Paris 1982
  11. Etienne Martineau: „On a Bicomplex Distance Estimation for the Tetrabrot“
    June, 2004
  12. Ewing, J. H., Schober, G.: „The area of the Mandelbrot Set“,
    Numer. Math. 1992
  13. Fischer Yuval (editor): „Fractal Image Compression: Theory and Application“,
    Springer-Verlag, New York, 1995
  14. Gleick James: „Chaos: Making a New Science“,
    Viking Press, Penguin, New York, 1987
  15. Gleick James: „Chaos: Vznik nové vědy“ (český překlad předchozí knihy),
    Ando Publishing, Brno, 1996
  16. Gröller Eduard: „Interactive design of Nonlinear Functions for Iterated Function System“,
    Technical University Vienna, 1995
  17. Hill, F. S. jr.: „Computer Graphics using OpenGL“,
    Prentice Hall, 2001
  18. Hook Brian: „An Introduction to Fixed Point Math“,
    Game Design and Review, 2003
  19. Lauwerier Hans: „Fractals“,
    Princeton University Press, 1991
  20. Makovský Dušan: „Stochastické fraktály“,
    Diplomová práce, VUT FIT Brno, 2003
  21. Mandelbrot Benoit B.: „The Fractal Geometry of Nature“,
    W. H. Freeman, New York; San Francisco, 1982, ISBN 0–7167–1186–9
  22. Mandelbrot Benoit B.: „Fractal Landscapes without creases and with rivers“,
    The Science of Fractal Images, ed. Heinz-Otto Peitgen, Dietmar Saupe; Springer-Verlag (1988) pp 243–260
  23. Peitgen Heinz-Otto, D. Saupe: „The Science of Fractal Images“,
    Springer-Velag, 1988
  24. Peitgen Heinz-Otto, Jurgens Hartmut, Saupe Dietmar: „Fractals For The Classroom“,
    Springer-Verlag, New York, 1988
  25. Peitgen Heinz-Otto, Richter Peter: „The Beauty of Fractals“,
    Springer-Verlag, New York, 1986, ISBN 0–387–15851–0
  26. Peitgen Heinz-Otto, Jurgens Hartmut, Saupe Dietmar: „Chaos and Fractals: New Frontiers of Science“,
    Springer-Verlag, New York, 1992
  27. Perlin K. and Hoffert E. M.: „Hypertexture“,
    Computer graphics, Volume 23, Number 3, July 1989, pages 253–262
  28. Perlin Ken: „An Image Synthesizer“,
    Computer Graphics, Volume 19, Number 3, 1985, pages 287–296
  29. Pickover Clifford: „Computers, Pattern, Chaos and Beauty: Graphics from an Unseen World“,
    St. Martin's Press, New York, 1990
  30. Pickover Clifford: „Chaos in Wonderland“,
    ISBN 0–312–10743–9 St. Martin's Press
  31. Pritchard Joe: „The Chaos Cookbook: A Practical Programming Guide“,
    Butterworth-Heinemann, Oxford, 1992, ISBN 0–7506–0304–6
  32. Prusinkiewicz Przemyslaw and Hanan James: „Lindenmayer Systems, Fractals, and Plants“,
    Springer-Verlag, New York, 1989.
  33. Prusinkiewicz Przemyslaw and Lindenmayer Aristid: „The Algorithmic Beauty of Plants“,
    Springer-Verlag, NY, 1990. ISBN 0–387–97297–8
  34. Sharman, J: „How to render landscapes“
  35. Silverman B. W.: „Density Estimation for Statistics and Data Analysis“,
    Chapman and Hall, London, 1986.
  36. Tišnovský Pavel: „Návrh editoru IFS“,
    Vysoké učení technické v Brně, Fakulta elektrotechniky a informatiky, 1998
  37. Tišnovský Pavel: „Interaktivní editor afinních transformací“,
    Vysoké učení technické v Brně, Fakulta elektrotechniky a informatiky, 1999
  38. Tišnovský Pavel: „Výpočet plochy Mandelbrotovy množiny metodou součtu pixelů“,
    Elektrorevue, 2001
  39. Tišnovský Pavel: „Fraktály: dynamické systémy v komplexní rovině“,
    Elektrorevue, 2001
  40. Tumblin Jack, Holly Rushmeier: „Tone Reproduction for Realistic Images“,
    IEEE Computer Graphics and Applications, November/December 1993 (Vol. 13, No. 6) pp. 42–48.
  41. Weber J., Penn J.: „Creation and Rendering of Realistic Trees“,
    Proceedings of SIGGRAPH '95, volume 22(4), ACM SIGGRAPH, New York, 1995
  42. Wegner Timothy, Peterson Mark: „Fractal Creations, First Edition“,
    The Waite Group Press, 1991
  43. Wegner Timothy, Tyler Bert: „Fractal Creations, Second Edition“,
    The Waite Group Press, 1993
  44. Wegner Timothy, Tyler Bert, Peterson Mark, Branderhorst Pierer: „Fractals for Windows“,
    The Waite Group Press, 1992
  45. Yates Randy: „Fixed-Point Arithmetic: An Introduction“
  46. Žára J., Beneš B., Felkel P.: „Moderní počítačová grafika“,
    Computer Press, Praha, 1998, ISBN 80–7226–049–9
  47. Žára J., Limpouch A., Beneš B., Werner T.: „Počítačová grafika – principy a algoritmy“,
    Grada, 1992

18. Odkazy na Internetu

  1. Mandelbulber – creating animations
    https://sites.google.com/si­te/mandelbulber/getting-started
  2. MandelbulberTutorial & User Manual Version: 0.9.1
    http://cdn.mandelbulber.or­g/doc/Mandelbulber_Manual_v091­.pdf
  3. AppImage
    https://appimage.org/
  4. Stránka aplikace Gnofract 4D
    http://edyoung.github.io/gnofract4d/
  5. Repositář aplikace Gnofract 4D
    https://github.com/edyoung/gnofract4d
  6. Multifractal system
    https://en.wikipedia.org/wi­ki/Multifractal_system
  7. What are Multifractals?
    https://imagej.nih.gov/ij/plu­gins/fraclac/FLHelp/Multi­fractals.htm
  8. Multifractal vs Fractal – What's the difference?
    https://wikidiff.com/multi­fractal/fractal
  9. Mandelbulb
    http://www.mandelbulb.com/
  10. Mandelbulber Fractal Rendering Software
    http://www.mandelbulb.com/2012/3d-fractal-rendering-mandelbulber/
  11. Mandelbulber na Sourceforge
    https://sourceforge.net/pro­jects/mandelbulber/
  12. Mandelbulb 3D (MB3D) Fractal Rendering Software
    http://www.mandelbulb.com/2014/man­delbulb-3d-mb3d-fractal-rendering-software/
  13. Mandelbox (Wikipedia)
    https://en.wikipedia.org/wi­ki/Mandelbox
  14. Gallery of Mandelbox fractals
    https://sites.google.com/si­te/mandelbox/
  15. Mandelbulb (Wikipedia)
    https://en.wikipedia.org/wi­ki/Mandelbulb
  16. Cygnus software: „Fractal eXtreme (fractal generator for Windows)“,
    http://www.cygnus-software.com
    We think that if you give Fractal eXtreme a try, you will soon decide that Fractal eXtreme's unique combination of speed, power, and intuitive interface make it your best choice for exploring the wonders of fractals.
  17. Devaney Bob: „Dynamical systems and Iterated Function Systems“,
    http://math.bu.edu/people/bob/
    Bob Devaney's Home Page
  18. Gintz Terry W.: „Zplot (fractal generator)“,
    http://www.mysticfractal.com/Frac­talZplot.html
    Fractal Zplot is an interactive program for generating fractal images. Originally named Zplot, this program has been in continuous development since 1989. Fractal Zplot currently supports the Mandelbrot set, Julia sets, Newton's method, and Phoenix curves, with millions of mapping variations. 3D fractal types include quaternion, hypercomplex, orbital fractals and lsystems, in addition to the original height field and landscape types.
  19. Hubička Jan: „Stránky programu XaoS“,
    http://xaos.sourceforge.net/en­glish.php
    Welcome to the redesigned web portal of XaoS. Here we offer up-to-date information about the XaoS project, the development issues and others.
  20. Hubička Jan: „Starší (a IMHO hezčí) verze stránek programu XaoS“,
    http://xaos.sourceforge.net/blac­k/index.php
    XaoS is a fast portable real-time interactive fractal zoomer. It displays the Mandelbrot set (among other escape time fractals) and allows you zoom smoothly into the fractal. Various coloring modes are provided for both the points inside and outside the selected set. In addition, switching between Julia and Mandelbrot fractal types and on-the-fly plane switching is provided. The first version was a minimal X Window Mandelbrot viewer by Thomas later modified by Jan to support high frame-rate zooming. Other additions were later made by both Thomas and Jan including autopilot (for those of you without drivers licenses), palette changing, GIF saving, and fractal inversion.
  21. Chardonnet David: „IFS Fractals Digital Encyclopedy“,
    http://www.chez.com/fractal­s/galeries/gb_index.html
  22. Jones Damien M. a kol.:„Fractalus“,
    http://www.fractalus.com
    fractalus.com exists to showcase fractal art, provide information about fractals, and promote fractals in general. We (the artists who build and maintain this site) want to show you our very best; we create this art because we love to do it. We're happy to share this with you, but we would appreciate it if you would respect our wishes regarding image re-use and copyrights.
  23. Kolka Milan: „Spojování želv v jazyce založeném na L-systémech“,
    http://www.elektrorevue.cz/clan­ky/01010/index.html
    Článek představuje programovací jazyk Fraktálovač, který je určen ke generování fraktálů. Jazyk je založen na Lindenmayerových systémech (L-systémech). Zejména je zde ukázán princip spojování želv, který rozšiřuje možnosti klasických L-systémů.
  24. Lartigue Ghislain: „Hydrodynamical Instabilities: The Iterative Function System“,
    http://www.enseeiht.fr/hmf/tra­vaux/CD9900/travaux/optmfn/hi/00pa/mfn11/pa01­.htm
    The aim of this hands-on was to study a dynamical system. I have choosen to deal with a particular class of these systems which are the Iterative Function System (IFS). These systems are not really what one could call a „pure“ dynamical system. Actually, all the systems we have studied so far can be written X'=F(X,t), that is to say that the derivative of a given set of variables X=(x1,…,xn) can be expressed as a function of this set X and of the time (for the non-autonomous systems). Thus, the whole evolution of the system is perfectly deterministic and actually, is totally determined by the initial condition X(0). However, it is well known that in many cases, the evolution of a system can become chaotic and then, the sensibility to the initial conditions can give the impression that the system follows a random trajectory. But one should still remember that this is just an illusion which is the consequence of our finite precision knowing of the initial condition.
  25. Pulcini Giovambattista, Verrando, Meloni Rossi: „IFS: Fractal Image Compression“,
    http://mathforum.org/libra­ry/view/6165.html
    Download IFS Application Framework, a freeware educational program for fractal image coding. Note: It needs 486DX2/66, 8MB RAM, Windows 3.1 with a 11MB swapfile and a 32000 SVGA driver (at least). Download IFSDOC, an introduction to IFS and IFSAF (in Postscript format). A more detailed description of IFSAF is also available.
  26. Pulcini Giovambattista: „Fractal Image Compression Software (for Windows)“,
    http://www.verrando.com/pulcini/gp-ifs1.html
    IFSAF: IFS Application Framework is a software running under Windows 3.x for fractal image encoding. It has some bugs, makes no control on what you are doing, so it crashes frequently, is not a well-behaved window application: it monopolizes the CPU until the enc/dec is over, but shows graphically each step of the computation, so may be a valuable choise for the beginners in this field.Besides, it is a powerful framework, for testing several different algorithms, andoptions.
  27. Scott Draves: „The Fractal Flame Algorithm“,
    http://flam3.com/flame_draves.pdf, May 18, 2005
  28. Slijkerman Frederik: „Ultra Fractal (fractal generator for Windows)“,
    http://www.ultrafractal.com
    Ultra Fractal is the best tool to create fractal artwork and fractal animations. Whether you are a graphics designer, a professional fractal artist, a video producer, or a complete beginner, Ultra Fractal 4 makes it easy to create beautiful fractal pictures, animated textures, and moving fractal backgrounds.
  29. Thornton Sterling: „XenoDream (Interactive IFS Editor)“,
    http://xenodream.com
    XenoDream is a 3-D graphics program that combines standard shapes with 3-D IFS fractal methods for interactive modeling with a difference. Browse through our galleries for some examples, and the XenoDream pages to learn more.
  30. Tyler Bert, Wegner Tim a kol.:
    „Fractint (fractal generator for DOS, Windows and Unix)“,
    http://www.fractint.org
    Fractint is a freeware fractal generator created for IBMPC's and compatible computers to run under DOS and ported to Linux. This page is for developers who wish to keep up with the latest source changes and users who would like to try the current developer's version. This page is under development by a one-finger typist entering html in a text editor, so it may not get much fancier than this for a while.
  31. Mandelbrot Explorer (prohlížeč Mandelbrotovy množiny jako jednoduchá webová aplikace):
    http://www.softlab.ece.ntu­a.gr/miscellaneous/mandel/man­del.html