Hlavní navigace

Čtyřrozměrné fraktály a GNU aplikace Quat (pokračování)

20. 2. 2007
Doba čtení: 10 minut

Sdílet

Dnešním pokračováním seriálu, ve kterém si popisujeme fraktály používané (převážně) v počítačové grafice, dokončíme popis programu Quat šířeného pod licencí GNU GPL, který je určen pro tvorbu obrázků čtyřrozměrných fraktálů počítaných s využitím kvaternionové algebry.

Obsah

1. Použití Z-bufferu pro urychlení některých výpočtů
2. Nastavení antialiasingu
3. Ukázka vlivu antialiasingu na kvalitu obrázků
      3.1 Konfigurace pro obrázek vykreslený bez antialiasingu
      3.2 Konfigurace pro obrázek vykreslený s antialiasingem 2×2 hodnoty na pixel
      3.3 Konfigurace pro obrázek vykreslený s antialiasingem 3×3 hodnoty na pixel
      3.4 Konfigurace pro obrázek vykreslený s antialiasingem 4×4 hodnoty na pixel
      3.5 Konfigurace pro obrázek vykreslený s antialiasingem 5×5 hodnot na pixel
4. Nastavení počtu řezů v Z-ové ose
5. Ukázka vlivu počtu řezů na kvalitu obrázků
      5.1 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 250 řezy
      5.2 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 500 řezy
      5.3 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 1000 řezy
      5.4 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 2000 řezy
      5.5 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 4000 řezy
6. Parametry generovaných fraktálů, konfigurační soubory
7. Odkazy na další informační zdroje
8. Obsah dalšího pokračování tohoto seriálu

1. Použití Z-bufferu pro urychlení některých výpočtů

Program Quat disponuje unikátní technologií, která není u ostatních aplikací vykreslujících čtyřrozměrné Juliovy množiny obvyklá. Jedná se o takzvaný Z-buffer (paměť hloubky), používaný v některých vizualizačních algoritmech, který v Quatu slouží k urychlení vykreslování v případě, že se nemění základní charakteristika fraktálu (hodnota konstanty c, počtu iterací atd.), ale pouze pozice světelných zdrojů, parametry osvětlovacího modelu, funkce použitá pro obarvení bodů na povrchu atd. (funkce Z-bufferu je zde tedy jiná než u renderovacích algoritmů). Urychlení vykreslení se Z-bufferem vypadá následovně:

  1. Nejprve jsou nalezeny všechny průsečíky paprsků s povrchem fraktálního objektu. Vzdálenosti těchto průsečíků od pozorovatele (kamery) jsou uloženy právě v Z-bufferu. Nalezení průsečíků je časově nejvíce náročná operace při výpočtu obrázku, proto je právě Z-buffer výhodný, jelikož se tento výpočet provede pouze jednou. Po výpočtu všech průsečíků má Z-buffer charakter bitmapy, kde hodnota každého pixelu odpovídá hloubce, tj. vzdálenosti průsečíku od pozorovatele (bitmapa se zvětšuje v závislosti na nastaveném antialiasingu, který bude popsán v následující kapitole). V programu Quat se výpočet hodnot ukládaných do Z-bufferu spustí volbou Calculation->Start/Resume a ZBuffer.
  2. Následně je vizualizován celý výsledný obrázek. Ze Z-bufferu jsou vyčítány vzdálenosti průsečíků od pozorovatele, na jejich základě jsou vypočteny normálové vektory k povrchu a tyto vektory slouží pro výpočet osvětlení v daném místě povrchu s využitím Phongova osvětlovacího modelu. Současně je vypočítána i barva pixelů podle aktuálního nastavení gradientů a funkce sloužící k výpočtu parametru t (viz předchozí část tohoto seriálu). Všechny tyto výpočty sice na první pohled vypadají složitě, ve skutečnosti se však provádí velmi rychle, zcela jistě rychleji, než výpočet hodnot uložených v Z-bufferu.
  3. Uživatel může s nastavenými parametry experimentovat a velmi rychle provádět překreslení obrázku. Pokud se nezmění základní parametry fraktálu (kvaternionová konstanta c, maximální počet iterací, úniková hodnota bailout) ani pohled na fraktál, dává Quat vždy korektní výsledky a to mnohem rychleji, než při přepočtu celého fraktálu.

fractals68_1
Obrázek 1: Obsah Z-Bufferu obrázku čtyřrozměrné Juliovy množiny v nepravých barvách

fractals68_2
Obrázek 2: Obrázek čtyřrozměrné Juliovy množiny vypočtený za pomoci Z-bufferu

2. Nastavení antialiasingu

Na posledním listu konfiguračního dialogu (viz screenshot zobrazený na třetím obrázku) se nachází políčko, ve kterém je možné specifikovat, zda a jakým způsobem se bude provádět antialiasing (tj. odstranění aliasu) při výpočtu obrázku. Antialiasing je časově náročný, protože pro každý pixel se provádí větší množství výpočtů průsečíků s fraktální Juliovou množinou. Pokud je hodnota v tomto políčku rovna jedné, antialiasing se neprovádí a pro každý pixel výsledného obrázku se vypočítá pouze jeden průsečík. To může vést ke vzniku nežádoucích ostrých hran a v některých případech i ke vzniku děr v objektu. Pokud je hodnota v tomto políčku nastavena na 2 až 5 (více již není povoleno), antialiasing se provádí a to takovým způsobem, že se pro každý pixel spočítá více průsečíků (jejich vektory se samozřejmě poněkud odlišují), ty se na základě osvětlovacího modelu obarví a následně se zprůměrují. Kolik hodnot se pro každý pixel výsledného obrázku spočítá nám ukazuje následující tabulka:

Hodnota v políčku antialias Hodnot na pixel
1 1 (antialiasing se neprovádí)
2 2×2=4
3 3×3=9
4 4×4=16
5 5×5=25

Obecně je možné říci, že větší počet hodnot vypočtených pro obarvení jednoho pixelu vede k vytvoření kvalitnějšího obrázku, ovšem na úkor rychlosti výpočtů. Například při nastavení 4×4=16 hodnot počítaných pro jeden pixel je celý výpočet cca 16× pomalejší, než v případě vypnutého antialiasingu. Proto je – zejména při tvorbě rozsáhlejších animací nebo obrázků s velmi vysokým rozlišením – vhodné s hodnotou antialiasingu experimentovat a nevytvářet hned nejkvalitnější obrázky (které stejně mohou být ve výsledku poškozeny například ztrátovou komprimací). Antialiasing je možné a dokonce vhodné kombinovat s funkcí Z-bufferu.

fractals68_3
Obrázek 3: Konfigurační dialog (poslední list) s nastavením antialiasingu

3. Ukázka vlivu antialiasingu na kvalitu obrázků

Vliv antialiasingu na vizuální kvalitu výsledného obrázku si ukážeme na příkladu zobrazení výřezu z fraktální Juliovy množiny. Vzhledem k tomu, že se ve výřezu nachází větší množství hran a i počet řezů v Z-ové rovině je pro tento výřez nedostatečný (2000 řezů), bude vliv antialiasingu jasně patrný. Na následujících pěti obrázcích je zobrazen naprosto stejný pohled na fraktál, přičemž se jednotlivé výpočty lišily právě v nastavení antialiasingu. Při tvorbě prvního obrázku byl antialiasing vypnutý, na druhém obrázku byl nastaven na hodnotu 2 atd. Obsah konfiguračních souborů, pomocí kterých je možné tyto obrázky kdykoli vytvořit (třeba s větším rozlišením), je vypsán v následujících pěti podkapitolách. V pravé části obrázku si všimněte, že antialiasing má vliv i na výpočet osvětlení, tj. provádí se průměrování i z-ových souřadnic, nejenom primitivní průměrování barev výsledných pixelů.

fractals68_4
Obrázek 4: Výřez Juliovy množiny vykreslený bez aplikace antialiasingu

fractals68_5
Obrázek 5: Výřez Juliovy množiny vykreslený s aplikací antialiasingu 2×2 hodnoty na pixel

fractals68_6
Obrázek 6: Výřez Juliovy množiny vykreslený s aplikací antialiasingu 3×3 hodnoty na pixel

fractals68_7
Obrázek 7: Výřez Juliovy množiny vykreslený s aplikací antialiasingu 4×4 hodnoty na pixel

fractals68_8
Obrázek 8: Výřez Juliovy množiny vykreslený s aplikací antialiasingu 5×5 hodnot na pixel

3.1 Konfigurace pro obrázek vykreslený bez antialiasingu

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 40
ambient 0.04
antialiasing 1

# OBJ
c 0.7 -0.5 0.2 -0.1

bailout 16
maxiter 17
lvalue 0
formula 0

viewpoint 0 0 1.3
up 0 1 0
light -7 -7 -7

move 1 0.2
lxr 0.5
interocular 0

# COL
colorscheme  (sin(8*x)+sin(9*y)+sin(10*z)+3)/3  # big speckles
colorrange 1   1 0.8 0    0.164714406472648 0.280505019800208 0.681318681318681
colorrange 1   0.164714406472648 0.280505019800208 0.681318681318681    1 0.8 0
colorrange 1   1 0.8 0    1 0.2 0
colorrange 1   1 0.2 0    1 0.8 0 

3.2 Konfigurace pro obrázek vykreslený s antialiasingem 2×2 hodnoty na pixel

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 40
ambient 0.04
antialiasing 2

# OBJ
c 0.7 -0.5 0.2 -0.1

bailout 16
maxiter 17
lvalue 0
formula 0

viewpoint 0 0 1.3
up 0 1 0
light -7 -7 -7

move 1 0.2
lxr 0.5
interocular 0

# COL
colorscheme  (sin(8*x)+sin(9*y)+sin(10*z)+3)/3  # big speckles
colorrange 1   1 0.8 0    0.164714406472648 0.280505019800208 0.681318681318681
colorrange 1   0.164714406472648 0.280505019800208 0.681318681318681    1 0.8 0
colorrange 1   1 0.8 0    1 0.2 0
colorrange 1   1 0.2 0    1 0.8 0 

3.3 Konfigurace pro obrázek vykreslený s antialiasingem 3×3 hodnoty na pixel

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 40
ambient 0.04
antialiasing 3

# OBJ
c 0.7 -0.5 0.2 -0.1

bailout 16
maxiter 17
lvalue 0
formula 0

viewpoint 0 0 1.3
up 0 1 0
light -7 -7 -7

move 1 0.2
lxr 0.5
interocular 0

# COL
colorscheme  (sin(8*x)+sin(9*y)+sin(10*z)+3)/3  # big speckles
colorrange 1   1 0.8 0    0.164714406472648 0.280505019800208 0.681318681318681
colorrange 1   0.164714406472648 0.280505019800208 0.681318681318681    1 0.8 0
colorrange 1   1 0.8 0    1 0.2 0
colorrange 1   1 0.2 0    1 0.8 0 

3.4 Konfigurace pro obrázek vykreslený s antialiasingem 4×4 hodnoty na pixel

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 40
ambient 0.04
antialiasing 4

# OBJ
c 0.7 -0.5 0.2 -0.1

bailout 16
maxiter 17
lvalue 0
formula 0

viewpoint 0 0 1.3
up 0 1 0
light -7 -7 -7

move 1 0.2
lxr 0.5
interocular 0

# COL
colorscheme  (sin(8*x)+sin(9*y)+sin(10*z)+3)/3  # big speckles
colorrange 1   1 0.8 0    0.164714406472648 0.280505019800208 0.681318681318681
colorrange 1   0.164714406472648 0.280505019800208 0.681318681318681    1 0.8 0
colorrange 1   1 0.8 0    1 0.2 0
colorrange 1   1 0.2 0    1 0.8 0 

3.5 Konfigurace pro obrázek vykreslený s antialiasingem 5×5 hodnot na pixel

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 40
ambient 0.04
antialiasing 5

# OBJ
c 0.7 -0.5 0.2 -0.1

bailout 16
maxiter 17
lvalue 0
formula 0

viewpoint 0 0 1.3
up 0 1 0
light -7 -7 -7

move 1 0.2
lxr 0.5
interocular 0

# COL
colorscheme  (sin(8*x)+sin(9*y)+sin(10*z)+3)/3  # big speckles
colorrange 1   1 0.8 0    0.164714406472648 0.280505019800208 0.681318681318681
colorrange 1   0.164714406472648 0.280505019800208 0.681318681318681    1 0.8 0
colorrange 1   1 0.8 0    1 0.2 0
colorrange 1   1 0.2 0    1 0.8 0 

4. Nastavení počtu řezů v Z-ové ose

Celkový počet řezů ve směru Z-ové osy se taktéž nastavuje na pátém listu konfiguračního formuláře – viz následující screenshot zobrazený na obrázku číslo 9. Tato hodnota má ještě větší vliv na kvalitu výsledných obrázků, než nastavení antialiasingu. Malý počet řezů má za následek vznik viditelných „schodů“ a také nekorektní výpočet osvětlení vznikající ze špatně definovaných normálových vektorů. Příliš velký počet řezů naopak komplikuje výpočty, což se projevuje v celkovém zvýšení doby vykreslování. Pro vykreslení celkového pohledu na fraktální objekt mnohdy postačuje pouze několik set řezů (300 apod.), avšak při vykreslování detailů (výřez, přiblížení) potřebný počet řezů stoupá až na několik tisíc. Ukázkové obrázky si uvedeme v následující kapitole.

fractals68_9
Obrázek 9: Formulář s nastavením počtu řezů v Z-ové ose

5. Ukázka vlivu počtu řezů na kvalitu obrázků

Na následující pětici obrázků je ukázán vliv počtu řezů na jejich kvalitu. Konfigurační soubory, pomocí kterých byly tyto obrázky vytvořeny, jsou vypsány v podkapitolách 5.1 až 5.5. Vidíme, že při velmi malém počtu řezů je obrázek nekvalitní, „schody“ jsou velké a také nebyly nalezeny všechny body na povrchu fraktálního objektu. Vyšší počet řezů sice znamenal prodloužení doby výpočtu, výsledkem je ovšem o mnoho kvalitnější obrázek.

fractals68_a
Obrázek 10: Výřez Juliovy množiny vykreslený s 250 řezy

fractals68_b
Obrázek 11: Výřez Juliovy množiny vykreslený s 500 řezy

fractals68_c
Obrázek 12: Výřez Juliovy množiny vykreslený s 1000 řezy

fractals68_d
Obrázek 13: Výřez Juliovy množiny vykreslený s 2000 řezy

fractals68_e
Obrázek 14: Výřez Juliovy množiny vykreslený s 4000 řezy

5.1 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 250 řezy

# This file was generated by 'Quat 1.01'.

resolution 800 600 250
phong 1 30
ambient 0.04
antialiasing 5

# OBJ
c -0.098039215686274 -0.5 0.8 0

bailout 300
maxiter 14
lvalue 0
formula 0

viewpoint 0 0 -2
up 0 -1 0
light -2 5 -5

move 1.0 -0.3
lxr 0.6
interocular 0

# COL
colorscheme  (sin(7*x)+sin(7*y)+sin(7*z)+3)/4  # big speckles
colorrange 1   0.189655172413793 1 0    1 0.883289124668435 0.032967032967033
colorrange 1   0.918529746115953 1 0.054945054945055    1 0 0
colorrange 1   1 0 0    0.189655172413793 1 0 

5.2 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 500 řezy

# This file was generated by 'Quat 1.01'.

resolution 800 600 500
phong 1 30
ambient 0.04
antialiasing 5

# OBJ
c -0.098039215686274 -0.5 0.8 0

bailout 300
maxiter 14
lvalue 0
formula 0

viewpoint 0 0 -2
up 0 -1 0
light -2 5 -5

move 1.0 -0.3
lxr 0.6
interocular 0

# COL
colorscheme  (sin(7*x)+sin(7*y)+sin(7*z)+3)/4  # big speckles
colorrange 1   0.189655172413793 1 0    1 0.883289124668435 0.032967032967033
colorrange 1   0.918529746115953 1 0.054945054945055    1 0 0
colorrange 1   1 0 0    0.189655172413793 1 0 

5.3 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 1000 řezy

# This file was generated by 'Quat 1.01'.

resolution 800 600 1000
phong 1 30
ambient 0.04
antialiasing 5

# OBJ
c -0.098039215686274 -0.5 0.8 0

bailout 300
maxiter 14
lvalue 0
formula 0

viewpoint 0 0 -2
up 0 -1 0
light -2 5 -5

move 1.0 -0.3
lxr 0.6
interocular 0

# COL
colorscheme  (sin(7*x)+sin(7*y)+sin(7*z)+3)/4  # big speckles
colorrange 1   0.189655172413793 1 0    1 0.883289124668435 0.032967032967033
colorrange 1   0.918529746115953 1 0.054945054945055    1 0 0
colorrange 1   1 0 0    0.189655172413793 1 0 

5.4 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 2000 řezy

# This file was generated by 'Quat 1.01'.

resolution 800 600 2000
phong 1 30
ambient 0.04
antialiasing 5

# OBJ
c -0.098039215686274 -0.5 0.8 0

bailout 300
maxiter 14
lvalue 0
formula 0

viewpoint 0 0 -2
up 0 -1 0
light -2 5 -5

move 1.0 -0.3
lxr 0.6
interocular 0

# COL
colorscheme  (sin(7*x)+sin(7*y)+sin(7*z)+3)/4  # big speckles
colorrange 1   0.189655172413793 1 0    1 0.883289124668435 0.032967032967033
colorrange 1   0.918529746115953 1 0.054945054945055    1 0 0
colorrange 1   1 0 0    0.189655172413793 1 0 

5.5 Konfigurace pro obrázek detailu 4D Juliovy množiny vykreslený s 4000 řezy

# This file was generated by 'Quat 1.01'.

resolution 800 600 4000
phong 1 30
ambient 0.04
antialiasing 5

# OBJ
c -0.098039215686274 -0.5 0.8 0

bailout 300
maxiter 14
lvalue 0
formula 0

viewpoint 0 0 -2
up 0 -1 0
light -2 5 -5

move 1.0 -0.3
lxr 0.6
interocular 0

# COL
colorscheme  (sin(7*x)+sin(7*y)+sin(7*z)+3)/4  # big speckles
colorrange 1   0.189655172413793 1 0    1 0.883289124668435 0.032967032967033
colorrange 1   0.918529746115953 1 0.054945054945055    1 0 0
colorrange 1   1 0 0    0.189655172413793 1 0 

6. Parametry generovaných fraktálů, konfigurační soubory

Všechny parametry generovaných fraktálů, včetně gradientních barvových přechodů, funkce pro mapování barev, nastavení Phongova osvětlovacího modelu atd. je možné uložit do konfiguračních souborů s koncovkou .ini. Tyto soubory mají velmi jednoduchou syntaxi: na každém řádku se nachází klíčové slovo (označení parametru) následované hodnotou či seznamem hodnot. Ty se od sebe oddělují mezerami, nikoli čárkami. Povoleny jsou i prázdné řádky a řádky obsahující poznámky, které začínají znakem „#“. Přesný popis jednotlivých parametrů je uveden v dokumentaci.

Kromě toho Quat využívá i jednu vlastnost grafického formátu PNG, kterou jsme si popsali v paralelně běžícím seriálu o grafických formátech (více informací). Jedná se o možnost vkládání aplikačně závislých informací do těchto grafických souborů. Tyto informace jsou uloženy v chunku nazvaném quAt (Quat ve skutečnosti do PNG zapíše i další informace včetně svého „podpisu“ a datumu vytvoření obrázku). Z tohoto důvodu jsem žádné obrázky vykreslené Quatem a ukázané v dnešní části seriálu nijak neupravoval (většinou totiž pro jejich zmenšení používám optimalizační program pngcrush), takže kromě textových konfiguračních souborů si nastavené parametry můžete prohlédnout i po načtení příslušných obrázků do programu Quat (musí se jednat o originály, nikoli zmenšeniny umístěné přímo v článku).

fractals68_f
Obrázek 15: Předloha pro obrázek číslo 16

7. Odkazy na další informační zdroje

  1. Etienne Martineau: On a Bicomplex Distance Estimation for the Tetrabrot
    June, 2004
  2. Etienne Martineau: 3dfractals.com:
    http://3dfrac­tals.com
  3. Les St Clair: About Anti-aliasing and Fractals
    http://www.ho­meusers.prestel­.co.uk/crosstre­es/aa.htm
  4. Damien Jones: Fractalus – Anti-aliasing and fractals:
    http://www.frac­talus.com/mis­c/antialias.htm

ict ve školství 24

fractals68_g
Obrázek 16: Zajímavě vypadá i inverzní zobrazení vypočteného obrázku se čtyřrozměrnou Juliovou množinou. Obrázek vyvolává zdání kresby airbrushem.

8. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu si povíme, jakým způsobem je možné vytvářet zajímavé plošné obrázky pomocí fraktálů počítaných na základě Lyapunova exponentu (Lyapunov exponent). Tyto fraktály je možné použít například i jako podklad pro výškové pole při tvorbě trojrozměrných modelů terénů.

ikonka

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.