Hlavní navigace

Vykreslování a animace trojrozměrných fraktálů v aplikaci Mandelbulber

Pavel Tišnovský

Dnes se seznámíme s možná nejpropracovanější aplikací pro vykreslování trojrozměrných fraktálů i jejich animací. Program nazvaný Mandelbulb je dostupný i pro Linux, a také jeho zdrojové kódy.

Doba čtení: 28 minut

Sdílet

11. Fraktál typu Julia bulb

12. Nový typ fraktálu: Mandelbox

13. Další ukázky vykresleného fraktálu typu Mandelbox

14. Vykreslení základních tvarů (primitiv) do 3D scény

15. Fronta pro naplánování renderingu na pozadí

16. Obsah druhé části článku o aplikaci Mandelbulber

17. Další ukázky fraktálů vykreslených programem Mandelbulber

18. Vybrané články ze seriálu o fraktálech v počítačové grafice

19. Literatura

20. Odkazy na Internetu

1. Aplikace Mandelbulber pro vykreslování 3D fraktálů i jejich animací

V dnešním článku, který tematicky navazuje na seriál o fraktálech v počítačové grafice, který na Rootu v minulosti vyšel, se seznámíme s aplikací s poněkud prapodivným názvem Mandelbulber. Jedná se o program určený pro návrh a vykreslování mnoha typů trojrozměrných fraktálů – od trojrozměrných zobecněných IFS přes fraktály vypočítané v kvaternionovém či hyperkomplexním čtyřrozměrném prostoru až po relativně nové typy fraktálů nazvané Mandelbulb a Mandelbox. To však není zdaleka vše, protože Mandelbulber dokáže vytvářet i animace těchto fraktálů, které jsou mnohdy velmi působivé a prakticky nijak nepřipomínají klasické dvourozměrné fraktály (a už vůbec ne trojrozměrné L-systémy). Tyto animace, jež naleznete například na [1] [2] a [3], jsou ovšem velmi náročné na výpočetní výkon a jejich rendering mnohdy trval i několik týdnů (i proto jsou v dnešním článku použity pouze statické obrázky, animace budou představeny další týden, kdy již doufejme rendering skončí :-).

Obrázek 1: Trojrozměrný fraktál vykreslený programem Mandelbulber.

Poznámka: ve skutečnosti není Mandelbulber zcela novou aplikací, protože se v ní používají postupy známé již deset let, ovšem teprve dostupnost výkonných multijádrových mikroprocesorů umožnil reálné použití této aplikace – minimálně je nutné mít k dispozici relativně rychlý náhled na generovanou scénu (v řádu desítek sekund), protože jinak práce s Mandelbulberem připomíná osmdesátá a devadesátá léta minulého století a snahy vykreslovat běžné dvourozměrné fraktály na osmibitových mikropočítačích nebo na PC s mikroprocesorem 80286 bez matematického koprocesoru.

Obrázek 2: Fraktál (konkrétně Mandelbrotova množina) vypočtený v komplexní rovině.

2. První pokusy o rozšíření klasických fraktálů vykreslovaných v komplexní rovině do 3D prostoru

Velmi zajímavou a s dnešním výpočetním výkonem i „dostupnou“ skupinou fraktálních útvarů jsou fraktály vytvářené ve trojrozměrném prostoru (3D fraktály). První pokusy s trojrozměrnými fraktály vycházely z klasických fraktálů počítaných v rovině, přičemž se tvůrci snažili nějakým více či méně vhodným způsobem přidat třetí rozměr. Významnou skupinou fraktálů kreslených v ploše jsou mapy dynamických systémů ležících v komplexní rovině, mezi něž patří i (možná především) známá Mandelbrotova množina, Juliovy množiny, fraktály typu Magnet, Barnsley, Lambda, Phoenix atd. Zdaleka nejpoužívanějším způsobem vizualizace těchto dynamických systémů je barevné zvýraznění počtu iterací, tj. celkového počtu opakování iterační funkce dynamického systému až do té doby, než je splněna nějaká předem známá podmínka, například překročení předem nastavené velikosti komplexního čísla (bailout) u Mandelbrotovy množiny a množin Juliových.

fractals62_1

Obrázek 3: Trojrozměrná Mandelbrotova množina použitá jako výškové pole.

Naskýtá se otázka, zda není možné podobné dynamické systémy, které při zobrazení v ploše vypadají velmi zajímavě, vytvářet i v trojrozměrném prostoru. Možností vytvoření a následného zobrazení například trojrozměrné Mandelbrotovy množiny či Juliových množin je hned několik, přičemž se jednotlivé metody od sebe liší svou pracností, časovou náročností a v neposlední řadě také tvarem výsledného objektu. Nejjednodušší a v některých aplikacích stále nejpoužívanější metodou tvorby prostorových fraktálů je zobrazení původně plošného fraktálního objektu pomocí výškového pole (heightfield). Čím větší počet iterací je nutné provést v daném místě prostoru, tím vyšší či naopak nižší je poloha vrcholu ve výškovém poli. Základem výškového pole je většinou plocha, ale může se jednat i o jiné těleso, například kouli, která je vhodná například pro modelování povrchů planet (někdy se setkáme i s válcem atd.).

fractals62_2

Obrázek 4: Použití výškových polí, jejichž základním tvarem je koule (výška se tedy počítá od středu koule a nikoli od nějaké roviny).

Tento oblíbený a nutno říci, že i snadno implementovatelný způsob zobrazení Mandelbrotovy množiny je demonstrován na obrázcích, které byly vytvořeny s využitím raytraceru POVRay a modelovacího programu Vista. Vstupem byl – kromě samotného popisu trojrozměrné scény – obyčejný plošný obrázek výřezu Mandelbrotovy množiny. Na třetím obrázku je Mandelbrotova množina použita pro výškové pole, jehož základem je rovina. Body ležící uvnitř Mandelbrotovy množiny mají přiřazenu nulovou výšku. Čtvrtý obrázek představuje modely několika planet, které vznikly z výškových polí, jejichž základem je koule. A konečně obrázek pátý se podobá obrázku prvnímu, pouze s tím rozdílem, že výškové pole je vytvořeno „inverzním“ způsobem – vnitřní části Mandelbrotovy množiny nepředstavují hory, jako na druhém obrázku, ale naopak dno jezera. Nízký počet iterací v tomto případě značí vysoký terén a naopak.

fractals62_3

Obrázek 5: Mandelbrotova množina je v této scéně použita pro model pobřeží jezera.

Poznámka: popisem raytraceru POVRay jsme se na Rootu taktéž zabývali v samostatném seriálu.

3. Složení 3D modelu z řezu vzniklého z mnoha samostatně vypočtených plošných fraktálů

Druhý způsob použití, resp. přesněji řečeno přechodu od původně plošných dynamických komplexních systémů do trojrozměrného prostoru, spočívá v jejich složení do několika vrstev. Ve své podstatě se jedná o jednoduchou reprezentaci trojrozměrných těles s využitím elementárních objemových prvků – voxelů. Každá vrstva je představována jedním plošným obrázkem, ve kterém jsou například pixely ležící uvnitř atraktoru dynamického systému považovány za vyplněné voxely a zbývající pixely za voxely prázdné (pixel tedy získá výšku rovnou vzdálenosti mezi jednotlivými vrstvami). Pokud se dynamické systémy ležící v sousedních vrstvách liší pouze o malou startovací hodnotu (libovolný vstupní parametr či parametry), je výsledkem složení všech vrstev trojrozměrný model fraktálního útvaru. Tento typ objektů je podporován například i v dnes již starobylém (ovšem v některých ohledech nepřekonaném) programu Fractint, viz. fraktály nazvané Julibrot. Na pátém obrázku je podobný trojrozměrný objekt zobrazen. Jedná se o výsledek složení celkem 128 vrstev Juliovy množiny, v každé vrstvě je použita nepatrně odlišná hodnota c=cre+ici. Čím vyšší je světlost pixelu, tím blíže se daný voxel nachází k pozorovateli.

fractals62_4

Obrázek 6: Fraktální objekt typu Julibrot – 128 vrstev složených z Juliových množin.

Bližší informace o této technice lze nalézt například na stránce http://www.hiddendimension­.com/FractalMath/JuliaBrot_Frac­tals_Main.html, popř. se můžete podívat na rotaci takového fraktálu na videu.

Dalším způsobem přechodu od plošných fraktálů k fraktálům trojrozměrným (popř. čtyřrozměrným) je náhrada komplexních čísel a komplexních iteračních funkcí čísly a funkcemi hyperkomplexními, popř. funkcemi založenými na kvaternionech (v obou případech se jedná o rozšíření komplexních čísel). Tímto tématem se budeme podrobněji zabývat v navazující kapitole; příklad fraktálu vytvořeného ve čtyřrozměrném prostoru s provedenou projekcí do trojrozměrného prostoru je ukázán na šestém obrázku. Jedná se o model vytvořený v programu Quat, který je dostupný jak pro Unixy (s GUI i jako program ovládaný z příkazové řádky), tak i pro operační systém Microsoft Windows. Na první pohled vypadá přidaný (tj. čtvrtý) rozměr nadbytečný – ve skutečnosti však díky němu získáváme možnost provádění jednoduché animace celého fraktálu, popř. i další parametry ovlivňující jeho tvar.

fractals62_5

Obrázek 7: Původně čtyřrozměrný fraktální objekt po projekci do trojrozměrného prostoru (vykresleno raycastingem).

Poznámka: dnes je jednodušší použít aplikaci Gnofract 4D, která je součástí Gnome desktopu. Viz též stránka projektu Gnofract 4D.

4. Použití kvaternionů pro vykreslování a animaci čtyřrozměrných fraktálů

V předchozí kapitole jsme se zmínili o použití hyperkomplexních čísel a kvaternionů pro tvorbu čtyřrozměrných fraktálů. Obě tyto algebraické struktury, z nichž každá má své přednosti a zápory, je možné využít při tvorbě čtyřrozměrných objektů, což si ukážeme na tvorbě čtyřrozměrné varianty Mandelbrotovy množiny a čtyřrozměrných variant množin Juliových. Mandelbrotova množina ve čtyřrozměrném prostoru se počítá podobným způsobem, jako Mandelbrotova množina v komplexní rovině, pouze se liší typ použitých proměnných a konstant. Nejprve si připomeňme, jak jsme postupovali při výpočtu této fraktální struktury v komplexní rovině. Mandelbrotova množina je vytvořena pomocí velmi jednoduchého dynamického systému, který je založený na iteraci funkce komplexní paraboly. Vlastní iterační výpočet má tvar:

zn+1=zn2+c

kde proměnné z a c leží v komplexní rovině (jedná se tedy o běžná komplexní čísla).

V průběhu iteračního výpočtu se hodnota z postupně mění, zatímco hodnota c zůstává konstantní – tato se mění pouze při přesunu výpočtu na nový bod ležící v komplexní rovině (většinou tento bod odpovídá pixelu zobrazenému v nějaké pixmapě). Celý iterační proces začíná s určitou startovní hodnotou z0, takže systém postupně generuje sekvenci hodnot zk, které nazýváme orbit.

Postup si ukážeme na prvních čtyřech iteracích:

z1=(z0)2+c
z2=((z0)2+c)2+c
z3=(((z0)2+c)2+c)2+c
z4=((((z0)2+c)2+c)2+c)2+c
 

fractals63_3

Obrázek 8: Trojrozměrný řez 4D Juliovou množinou.

Při práci se systémem popsaným v předchozím textu nás zajímá, zda pro danou startovní hodnotu z0 a konstantu c posloupnost zk konverguje či diverguje. Mandelbrotova množina je totiž definována jako množina všech komplexních čísel i, které produkují konečný orbit nuly (tj. posloupnost konvergující či alespoň oscilující). Na základě trojúhelníkové nerovnosti je možné odvodit vztah pro test na divergenci. Ze vztahu vyplývá, že jakmile velikost zk přesáhne hodnotu 2 (pokud je tato hodnota umocněna, nazývá se bailout), je jisté, že daný orbit není konečný, tj. posloupnost diverguje ke komplexnímu nekonečnu.

fractals62_6

Obrázek 9: Další původně čtyřrozměrný fraktální objekt po projekci do trojrozměrného prostoru (vykresleno raytracingem)

Nyní se konečně přesuňme z komplexní roviny do čtyřrozměrného prostoru, ať už kvaternionového nebo hyperkomplexního. V obou případech (které nyní nemusíme rozlišovat) se ani definice ani vlastní výpočet Mandelbrotovy množiny nezmění, tj. stále je používán výše uvedený iterační vztah zn+1=zn2+c. Jediná podstatná změna nastává v tom, že konstanta c, startovní hodnota z0, posloupnost zk i všechny výpočty již nebudou prováděny „pouze“ s komplexními hodnotami, ale s kvaterniony či hyperkomplexními čísly. To znamená, že například c=c1+ici+jcj+kck, kde 1, i, j, k jsou jednotky, jejichž lineární kombinací může být vytvořen jakýkoli kvaternion či hyperkomplexní číslo. Také test na bailout se provádí stejným způsobem, nesmíme však zapomenout na to, že nyní se absolutní hodnota (velikost) z vypočítá s využitím vzorce:

|z|=(z12+zi2+zj2+zk2)1/2

To, jakým způsobem budou jednotlivé dimenze při výpočtech využity, již záleží na konkrétní aplikaci. Jedná se o to, že v komplexní rovině jsme mohli konstantu c měnit podle toho, v jakém místě jsme počítali barvu daného pixelu. Mezi pozicí pixelu a hodnotou konstanty c tedy existovala jednoznačná transformace. To je sice ve čtyřrozměrném prostoru také možné (vlastně by to znamenalo čtyři vnořené smyčky plus jednu smyčku iterační), z praktických důvodů se však buď jedna nebo dokonce dvě dimenze „zploští“ tím způsobem, že jsou příslušné hodnoty nastaveny na konstantu pro každý počítaný bod, popř. se provede výpočet skutečné projekce.

Pokud například při výpočtech budeme vždy dosazovat ck=1,5, provádíme vlastně velmi jednoduché ořezání původního čtyřrozměrného objektu trojrozměrným prostorem a výsledkem bude trojrozměrný objekt. V programu Gnofract 4d a FractInt se dokonce provádí „zploštění“ dvou dimenzí; konkrétně ve FractIntu se pro fraktály nazvané QUAT a QUATJUL nastavují konstanty cj a ck. Výsledkem je plošný útvar (obrázek), který se zobrazuje naprosto stejným způsobem jako klasické fraktály v komplexní rovině.

Poznámka: výše uvedené tvrzení ovšem neplatí pro dnes popisovaný program Mandelbulber, který fraktály považuje za plnohodnotné trojrozměrné objekty.

5. Odlišný přístup k vykreslování 3D fraktálů – multifraktály

I když použití kvaternionů umožnilo (a to navíc relativně snadným způsobem) vykreslování a dokonce i animaci trojrozměrných obrazců založených na fraktálech, byly získané výsledky spíše zklamáním, protože pestrost a variabilita fraktálů počítaných a vykreslovaných v komplexní rovině se v trojrozměrném prostoru změnila na více či méně složité „bramboroidy“, které neměly další použití. V komunitě programátorů a umělců, kteří fraktály ve své tvorbě používají, se tedy hledaly jiné alternativy. Ty posléze vedly k použití takzvaných multifraktálů, což jsou (velmi zjednodušeně řečeno) obrazce, u nichž není možné vyjádřit jejich dimenzi jediným číslem (které má u běžných geometrických obrazců celou hodnotu, kdežto u fraktálů se jedná o reálné číslo nebo někdy o zlomek). Mezi multifraktály vhodné pro tvorbu působivých trojrozměrných objektů (můžeme říci dokonce trojrozměrných modelů) patří především:

  1. Zobecněné systémy iterovaných funkcí (IFS) s nelineární složkou (algoritmus Fractal Flame atd.)
  2. Objekty pojmenované Mandelbulb, což je zobecnění Mandelbrotovy množiny a Juliových množin.
  3. Objekty pojmenované Mandelbox, což je opět variace na Mandelbrotovu množinu.
*

Obrázek 10: Fraktál vykreslený v „2,5D“ prostoru.

Poznámka: důležité je, že všechny tři výše zmíněné typy „nových fraktálů“ , resp. multifraktálů, jsou podporovány i v dnes popisované aplikaci Mandelbulber.

Obrázek 11: Zobecnění Mandelbrotovy množiny do 3D prostoru může vést k 3D modelům vykresleným pomocí raytracingu, které vypadají jako kovové mechanismy.

6. Instalace programu Mandelbulber

Samotná instalace programu Mandelbulber je velmi snadná (ale i relativně nebezpečná), protože tato aplikace používá AppImage a je dodávána v jediném obrazu s prakticky všemi potřebnými knihovnami (Qt, …). To znamená, že postačuje ze stránky https://sourceforge.net/pro­jects/mandelbulber/ získat příslušný obraz (pro Linux konkrétně soubor Mandelbulber v2/Linux AppImage/Mandelbulber_v2–2.19-x86_64.appimage) a nastavit mu práva pro spuštění přihlášeným uživatelem:

chmod u+x

Následně je možné program spustit:

$ ./Mandelbulber_v2-2.19-x86_64.appimage
Poznámka: samozřejmě si můžete naklonovat i repositář tohoto projektu a přeložit si ho sami. Kromě překladače jazyka C++ bude zapotřebí i relativně velké množství vývojových knihoven, zejména knihovny Qt (viz též návod).

7. Grafické uživatelské rozhraní Mandelbulberu

Po spuštění aplikace Mandelbulber se zobrazí okno s jejím grafickým uživatelským rozhraním. To je relativně složité, ovšem není se čemu divit, protože se jedná o program s doslova obrovským množstvím voleb. Důležitý je nástrojový pruh zobrazený přímo pod hlavním menu. V tomto pruhu jsou uvedeny základní typy fraktálů a jejich variací, které jsou aplikací podporovány (ovšem můžete si přidat i další typy z dodávaných souborů *.fract). Povšimněte si, že jsou – v zobrazeném pořadí – podporovány jak zobecněné IFS systémy, tak i typ Mandelbox a Mandelbulb, ale i běžné fraktály založené na kvaternionech.

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

Další podokna slouží ke specifickým účelům, například k nastavení parametrů vykreslovaného fraktálu, pro konfiguraci renderovacího algoritmu, existuje zde editor materiálů popsaný příště, okno s frontami úloh atd. Ta nejdůležitější okna a jejich obsah si postupně popíšeme v navazujícím textu.

Obrázek 13: U některých voleb se zobrazuje nápověda včetně obrázků.

8. Zobecněné trojrozměrné IFS (systémy iterovaných funkcí)

Aplikace Mandelbulber podporuje vykreslování zobecněných trojrozměrných IFS. Tento typ fraktálů vznikl několikerou generalizací klasických systémů iterovaných funkcí (IFS). Nový typ je známý pod názvem „Fractal Flame“ (podle pojmenování v prvním článku o těchto objektech). Zajímavé – a pro počítačovou grafiku bezesporu přínosné – přitom je, že algoritmus tvorby „Fractal Flame“ byl vytvořen přímo s ohledem na estetickou kvalitu vytvářených obrázků, bez ohledu na matematickou korektnost, jako je tomu u původních IFS systémů. Tomu odpovídá výběr nelineárních funkcí (zde nazývaných variace), logaritmická závislost světlosti pixelu na počtu jeho „zásahu“ při vytváření obrazce v rovině, použití symetrie při vykreslování obrazce atd. Největší rozdíly mezi fraktály typu „Fractal Flame“ a systémy IFS jsou popsány v dalším odstavci.

fractals38_1

Obrázek 14: Obrázek vytvořený pomocí algoritmu „Fractal Flame“.

Mezi klasickými systémy iterovaných funkcí (IFS) a fraktály typu „Fractal Flame“ existuje poměrně velké množství rozdílů, které spočívají v rozšíření schopností původních IFS o další funkcionalitu. Základ generování je však kupodivu shodný: v obou případech je použit algoritmus náhodné procházky (RWA – Random Walk Algorithm), pomocí kterého se vybírají a následně aplikují transformace na bod Xn ležící v rovině. Nově vygenerovaný bod Xn+1 je použit při obarvení pixelu ve vytvářeném rastrovém obrázku.

fractals38_2

Obrázek 15: Další obrázek vytvořený pomocí algoritmu „Fractal Flame“.

Nejvýraznější rozdíl mezi klasickými IFS a Fractal Flame tkví v tom, že se místo původních lineárních, resp. afinních transformací používají lineární transformace kombinované s nějakou složitější nelineární funkcí, zde nazvanou variace. Díky nelineárním funkcím se mohou v obrázku objevovat i velmi složité části ve tvaru spirál, oblouků, vln apod.

fractals38_3

Obrázek 15: Nelineární funkce umožňují vytvářet obrazce se zajímavými tvary.

Další rozdíl spočívá v použití symetrie, pomocí které je možné z původního nezajímavého obrázku vytvořit obrázek mnohem zajímavější. Symetrie může být dvou typů: rotační (okolo středu obrázku) nebo zrcadlová (okolo jedné ze souřadných os probíhajících středem obrázku). Symetrii je možné vytvořit buď při specifikaci lineárních funkcí nebo až při vykreslování jednotlivých pixelů na základě souřadnic bodu Xn+1.

Obrázek 16: Trojrozměrné zobecněné IFS vygenerované programem Mandelbulb.

Posledním rozdílem mezi IFS a Fractal Flame je rozšířený způsob obarvování jednotlivých pixelů. Lineární závislost mezi barvou pixelu a počtem „zásahů“ tohoto pixelu je změněna na závislost logaritmickou, což způsobuje zvýraznění zajímavých části ve vytvářeném obrazci. Také je možné jednotlivé části obrazce obarvovat v závislosti na použité transformaci – ve skutečnosti je totiž původně dvojrozměrný prostor obrázku rozšířen o třetí rozměr, kterým je index do barevné palety či přímo barvový odstín.

Obrázek 17: Bližší pohled na model ze šestnáctého obrázku..

9. Ukázky vykreslených trojrozměrných IFS

Již na obrázcích 16 a 17 byly zobrazeny trojrozměrné IFS vykreslované aplikací Mandelbulber. V tomto případě se používá stejný renderovací algoritmus, jaký je použit u dalších typů fraktálů, takže je například umožněno na základě lokálních podmínek vypočítat obdobu normálového vektoru použitého v osvětlovacím modelu. Aplikovat je možné i různé materiály, což je téma, kterému se budeme podrobněji věnovat příště. Prozatím se tedy podívejme, jakým způsobem lze rozšíření trojrozměrné IFS vykreslovat:

Obrázek 18:Trojrozměrné zobecněné IFS vygenerované programem Mandelbulb.

Obrázek 19:Trojrozměrné zobecněné IFS vygenerované programem Mandelbulb (odlišný pohled na model z obrázku číslo 18).

Obrázek 20:Trojrozměrné zobecněné IFS vygenerované programem Mandelbulb.

Obrázek 21:Trojrozměrné zobecněné IFS vygenerované programem Mandelbulb (pohled dovnitř modelu z obrázku číslo 20).

10. Fraktál typu Mandelbulb

V této kapitole se ve stručnosti seznámíme s fraktálním objektem pojmenovaným Mandelbulb. Jedná se o zobecnění Mandelbrotovy množiny a Juliových množin do vyšších dimenzí, ovšem s tím rozdílem, že se používá sférický souřadný systém. Samotná implementace jedné iterace při výpočtu Mandelbrotovy množiny a Juliových množin vlastně odpovídá změně měřítka, rotaci a posunu (musíme si uvědomit, co znamená násobení v oboru komplexních čísel). A právě tyto transformace lze ve vyšších dimenzích velmi dobře popsat ve sférickém souřadném systému. Navíc je možné – a to velmi snadno – změnit míru změny měřítka a otočení. V komplexní rovině se tato změna dala provést složitě a typicky se používaly pouze celočíselné mocniny, kterými se násobila hodnota z (z2 zdvojnásobí úhel komplexního čísla atd.), kdežto ve sférickém souřadném systému je tato operace opět provedena velmi snadno, což má svoje praktické důsledky, protože zajímavé 3D modely vzniknou až při použití vyšších mocnin.

Obrázek 22: Fraktál typu Mandelbulb při použití mocniny 2 připomíná trojrozměrný model Mandelbrotovy množiny.

Tento typ fraktálu popsali v roce 2009 Daniel White a Paul Nylander.

Obrázek 23: Lepší je použít vyšší mocniny, například 8 atd.

Velmi primitivní implementace v dvourozměrném případě může vypadat takto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 
#define WIDTH  400
#define HEIGHT 400
 
void writeImage(int width, int height, 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]);
    }
}
 
#define maxN 100
 
int main(int argc, char **argv)
{
    double cx, cy;
    double zx, zy;
 
    int i, j, n;
 
    char pixels[WIDTH * HEIGHT];
    memset((void*)pixels, 0, (size_t)(WIDTH*HEIGHT));
 
    double cz = 0.0;
    cy = -3.0;
    for (j = 0; j < HEIGHT; j++) {
        cx = -3.0;
        for (i = 0; i < WIDTH; i++) {
            double zx = 0, zy=0, zz=0;
            for (n = 0; n < maxN; n++) {
                // extract polar coordinates
                float wr = sqrt(zx*zx+zy*zy);
                float wo = atan2(zy, zx);
 
                if (wr > 2.0) break;
 
                // scale and rotate the point
                wr = pow(wr, 8.0);
                wo = wo * 8.0;
 
                // convert back to cartesian coordinates
                zx = wr*cos(wo)+cx;//*sin(wi);
                zy = wr*sin(wo)+cy;
            }
            pixels[j*WIDTH+i] = n;
            cx += 6.0 / WIDTH;
        }
        cy += 6.0 / HEIGHT;
    }
 
    writeImage(WIDTH, HEIGHT, pixels);
    return 0;
}

Obrázek 24: Pohled na detail modelu z obrázku 23.

11. Fraktál typu Julia bulb

Tak jako v komplexní rovině či hyperkomplexním prostoru existuje Mandelbrotova množina, která „mapuje“ všechny Juliovy množiny, je možné totéž provést i pro fraktál typu Mandelbulb. Výsledkem je trojrozměrný model zobrazený na dalším obrázku. Podrobnější informace o tomto typu fraktálu si povíme příště.

Obrázek 25: Trojrozměrný fraktál typu Julia bulb.

12. Nový typ fraktálu: Mandelbox

Pravděpodobně nejpopulárnějším a nejobecnějším typem fraktálu, který je dostupný i v aplikaci Mandelbox, je fraktál typu Mandelbox, který byl navržen v roce 2010 Tomem Lowem. Jedná se opět o zobecnění výpočtu Mandelbrotovy množiny, tentokrát ovšem bez omezení počtu dimenzí. Namísto iteračního výrazu z=z2+c se zde provádí překlápění souřadnic spojené s jejich následným vynásobením reálným číslem. Dvourozměrná varianta (která ovšem není příliš zajímavá z pohledu designu) může být implementována následujícím způsobem:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 
#define WIDTH  400
#define HEIGHT 400
 
void writeImage(int width, int height, 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]);
    }
}
 
#define maxN 255
 
int main(int argc, char **argv)
{
    double cx, cy;
    double zx, zy;
 
    const double scale = -1.1;
 
    int i, j, n;
 
    char pixels[WIDTH * HEIGHT];
    memset((void*)pixels, 0, (size_t)(WIDTH*HEIGHT));
 
    cy = -2.0;
    for (j = 0; j < HEIGHT; j++) {
        cx = -2.0;
        for (i = 0; i < WIDTH; i++) {
            double zx = 0, zy = 0;
            for (n = 0; n < maxN; n++) {
                if (zx>1) {
                    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;
                }
                double zx2 = zx * zx;
                double zy2 = zy * zy;
                double magnitude = sqrt(zx2 + zy2);
                if (zx2 + zy2 > 4.0) break;
                if (magnitude < 0.5) {
                    zx = zx * 4;
                    zy = zy * 4;
                }
                else if (magnitude < 1.0) {
                    zx=zx/(magnitude*magnitude);
                    zy=zy/(magnitude*magnitude);
                }
                zx = scale * zx + cx;
                zy = scale * zy + cy;
            }
            pixels[j*WIDTH+i] = n;
            cx += 4.0 / WIDTH;
        }
        cy += 4.0 / HEIGHT;
    }
 
    writeImage(WIDTH, HEIGHT, pixels);
    return 0;
}

Obrázek 26: Fraktál typu Mandelbox.

13. Další ukázky vykresleného fraktálu typu Mandelbox

Ukažme si nyní některé trojrozměrné modely založené na fraktálu typu Mandelbox. Z některých screenshotů je patrné, že tento typ fraktálu lze použít pro vytvoření pseudo mechanických struktur.

Obrázek 27: Fraktál typu Mandelbox.

Obrázek 28: Fraktál typu Mandelbox.

Obrázek 29: Fraktál typu Mandelbox.

Obrázek 30: Fraktál typu Mandelbox (bližší pohled na model z obrázku 29).

Obrázek 31: Fraktál typu Mandelbox (bližší pohled na model z obrázku 29).

14. Vykreslení základních tvarů (primitiv) do 3D scény

Do modelované trojrozměrné scény je možné vložit několik základních geometrických tvarů (primitiv). Jejich nabídku lze vidět v levém horním rohu grafického uživatelského rozhraní aplikace Mandelbulber:

Obrázek 32: Nabídka geometrických tvarů a 3D scéna, která z nich byla vytvořena.

Poznámka: tato možnost pochopitelně z Mandelbulberu nedělá plnohodnotný modelovací program.

15. Fronta pro naplánování renderingu na pozadí

V případě, že uživatel potřebuje vytvořit hned několik scén popř. když si zkouší nejlepší parametry vytvářené scény a chce co nejlépe využít dostupný strojový čas, je možné použít frontu, do které se uloží naplánované scény, které se následně renderují na pozadí (například ve velkém rozlišení a/nebo ve větší kvalitě, kterou lze pochopitelně nastavit). Ve frontě se zobrazují jak parametry scény, tak i náhledy na již vytvořený snímek či na jeho dokončenou část.

Obrázek 33: Fronta z částečně vykreslenými scénami.

Frontu lze použít i pro naplánování renderingu celé animace, což je ještě důležitější, protože vykreslení i relativně krátké animace může trvat několik dnů a v některých případech i týdnů.

Obrázek 34: Fronta z částečně vykreslenými scénami.

16. Obsah druhé části článku o aplikaci Mandelbulber

V navazující části tohoto článku si podrobněji popíšeme jednotlivé parametry podporovaných typů fraktálů, ukážeme si využití editoru materiálů (použitých při renderingu) a taktéž se zmíníme o tom, jak lze naplánovat a následně vykreslit složitější animaci.

17. Další ukázky fraktálů vykreslených programem Mandelbulber

Obrázek 35.

Obrázek 36.

Obrázek 37.

Obrázek 38.

Obrázek 39.

Obrázek 40.

Obrázek 41.

18. Vybrané články ze seriálu o fraktálech v počítačové grafice

V této kapitole naleznete odkazy na vybrané články z rozsáhlého seriálu o fraktálech v počítačové grafice:

  1. Úvodní stránka seriálu o fraktálech
    https://www.root.cz/serialy/fraktaly-v-pocitacove-grafice/
  2. Fraktály vytvářené ve čtyřrozměrném prostoru
    https://www.root.cz/clanky/fraktaly-vytvarene-ve-ctyrrozmernem-prostoru/
  3. Mandelbrotovy a Juliovy množiny ve čtyřrozměrném prostoru
    https://www.root.cz/clanky/man­delbrotovy-a-juliovy-mnoziny-ve-ctyrrozmernem-prostoru/
  4. Vykreslování a animace 4D fraktálů v POV-Rayi
    https://www.root.cz/clanky/vy­kreslovani-a-animace-4d-fraktalu-v-pov-rayi/
  5. Animace čtyřrozměrných kvaternionových fraktálů v POV-Rayi
    https://www.root.cz/clanky/animace-ctyrrozmernych-kvaternionovych-fraktalu-v-pov-rayi/
  6. Trojrozměrné modely vytvářené v Lparseru
    https://www.root.cz/clanky/troj­rozmerne-modely-vytvarene-v-lparseru/
  7. L-systémy v 3D: Lparser, POV-Ray a Blender
    https://www.root.cz/clanky/l-systemy-v-3d-lparser-pov-ray-a-blender/
  8. Trojrozměrné modely terénu
    https://www.root.cz/clanky/troj­rozmerne-modely-terenu/
  9. Fractal Flames
    https://www.root.cz/clanky/fractal-flames/

19. 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

20. Odkazy na Internetu

  1. AppImage
    https://appimage.org/
  2. Stránka aplikace Gnofract 4D
    http://edyoung.github.io/gnofract4d/
  3. Repositář aplikace Gnofract 4D
    https://github.com/edyoung/gnofract4d
  4. Multifractal system
    https://en.wikipedia.org/wi­ki/Multifractal_system
  5. What are Multifractals?
    https://imagej.nih.gov/ij/plu­gins/fraclac/FLHelp/Multi­fractals.htm
  6. Multifractal vs Fractal – What's the difference?
    https://wikidiff.com/multi­fractal/fractal
  7. Mandelbulb
    http://www.mandelbulb.com/
  8. Mandelbulber Fractal Rendering Software
    http://www.mandelbulb.com/2012/3d-fractal-rendering-mandelbulber/
  9. Mandelbulber na Sourceforge
    https://sourceforge.net/pro­jects/mandelbulber/
  10. Mandelbulb 3D (MB3D) Fractal Rendering Software
    http://www.mandelbulb.com/2014/man­delbulb-3d-mb3d-fractal-rendering-software/
  11. Mandelbox (Wikipedia)
    https://en.wikipedia.org/wi­ki/Mandelbox
  12. Gallery of Mandelbox fractals
    https://sites.google.com/si­te/mandelbox/
  13. Mandelbulb (Wikipedia)
    https://en.wikipedia.org/wi­ki/Mandelbulb
  14. 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.
  15. Devaney Bob: „Dynamical systems and Iterated Function Systems“,
    http://math.bu.edu/people/bob/
    Bob Devaney's Home Page
  16. 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.
  17. 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.
  18. 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.
  19. Chardonnet David: „IFS Fractals Digital Encyclopedy“,
    http://www.chez.com/fractal­s/galeries/gb_index.html
  20. 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.
  21. 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ů.
  22. 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.
  23. 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.
  24. 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.
  25. Scott Draves: „The Fractal Flame Algorithm“,
    http://flam3.com/flame_draves.pdf, May 18, 2005
  26. 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.
  27. 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.
  28. 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.
  29. Mandelbrot Explorer (prohlížeč Mandelbrotovy množiny jako jednoduchá webová aplikace):
    http://www.softlab.ece.ntu­a.gr/miscellaneous/mandel/man­del.html