Hlavní navigace

Animace a mutace modelů L-systémů

Pavel Tišnovský

V dnešním článku si ukážeme pokročilejší způsoby modifikace vytvářených objektů. Bude se jednat o aplikaci gravitace, kterou je vhodné použít zejména na modely přírodních struktur (stromů, keřů, květin), a mutace, které mění zapisovaná pravidla a vnáší tak do L-systémů jistý prvek náhodnosti. Nakonec si ukážeme slibovanou tvorbu animací.

Obsah

1. Aplikace vlivu gravitace na vytvářené modely
2. Příklady aplikace gravitace
3. Mutace objektů
4. Příklad mutace trojrozměrného modelu stromu
5. Tvorba jednoduchých animací
6. Animace stromu
7. Animace rozvinutí květiny
8. Obsah dalšího pokračování tohoto seriálu

1. Aplikace vlivu gravitace na vytvářené modely

V předchozí části tohoto seriálu jsme si ukázali základy tvorby trojrozměrných modelů stromů i jiných rostlin (například keřů či květin) pomocí programu Lparser (L-System Parser/Mutator). V případě modelů stromů a květin je mnohdy velmi těžké pouze pomocí přepisovacích gramatik nasimulovat ohyb větví směrem k zemi, který v přírodě nastává vlivem gravitace. Kdyby bylo tento ohyb, který do značné míry přispívá k reálnějšímu vzhledu modelů, nutné „ručně“ specifikovat v přepisovacích pravidlech, musela by se želva při vytváření každé větve zorientovat vůči globálnímu souřadnému systému, provést mírné natočení směrem k zemi a posléze provést zpětnou transformaci a pokračovat v pohybu.

Naštěstí jsme při použití Lparseru této ruční práce ušetřeni, ovšem je nutné říci, že zdaleka ne všechny aplikace určené pro vytváření trojrozměrných modelů L-systémů nabízejí stejnou funkcionalitu. Díky speciálním symbolům, které je možné do přepisovaných řetězců i axiomu vkládat, tyto poměrně složité operace s želvou vykreslující větve a listy nemusíme dělat, postačí pouze na vhodných místech v pravidlech tyto symboly použít. Konkrétně se jedná o následující symbol, který se může použít ve dvou formách, jednou bez parametru (pak je použita implicitní hodnota) a podruhé s parametrem:

Symbol Příkaz
t aplikace vlivu gravitace s koeficientem 0,2
t(x) aplikace vlivu gravitace s koeficientem nastaveným na x

Na první čtveřici obrázků je ukázán model stromu vzniklý ze stejného L-systému, ovšem s různými koeficienty gravitace. V prvním případě nebyla na model aplikována žádná gravitace, ve druhém případě byl koeficient gravitace nastaven na hodnotu 0,3, ve třetím na hodnotu 0,6 a konečně ve čtvrtém případě na hodnotu 0,9 (koeficient gravitace se nerovná tíhovému zrychlení, které známe z fyziky!). Z obrázků je patrné, že gravitace výsledný model do značné míry ovlivňuje, i když ostatní úhly větvení ani délky či tloušťky větví se nemění.

fractals60_1

Obrázek 1: Model stromu vzniklý z L-systému, kde nebyla provedena aplikace gravitace

fractals60_2

Obrázek 2: Model stromu vzniklý z L-systému s aplikací gravitace s koeficientem rovným hodnotě 0,3

fractals60_3

Obrázek 3: Model stromu vzniklý z L-systému s aplikací gravitace s koeficientem rovným hodnotě 0,6

fractals60_4

Obrázek 4: Model stromu vzniklý z L-systému s aplikací gravitace s koeficientem rovným hodnotě 0,9

V následující kapitole si ukážeme, jakým způsobem je možné gravitaci na modely (resp. jejich části) aplikovat.

2. Příklady aplikace gravitace

Symbol „t“ resp. „t(x)“ (kdy x je reálné číslo, typicky v rozsahu <0, 1>) se může v přepisovacích pravidlech objevit na prakticky libovolném místě. Zpravidla však má reálný smysl tyto symboly vložit do míst, ve kterých dochází k rozvětvení (v případě stromů) či ke vzniku listu v případě květin. Každý výskyt symbolu „t“ znamená, že se želva natočí o malý úhel směrem k zemi, tj. ve směru záporné osy z. To je důležité, protože další příkazy otáčející želvou se vztahují k lokálnímu souřadnému systému. Pokud má být symbol „t(x)“ se stejnou hodnotou x vkládán do více míst přepisovacích gramatik, bývá vhodnější pro něj vytvořit samostatné přepisovací pravidlo, které může vypadat například následovně:

T=t(0.3) 

Ve všech přepisovacích pravidlech a/nebo axiomu, kde chceme aplikovat vliv gravitace, se potom zapisuje pouze symbol „T“, což je přehlednější a umožňuje nám to změnit koeficient gravitace pouze na jednom místě. Právě tento způsob byl využit i L-systému, kterým byly vytvořeny první čtyři ilustrační obrázky. Následuje výpis definice tohoto L-systému, který vychází z ukázkového souboru tree03.ls, jenž je dostupný po stažení DOSovské verze Lparseru:

# Vytvoření trojrozměrného modelu stromu
# na jehož větve působí gravitace.
# Koeficient gravitace je specifikován
# v přepisovacím pravidlu "T"
13                      # hloubka rekurze
10                      # implicitní úhel natočení želvy
100                     # tloušťka větví
#
FFFFFFFFFF>(1)&(1)A     # axiom
#
T=t(.9)                 # pravidlo se specifikací koef. gravitace
A=!(.75)TFB>(94)B>(132)B
B=[&"T!(.75)FL[|zL]$AL[|zL]]
#
L=[~ccf(2)|{+(30)f(4)-(120)f(4)-(120)f(4)}]
@                       # konec specifikace objektu 

Z tohoto L-systému byl pomocí přepínačů -v -c vygenerován soubor output.inc, který byl použit v následujícím popisu scény určeného pro raytracer POVRay:

// Popis scény získaný modifikací ukázkového souboru
// setup2.pov dodávaného k aplikaci Lparser

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
#include "skies.inc"

// šestnáct barev, které se mohou v objektech vyskytovat
#declare col_0  = colour red 0.5 green 0.5 blue 0.196078;
#declare col_1  = colour red 0.5 green 0.5 blue 0.5;
#declare col_2  = colour red 0.5 green 0.5 blue 0.196078;
#declare col_3  = colour red 1.0 green 1.0;
#declare col_4  = colour red 0.2 green 0.7 blue 0.1;
#declare col_5  = colour blue 1.0 green 1.0;
#declare col_6  = colour blue 1.0;
#declare col_7  = colour red 1.0 blue 1.0;
#declare col_8  = colour red 0.439216 green 0.858824 blue 0.576471;
#declare col_9  = colour red 1.0 green 0.498039 blue 0.0;
#declare col_10 = colour red 0.258824 green 0.258824 blue 0.435294;
#declare col_11 = colour red 0.6 green 0.196078 blue 0.8;
#declare col_12 = colour red 0.439216 green 0.576471 blue 0.858824;
#declare col_13 = colour red 0.556863 green 0.137255 blue 0.137255;
#declare col_14 = colour red 0.858824 green 0.858824 blue 0.439216;
#declare col_15 = colour red 0.623529 green 0.623529 blue 0.372549;

// nastavení kamery
camera {
    location  <330, 330, 220>
    direction <0, 0, 2.0>
    look_at   <0, 110, 0>
}

// nastavení světelného zdroje
object {
    light_source {
        <250, 400, 100>
        color White
    }
}

// textura země
#declare GROUND =
texture {
    pigment {
        color rgbf <0.400, 0.600, 0.000, 0.000>
        turbulence <0.520, 0.600, 0.360>
    }
    // simulace zvlněné plochy
    // procedurální úpravou normálového vektoru
    normal {
        ripples   1.000
        octaves   8.400
        frequency 4.000
    }
    finish {
        phong 0.900 reflection 0.0
    }
    scale 2
}

// zobrazení země
plane { y, 0
    texture {GROUND
        scale 300
    }
}

// zobrazení koule s nanesenými mraky
// (textura obsahuje průhledné části)
sphere {<0,0,0> 600
    texture {T_Cloud2
        scale 100
    }
}

// další koule, tentokrát s texturou mlhy
// (textura obsahuje průhledné části)
sphere {<0,0,0> 490
    texture {T_Cloud1
        scale 100
    }
}

// mezi mraky se prosvěcuje špinavě modrá
// obloha nanesená na kouli o větším poloměru
sphere {<0,0,0> 710
    pigment {
        color rgbf <0.2, 0, 0.8, 0>
    }
}

// tvar bázového objektu, který tvoří větve
#declare l_base = object { sphere { <0, 0.75, 0> 0.75 } }

// textury pro objekty tvořící větve a listy
#declare t_base = finish { ambient 0.3 diffuse 0.7 phong 1 }
#declare t_leaf = finish { ambient 0.3 diffuse 0.7 }

// vložení objektu vygenerovaného programem Lparser
#include "output.inc"

// finito 

Další ukázku vlivu gravitace si předvedeme v navazující části, ve které se budeme věnovat tvorbě složitějších animací. I změnu koeficientu vlivu gravitace je totiž možné animovat a v některých případech jsou výsledky opravdu působivé.

3. Mutace objektů

Další důležitou součástí Lparseru je takzvaný mutátor, který je možné použít pro náhodnou změnu generovaných objektů. Například při požadavku na vytvoření skupiny stromů (třeba malého lesíku) se nemusí každý strom generovat ručně pomocí jiné sady přepisovacích pravidel, ale je možné použít jeden L-systém, na který jsou aplikovány mutace. Ty probíhají jednoduchým způsobem: do přepisovacích pravidel jsou ještě před jejich použitím vloženy na náhodná místa symboly, které se již v pravidlech vyskytují (může se jednat buď o standardní symboly sloužící ke změně pozice a orientace želvy nebo o levé strany přepisovacích pravidel). V závislosti na náhodné funkci nemusí dojít k přidání symbolu, ale k jeho změně. Výsledkem je v každém případě pozměněný L-systém, který je možné použít pro tvorbu tvarově modifikovaných modelů, které si však uchovávají rysy základního (nezmutovaného) objektu.

Aplikace mutace je velmi jednoduchá, stačí při zavolání programu Lparser použít přepínač -u, za který se uloží kladné číslo obsahující počet aplikovaných mutací, např. -u 2. Většinou se aplikuje jedna či dvě mutace, protože při jejich větším počtu hrozí, že se díky použití levých stran přepisovacích pravidel generování „zacyklí“, což může vést k obrovským výsledným souborům obsahujících i více než milion objektů. Zmutovaný L-systém je uložen do souboru mutation.ls, takže je ho možné použít pro další zpracování, například pro další mutace.

4. Příklad mutace trojrozměrného modelu stromu

Jako příklad aplikace mutace jsem zvolil demonstrační L-systém, který je v DOSovské verzi Lparseru uložený v definičním souboru tree11.ls. Po odstranění nevýznamných poznámek a bílých znaků má tento L-systém následující definici:

12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

A model vytvořený z tohoto L-systému vypadá následovně:

fractals60_5

Obrázek 5: Model stromu definovaného v L-systému tree11.ls

Po aplikaci mutace (buď jedné nebo dvou) mohou vzniknout například následující L-systémy. Musíme si však uvědomit, že při každé mutaci vzniká pokaždé odlišný L-systém, protože se změní jiný symbol v přepisovacích pravidlech. Z tohoto důvodu je pro jeho rekonstrukci nutné zachovat vygenerovaný soubor mutation.ls, který je neustále přepisován. Všimněte si například zajímavého obrázku číslo 9, kde je strom jakoby obtočen nějakou popínavou rostlinou.

12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)xg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_6

Obrázek 6: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)z(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_7

Obrázek 7: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=aL
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_8

Obrázek 8: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[y~(5)FSx]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_9

Obrázek 9: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=af
y=bx
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_a

Obrázek 10: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d<(30)~(5)FRR[[C]Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=[D]+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_b

Obrázek 11: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FRR[Ba]d>(30)~(5)FRR[Ba]d<([F]30)!(.8)S
R=[Ba]d>(120)T
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-D
x=a
y=b
F='(1.25)F'(.8)
L=[~f(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_c

Obrázek 12: Zmutovaný model stromu definovaného v L-systému tree11.ls
12
5
30
T
T=[F~(5)FSd]
S=~(5)FzR[Ba]d>(30)~(5)FRR[Ba]d>(30)!(.8)S
R=[Ba]d>(120)
a=~(10)$F[Cxd]~(10)$Fd!(.8)b
b=~(10)$F[Dyd]~(10)$Fd!(.8)a
d=[g(25)g(1)Lg(1)Lg(1)Lg(1)Lg(1)Lg(1)L]
B=&B
C=+C
D=-S
x=a
y=b
F='(1.25)F'(.8)
L=[~C(7)cc{+(30)f(15)-(120)f(15)-(120)f(15)}]
f=z
z=_
@ 

fractals60_d

Obrázek 13: Zmutovaný model stromu definovaného v L-systému tree11.ls

5. Tvorba jednoduchých animací

S pomocí Lparseru je možné poměrně jednoduchým způsobem modely L-systémů rozpohybovat – animovat. V dnešní části si ukážeme tvorbu dvou animací. První bude animace stromu, při které se průběžně mění úhel rozvětvení. Druhou animací je rozvinutí květiny, taktéž realizované postupně modifikovaným úhlem rozvětvení. Vzhledem k tomu, že implicitní úhel větvení je možné zadat i z příkazového řádku (pak se „přebije“ hodnota nastavená v definičním souboru L-systému), lze všechny soubory potřebné pro vytvoření animace získat pomocí sekvence příkazů generovaných například následujícím céčkovým programem (ten jako argument vyžaduje jméno L-systému, jež se má animovat), nebo je možné pro tuto činnost použít i skriptovací prostředky shellu, programovací jazyk Python, Perl apod.:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int i;
    for (i=0; i<=90; i++) {
        printf("lparser -v -c -a %02d %s\n", i, argv[1]);
        printf("cp output.inc %02d.inc\n", i);
    }
    return 0;
} 

Obě dvě dále uvedené animace byly vytvořeny následujícím postupem:

  1. Vytvoření všech vkládaných (include) souborů, například pomocí výše uvedeného programu. Vzhledem k tomu, že Lparser vytváří vždy soubor output.inc, je nutné pro kopii či přejmenování použít příkaz cp či mv.
  2. Vytvoření popisu scény pro raytracer POV-Ray (bude uvedeno v následujících dvou kapitolách).
  3. Vyrenderování všech obrázků pomocí raytraceru POV-Ray, například do souborů typu TGA (Targa) při relativně velkém rozlišení, třeba 704×576 pixelů. Větší rozlišení je zvoleno z důvodu pozdějšího resamplingu.
  4. Snížení rozlišení souborů na standardní rozlišení 352×288 pixelů, což odpovídá Constrained Parameters Bitstreams (CPB) standardu MPEG-1. Pokud se použije resampling, dojde k rozmazání hran, což v důsledku vede ke zvýšení kompresního poměru.
  5. Vytvoření video souboru ve formátu MPEG-1, který má 25 snímků za sekundu a rozlišení 352×288 pixelů, což odpovídá televiznímu standardu PAL (ve skutečnosti jde o poloviční rozlišení televizního snímku bez prokládání).

6. Animace stromu

První ukázková animace je vytvořena s využitím demonstračního L-systému uloženého v souboru tree03.ls. Úhel větvení je postupně měněn z 0° až do 90°. Výsledkem je animace „rozvinutí“ větví z kmene. Vzhledem k tomu, že byl zvolen výstup ve formátu implicitních ploch (blobů, metaballs), nejsou na stromu viditelné žádné listy. Celou animaci uloženou ve formátu MPEG-1 si můžete prohlédnout po kliknutí na tento odkaz. Následuje výpis popisu 3D scény použitý pro renderování v POV-Rayi. Za tímto výpisem je model stromu vykreslený pro některé typické úhly větvení.

// Popis scény získaný modifikací ukázkového souboru
// setup.pov dodávaného k aplikaci Lparser

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
#include "skies.inc"

// nastaveni pozice kamery a smeru pohledu
camera {
    location  <130, 100, 120>
    direction <0, 0, 2.0>
    look_at   <0, 40, 0>
}

// nastaveni svetelneho zdroje
object {
    light_source {
        <200, 140, 100>
        color White
    }
}

// textura zeme
#declare GROUND =
texture {
    pigment {
        color rgbf <0.000, 1.000, 0.500, 0.000>
        turbulence <0.520, 0.600, 0.360>
    }
    // simulace zvlnene plochy
    // proceduralni upravou normaloveho vektoru
    normal {
        ripples   1.000
        octaves   8.400
        frequency 4.000
    }
    finish {
        phong 0.900 reflection 0.0
    }
    scale 0.5
}

// zobrazeni zeme
plane { y, -00
    texture {GROUND
        scale 300
    }
}

// zobrazeni koule s nanesenymi mraky
// (textura obsahuje pruhledne casti)
sphere {<0,0,0> 340
    texture {T_Cloud1
        scale 40
    }
}

// mezi mraky se prosvecuje ciste modra
// obloha nanesena na kouli o vetsim polomeru
sphere {<0,0,0> 350
    pigment {
        color rgbf <0, 0, 1, 0>
    }
}

// nas renderovany objekt
object {
    blob {
        threshold 0.5
#include "0.inc"
       sturm     // nastavit presny vypocet pruseciku s metaballs
    }
    finish {
        ambient 0.3
        diffuse 0.7
        phong 1   // "nalestena" kura stromu :-)
    }
    pigment {
        color Sienna
    }
}

// finito 

fractals60_e

Obrázek 14: Model stromu pro větvení nastavené na 0°

fractals60_f

Obrázek 15: Model stromu pro větvení nastavené na 30°

fractals60_g

Obrázek 16: Model stromu pro větvení nastavené na 45°

fractals60_h

Obrázek 17: Model stromu pro větvení nastavené na 60°

fractals60_i

Obrázek 18: Model stromu pro větvení nastavené na 90°

7. Animace rozvinutí květiny

Podobným způsobem byla vytvořena i animace rozvíjející se květiny. Tentokrát byla použita definice L-systému uložená v souboru passie.ls a pro renderování byl vygenerován trojrozměrný model složený z trojúhelníků a nikoli z implicitních ploch (proto jsou zobrazeny i listy). Vytvořenou animaci si můžete prohlédnout zde. Popis scény pro raytracer POV-Ray má tvar:

// Popis scény získaný modifikací ukázkového souboru
// setup.pov dodávaného k aplikaci Lparser

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
#include "skies.inc"

// sestnact zakladnich barev, ktere se mohou v modelech vyskytovat
#declare col_0  = colour red 0.8 green 0.498039 blue 0.196078
#declare col_1  = colour red 0.5 green 0.5 blue 0.5
#declare col_2  = colour red 1.0
#declare col_3  = colour red 1.0 green 1.0
#declare col_4  = colour red 0.2 green 0.7 blue 0.1
#declare col_5  = colour blue 1.0 green 1.0
#declare col_6  = colour blue 1.0
#declare col_7  = colour red 1.0 blue 1.0
#declare col_8  = colour red 0.439216 green 0.858824 blue 0.576471
#declare col_9  = colour red 1.0 green 0.498039 blue 0.0
#declare col_10 = colour red 0.258824 green 0.258824 blue 0.435294
#declare col_11 = colour red 0.6 green 0.196078 blue 0.8
#declare col_12 = colour red 0.439216 green 0.576471 blue 0.858824
#declare col_13 = colour red 0.556863 green 0.137255 blue 0.137255
#declare col_14 = colour red 0.858824 green 0.858824 blue 0.439216
#declare col_15 = colour red 0.623529 green 0.623529 blue 0.372549

// nastaveni kamery

camera {
    location  <860, 850, 560>
    direction <0, 0, 2.0>
    look_at   <0, 200, 0>
}

// nastaveni svetelneho zdroje

object {
    light_source {
        <1000, 800, 500>
        color White
    }
}

// textura zeme
#declare GROUND =
texture {
    pigment {
        color rgbf <0.500, 0.500, 0.000, 0.000>
        turbulence <0.520, 0.600, 0.360>
    }
    // simulace zvlnene plochy
    // proceduralni upravou normaloveho vektoru
    normal {
        ripples   1.000
        octaves   8.400
        frequency 4.000
    }
    finish {
        phong 0.900 reflection 0.0
    }
    scale 2
}

// zobrazeni zeme
plane { y, -100
    texture {GROUND
        scale 300
    }
}

// zobrazeni koule s nanesenymi mraky
// (textura obsahuje pruhledne casti)
sphere {<0,0,0> 1500
    texture {T_Cloud3
        scale 100
    }
}

// mezi mraky se prosvecuje ciste modra
// obloha nanesena na kouli o vetsim polomeru
sphere {<0,0,0> 1510
    pigment {
        color rgbf <0, 0, 1, 0>
    }
}

// bazovy objekt (tvar vetvi)

#declare l_base = object {
    sphere {
        <0, 0.75, 0> 0.75
    }
}

// textury bazoveho objektu (vetvi) a listu

#declare t_base = finish {
    ambient 0.3 diffuse 0.7 phong 1
}
#declare t_leaf = finish {
    ambient 0.3 diffuse 0.7
}

// vlozeni datoveho souboru vygenerovaneho Lparserem
#include "output.inc"

// finito 

fractals60_j

Obrázek 19: Model stromu pro větvení nastavené na 0°

fractals60_k

Obrázek 20: Model stromu pro větvení nastavené na 15°

fractals60_l

Obrázek 21: Model stromu pro větvení nastavené na 30°

fractals60_m

Obrázek 22: Model stromu pro větvení nastavené na 45°

fractals60_n

Obrázek 23: Model stromu pro větvení nastavené na 60°

fractals60_o

Obrázek 24: Model stromu pro větvení nastavené na 75°

fractals60_p

Obrázek 25: Model stromu pro větvení nastavené na 90°

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

V následujícím pokračování tohoto seriálu naše povídání o zajímavém a užitečném programu Lparser dokončíme. Ukážeme si další způsoby tvorby animací, včetně průběžné změny délky a tloušťky větví a animované modifikace koeficientu gravitace.

Našli jste v článku chybu?

20. 12. 2006 8:59

No, já vánoce moc nemusím, ale stromeček už je nějaký ten rok hotový. Vizte http://www.fit.vutbr.cz/~tisnovpa/pov/pov2.html uprostřed. Možná by bylo lepší zvýšit o jedničku počet přepisování a vyrenderovat ho pomocí trojúhelníkových entit a ne blobů.

A jaký L-systém byl použit:

10
30
40
#
A
#
A=aaSaaSA
S='(.8)!(.9)
a=tF[&'(.8)!LBL]>(137)[z&'(.7)!LBL]>(137)
B=tF[-'(.8)!(.9)$LCL]'!(.9)C
C=tF[+'(.8)!(.9)$LBL]'!(.9)B
#
L=[~cc{+(30)f(1)-(120)f(1…

20. 12. 2006 2:30

musim rict ze sem cekal ze tu bude nejaky ten vanocni stromecek
120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

DigiZone.cz: Sat novinky: slovenská TV8 HD i ruský NTV Mir

Sat novinky: slovenská TV8 HD i ruský NTV Mir

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Vitalia.cz: Test na HIV je zdarma i za pět set

Test na HIV je zdarma i za pět set

DigiZone.cz: V Plzni odstartovalo Radio 1

V Plzni odstartovalo Radio 1

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR