Hlavní navigace

Pokročilejší animace trojrozměrných L-systémů

3. 1. 2007
Doba čtení: 15 minut

Sdílet

V dnešním článku dokončíme povídání o zajímavém a užitečném programu Lparser. Na pětici příkladů si ukážeme další způsoby tvorby animací přírodních i umělých objektů včetně průběžné změny úhlu natočení želvy při vytváření 3D modelu, změny celkového počtu iterací (přepisů axiomu) a kombinaci všech dříve popisovaných metod.

Obsah

1. Trojrozměrné modely přírodních objektů a jejich animace
2. První demonstrační příklad – animace kapradiny
3. Druhý demonstrační příklad – animace modelu rostoucí květiny
4. Třetí demonstrační příklad – animace modelu visící květiny
5. Trojrozměrné modely umělých artefaktů a jejich animace
6. Čtvrtý demonstrační příklad – animace modelu Airhorse
7. Pátý demonstrační příklad – animace modelu Lsys 01
8. Obsah dalšího pokračování tohoto seriálu

1. Trojrozměrné modely přírodních objektů a jejich animace

V předchozí části tohoto seriálu jsme si ukázali základní způsob provádění animací trojrozměrných modelů L-systémů pomocí programu Lparser a raytraceru POV-Ray. Animace jsme vytvářeli tak, že jsme v definici L-systému průběžně měnili úhel, o který se želva při svém pohybu trojrozměrným prostorem natáčela okolo svého lokálního souřadného systému tvořeného vektory Forward, Up a Left. Mnoho L-systémů, které slouží pro vytvoření trojrozměrných modelů stromů či květin, používá pro konstrukci rozvětvení větví a listů přímo nastavený implicitní úhel natočení želvy. To znamená, že žádné další úpravy v definici L-systému není zapotřebí provádět (tyto úpravy by byly složité, neboť Lparser neumožňuje L-systémy parametrizovat externími parametry).

Vzhledem k tomu, že implicitní úhel větvení je možné zadat i z příkazového řádku (tj. nejenom z definičního textového souboru L-systému) pomocí parametru -a [číslo], je možné všechny soubory potřebné pro vytvoření animace získat pomocí sekvence příkazů programově generovaných například pomocí jednoduchých shellovských nebo Perlovských skriptů. V následujících kapitolách si ukážeme poněkud odlišnou tvorbu animací, která spočívá v průběžné změně maximálního počtu iterací, tj. počtu přepsání axiomu na základě zadaných přepisovacích pravidel. Všechny dále uváděné animace byly vytvořeny podle následujícího postupu:

  1. Vytvoření všech vkládaných (include) souborů, například pomocí zmiňovaného shellovského či Perlovského skriptu, který postupně volal program Lparser s různými parametry. Vzhledem k tomu, že Lparser vytváří vždy soubor pojmenovaný output.inc, je nutné pro kopii či přejmenování použít příkaz cp či mv. Výstupem tohoto kroku je sada souborů s koncovkou .inc, kde každý z těchto souborů obsahuje popis modelu L-systému pro danou sadu vstupních parametrů.
  2. Vytvoření popisu scény pro raytracer POV-Ray. Každá scéna dále uvedených demonstračních příkladů je popsána vlastním souborem .pov, ty budou vypsány v následujících podkapitolách spolu s ukázkovými obrázky a výslednými animacemi.
  3. Vyrenderování všech obrázků pomocí raytraceru POV-Ray do souborů typu TGA (Targa) při relativně velkém rozlišení. Všechny dnešní ukázky používají rozlišení 800×600 pixelů v truecolor formátu (16 milionů barev). Větší rozlišení je zvoleno z důvodu pozdějšího resamplingu – snížení rozlišení spolu s výpočtem barev pixelů pomocí bilineární interpolace.
  4. Snížení rozlišení obrázků na čtvrtinové rozlišení 400×300 pixelů. Pokud se použije resampling (bilineární či bikubická interpolace), dojde k rozmazání hran, což v důsledku vede ke znatelnému 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í 400×300 pixelů. Oproti příkladům uvedeným v předchozí části tohoto seriálu jsem zvolil poněkud větší rozlišení, aby byly patrné některé detaily ve vytvářených modelech. Výsledný soubor s videem sice přesně neodpovídá specifikaci Constrained Parameters Bitstreams (CPB), ale naprostá většina současných video přehrávačů by s těmito soubory neměla mít problémy.

2. První demonstrační příklad – animace kapradiny

Na dnešním prvním demonstračním příkladu je ukázána animace kapradiny. Animace je vytvořena velmi jednoduchým způsobem – průběžně se mění počet iterací, tj. celkový počet přepsání axiomu podle nastavených přepisovacích pravidel. Na rozdíl od průběžné změny úhlu větvení (natočení želvy) není vytvořená animace plynulá, protože každá změna počtu iterací má za následek poměrně velký zásah do vygenerovaného objektu. Z tohoto důvodu je zvolena poměrně dlouhá doba mezi jednotlivými změnami ve vytvořeném video souboru, který můžete získat zde. Při velkém počtu iterací již docházelo k překročení maximálního počtu generovaných polygonů, proto je několik posledních snímků spíše náhodných. Zdrojový soubor s definicí L-systému kapradiny má tento obsah:

# --- L-Systém s definicí kapradiny ----------------------------------
# ukázkový soubor dodávaný společně s Lparserem ve verzi pro DOS
#
20                  # recursion
20                  # angle
15                  # thickness
#
#---------------------------------------- axioms
#
#&(60)C                 # use this as axiom to test a leave
#b                  # use this as axiom to test a branch
b>(60)b>(60)b>(60)b>(60)b>(60)b      # the whole thing
#
# ---------------------------------------- rules
#
b=[&(30)A]
#
A=~(7)$t(.1)F[+(40)C][-(40)C]!(.95)~(7)t(.1)FA
#
C=~(10)$tF[+(60)L][-(60)L]C
#
L=[~(15)cc{-f+f+f-|-f+f}]
#
F='(1.3)F'(.77)
f='(1.3)f'(.77)
#
@                                       # konec definice modelu
#                                       # finito 

fractals61_1

Obrázek 1: Snímek z animace kapradiny vytvořené průběžnou změnou počtu iterací

fractals61_2

Obrázek 2: Snímek z animace kapradiny vytvořené průběžnou změnou počtu iterací

fractals61_3

Obrázek 3: Snímek z animace kapradiny vytvořené průběžnou změnou počtu iterací

fractals61_4

Obrázek 4: Snímek z animace kapradiny vytvořené průběžnou změnou počtu iterací

Následuje výpis souboru obsahujícího popis scény určené pro známý raytracer POV-Ray:

// 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"

// š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  <3000 , 3000, 3000>
    direction <0, 0, 2.0>
    look_at   <0, 1000, 0>
}

// nastavení světelného zdroje
object {
    light_source {
        <3000, 3000, 180>
        color White
    }
}

// objekt tvořící "podlahu" s nanesenou texturou
object {
    plane {y, -500}
    texture {
        pigment {
            bozo
            turbulence 0.2
            color_map {
               [0.000, 0.171   color red  0.725  green  0.659  blue  0.455  filter  0.000
                               color red  0.682  green  0.549  blue  0.420  filter  0.000]
               [0.171, 0.274   color red  0.682  green  0.549  blue  0.420  filter  0.000
                               color red  0.557  green  0.451  blue  0.322  filter  0.000]
               [0.274, 0.393   color red  0.557  green  0.451  blue  0.322  filter  0.000
                               color red  0.725  green  0.659  blue  0.455  filter  0.000]
               [0.393, 0.564   color red  0.725  green  0.659  blue  0.455  filter  0.000
                               color red  0.682  green  0.549  blue  0.420  filter  0.000]
               [0.564, 0.701   color red  0.682  green  0.549  blue  0.420  filter  0.000
                               color red  0.482  green  0.392  blue  0.278  filter  0.000]
               [0.701, 1       color red  0.482  green  0.392  blue  0.278  filter  0.000
                               color red  0.725  green  0.659  blue  0.455  filter  0.000]
            }
            scale <20, 20, 20>
            scale 20
        }
        scale 4
        finish {
            phong 0.9
            ambient 0.5
            diffuse 0.7
        }
    }
    scale 3
}

// tvar bázového objektu, kterým jsou tvořeny 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 "0.inc"

// finito 

3. Druhý demonstrační příklad – animace modelu rostoucí květiny

Také dnešní druhá demonstrační animace je vytvořena výše naznačeným způsobem, při kterém se postupně zvyšuje počet iterací, tj. celkový počet přepsání axiomu na základě zadaných přepisovacích pravidel. Výsledné video je však v tomto případě mnohem zajímavější, protože použitý model L-systému květiny je při malém počtu iterací složen pouze z větví a teprve při dosažení určitého počtu iterací (6 a více) se postupně začínají objevovat i listy. Květina tak jakoby postupně obrůstá listím a současně i mohutní. L-systém obsahující definici rostoucí květiny má následující podobu:

# --- L-Systém s definicí rostoucí květiny -----------------------
# ukázkový soubor dodávaný společně s Lparserem ve verzi pro DOS
40
10
100
P>(90)'P>(90)'P>(90)'P
P=[&&&FFFFFFFFFD]
D=FtFtFtFtFtF[L]%'!(.9)D
L=[&[ccA][ccB]]
A=[+tA{.].C.}
B=[-tB{.].C.}
C=gC
@                                       # konec definice modelu
#                                       # finito 

fractals61_5

Obrázek 5: Snímek z animace květiny vytvořené průběžnou změnou počtu iterací

fractals61_6

Obrázek 6: Snímek z animace květiny vytvořené průběžnou změnou počtu iterací

fractals61_7

Obrázek 7: Snímek z animace květiny vytvořené průběžnou změnou počtu iterací

fractals61_8

Obrázek 8: Snímek z animace květiny vytvořené průběžnou změnou počtu iterací

Popis trojrozměrné scény určené pro program POV-Ray má tvar:

// 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"

// šestnáct barev, které se mohou v objektech vyskytovat
#declare col_0  = colour red 1.0 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  <300 , 300, 300>
        direction <0, 0, 2.0>
        look_at   <0, 70, 0>
}

// nastavení světelného zdroje
object {
    light_source {
        <800, 300, 500>
        color White
    }
}

// objekt tvořící "podlahu" s nanesenou texturou
object {
    plane {y, -10}
    texture {
        pigment {
            color rgb<0.684, 0.684, 0.712>
        }
        normal {
            bumps 0.1000
            turbulence 0.500
            omega 2.000
            lambda 0.500
        }
        finish {
            diffuse 0.500
            ambient 0.200
            specular 0.400
            roughness 0.2930
        }
        scale 30
    }
}

// tvar bázového objektu, kterým jsou tvořeny 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 "0.inc"

// finito 

4. Třetí demonstrační příklad – animace modelu visící květiny

Na dnešním třetím videu je zobrazena jednoduchá animace visící květiny („blázen“), opět s využitím postupné změny maximálního počtu iterací. Podobně jako v předchozím příkladu, i zde se květina postupně rozvijí od pouhého zárodku květináče až po celou rostlinu. Definiční soubor použitého L-systému má tvar:

# --- L-Systém s definicí visící květiny ("blázen") --------------------------
# ukázkový soubor dodávaný společně s Lparserem ve verzi pro DOS
10
20
#90
20
G
G=^(180){[A]+(90)f-(90)>(90)[A]+(90)f-(90)>(90)[A]+(90)f-(90)>(90)[A]}
A=[C][a]
C={[s+(90)s+(90)s+(90)s<(+35)-(120)s-(120)s][F^(15)+(15)ss+(150)ss]}
a={[d]}{[e]}
d=[f+(90)f+(90)f+(90)f<(+35)-(120)f-(120)f][f^(15)+(15)ff+(150)ff]
#
q=[p][>(90)-(90)g(50).+(90)c(4)?(1)[x]]>(90)-(90)g(100).+(90)[p]
p=sp
s={ij[+Zh]<(90)ij[-Zh]}
i=Z+(5)i
j=Z-(5)j
k=Z{[+++l.][++ll.][+lll.][llll.][-lll.][--ll.][---l.]}
h=cZZZt(3.2)$[++[++ZZk]ZZk][--[--ZZk]ZZk]ZZk
x=Z(60)!(0.90)x
l=t!g
@                                       # konec definice modelu
#                                       # finito 

fractals61_9

Obrázek 9: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

fractals61_a

Obrázek 10: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

fractals61_b

Obrázek 11: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

fractals61_c

Obrázek 12: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

fractals61_d

Obrázek 13: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

fractals61_e

Obrázek 14: Snímek z animace visící květiny vytvořené průběžnou změnou počtu iterací

Popis trojrozměrné scény s visící květinou určené pro raytracer POV-Ray má tvar:

// 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"

// šestnáct barev, které se mohou v objektech vyskytovat
#declare col_0  = colour red 0.2 green 0.5 blue 0.196078;
#declare col_1  = colour red 0.5 green 0.5 blue 0.5;
#declare col_2  = colour red 1.0 green 0.2 blue 0.196078;
#declare col_3  = colour red 0.2 green 0.8;
#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  <400 , 200, 400>
    direction <0, 0, 2.0>
    look_at   <0, -150, 0>
}

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

// objekt tvořící "podlahu" s nanesenou texturou
object {
    plane {y, -100}
    texture {
        pigment {
            bozo
            turbulence 0.4
            color_map {
                [0.000, 0.171   color red  0.725  green  0.659  blue  0.455  filter  0.000
                color red  0.682  green  0.549  blue  0.420  filter  0.000]
                [0.171, 0.274   color red  0.682  green  0.549  blue  0.420  filter  0.000
                color red  0.557  green  0.451  blue  0.322  filter  0.000]
                [0.274, 0.393   color red  0.557  green  0.451  blue  0.322  filter  0.000
                color red  0.725  green  0.659  blue  0.455  filter  0.000]
                [0.393, 0.564   color red  0.725  green  0.659  blue  0.455  filter  0.000
                color red  0.682  green  0.549  blue  0.420  filter  0.000]
                [0.564, 0.701   color red  0.682  green  0.549  blue  0.420  filter  0.000
                color red  0.482  green  0.392  blue  0.278  filter  0.000]
                [0.701, 1       color red  0.482  green  0.392  blue  0.278  filter  0.000
                color red  0.725  green  0.659  blue  0.455  filter  0.000]
            }
            scale <20, 20, 20>
                scale 20
        }
        scale 4
        finish {
            phong 0.9
            ambient 0.5
            diffuse 0.7
        }
    }
    scale 3
}

// 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
}

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

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

// finito 

5. Trojrozměrné modely umělých artefaktů a jejich animace

V dnešní části seriálu si navíc ukážeme také dvě animace trojrozměrných modelů umělých artefaktů. Vzhledem k tomu, že tyto modely nemusí představovat žádné reálné předměty, mohou i jejich animace být zvoleny s větší svobodou, než v případě „otrockého“ kopírování přírodních objektů. V první animaci je objekt vytvořen pomocí implicitních ploch (nazývané také blobs či metaballs), druhá animace využívá klasického způsobu reprezentace povrchu – elipsoidů a polygonů.

6. Čtvrtý demonstrační příklad – animace modelu Airhorse

Na čtvrtém videu je zobrazena animace L-systému nazvaného Airhorse. Při tvorbě animace se měnil úhel otáčení želvy z hodnoty 0° na hodnotu 90°. Po dosažení pravého úhlu došlo k postupnému zpětnému snižování až na původních 0°. Trojrozměrný model je vygenerovaný pomocí implicitních ploch (blobs, metaballs); z tohoto důvodu nejsou na snímcích viditelné žádné listy, pouze koncové body větví. Definice tohoto systému, která je uvedena v dalším odstavci, je obsažena v DOSovské verzi programu Lparser 1:

# --- L-Systém s definicí objektu Airhorse --------------------------
# ukázkový soubor dodávaný společně s Lparserem ve verzi pro DOS
18                  # recursion level
10                  # basic angle
200                 # starting thickness
C                   # axiom
#-------------------------------------- Creature
C=LBW
#-------------------------------------- Body
B=[[''aH]|[g]]
a=Fs+;'a                # upper part
g=Ft+;'g                # lower part
s=[::cc!!!!&&[FFcccZ]^^^^FFcccZ]    # upper spikes
t=[c!!!!&[FF]^^FF]          # lower spikes
#-------------------------------------- Lungs
L=O                 # 8 recursions delay
O=P
P=Q
Q=R
R=U
U=X
X=Y
Y=V
V=[cc!!!&&&&&&&&&[Zp]|[Zp]]
p=h>>>>>>>>>>>>h>>>>>>>>>>>>h
h=[++++!F'''p]
#-------------------------------------- Head
H=[cccci[>>>>>dcFFF][<<<<<ecFFF]]
d=Z!&Z!&:'d             # left
e=Z!^Z!^:'e             # right
i=-:"i
#-------------------------------------- Wing
W=[%[!!cb][<<<!!cb][>>>!!cb]]
b=Fl!+Fl+;'b                # arc
l=[-cc{--z++z++z--|--z++z++z}]
#-------------------------------------- End
@                                       # konec definice modelu
#                                       # finito 

fractals61_f

Obrázek 15: Snímek z animace L-systému Airhorse vytvořené průběžnou změnou úhlu natočení želvy

fractals61_g

Obrázek 16: Snímek z animace L-systému Airhorse vytvořené průběžnou změnou úhlu natočení želvy

fractals61_h

Obrázek 17: Snímek z animace L-systému Airhorse vytvořené průběžnou změnou úhlu natočení želvy

fractals61_i

Obrázek 18: Snímek z animace L-systému Airhorse vytvořené průběžnou změnou úhlu natočení želvy

3D scéna pro zobrazení L-systému Airhorse pomocí programu POV-Ray je popsána následujícím kódem:

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

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

// nastavení kamery
camera {
    location  <90 , 70, 130>
    direction <0, 0, 2.0>
    look_at   <0, 10, 0>
}

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

// textura pro podlahu
#declare White_Marble1 = texture {
    pigment {
        marble
        color_map {
            [ 0.000  color rgb<0.900, 0.900, 0.900> ]
            [ 0.800  color rgb<0.500, 0.500, 0.500> ]
            [ 1.000  color rgb<0.200, 0.200, 0.200> ]
        }
        turbulence 1.000
    }
}

// otexturovaná podlaha
object {
    plane {y, -1}
    texture {White_Marble1}
    scale 300
}

// vložení objektu vytvořeného programem Lparser
object {
    blob {
        threshold 0.5
#include "0.inc"
        sturm
    }
    finish {
        ambient 0.3
        diffuse 0.7
        phong 1
    }
    pigment {
        color Sienna
    }
}

// finito 

7. Pátý demonstrační příklad – animace modelu Lsys 01

Na pátém a současně i posledním videu je zobrazena animace L-systému nazvaného jednoduše Lsys 01. Tento L-systém je k dispozici po stažení DOSovské verze Lparseru 1. Opět je prováděna průběžná změna úhlu natočení želvy od 0° až po 90°, přičemž oba krajní úhly vedou k tvorbě degenerovaného modelu. Vytvářený model obsahuje větve i listy, proto je zvolen výstup ve formátu polygonů a elipsoidů, nikoli implicitních ploch (metaballs, blobs). Definice L-systému nazvaného Lsys 01 má následující tvar:

# --- L-Systém s definicí objektu Lsys 01 --------------------------
# ukázkový soubor dodávaný společně s Lparserem ve verzi pro DOS
12
10
80
[c|H]C[ccc>>>>>>>>>[TcccF][OcccF]]
C=FR-C
R=[cc^^^^^^^^^BcH][cc&&&&&&&&&BcH]
B=F++!B
L=[c{--z++z++z--|--z++z++z}]
H=[^^^SL]%[^^^SL]>>>H
S=Z!S
T=Z+^![&&&&&&&&&L]:T
O=Z-^![&&&&&&&&&L]:O
@                                       # konec definice modelu
#                                       # finito 

fractals61_j

Obrázek 19: Snímek z animace L-systému Lsys 01 vytvořené průběžnou změnou úhlu natočení želvy

fractals61_k

Obrázek 20: Snímek z animace L-systému Lsys 01 vytvořené průběžnou změnou úhlu natočení želvy

fractals61_l

Obrázek 21: Snímek z animace L-systému Lsys 01 vytvořené průběžnou změnou úhlu natočení želvy

fractals61_m

Obrázek 22: Snímek z animace L-systému Lsys 01 vytvořené průběžnou změnou úhlu natočení želvy

Trojrozměrná scéna pro zobrazení L-systému Lsys 01 pomocí raytraceru POV-Ray je popsána následujícím kódem:

CS24_early

// 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  <90, 70, 90>
    direction <0, 0, 2.0>
    look_at   <0, 10, 0>
}

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

// textura podlahy
#declare PinkAlabaster1=texture {
    pigment {
        bozo
        color_map {
            [ 0.000  color rgb<0.900, 0.750, 0.750> ]
            [ 1.000  color rgb<0.600, 0.600, 0.600> ]
        }
        turbulence 0.250
        scale     <0.4000, 0.4000, 0.4000>
    }
    finish {
        ambient 0.250
    }
}

// zobrazení podlahy
plane { y, -20
    texture {PinkAlabaster1
        scale 100
    }
}

// tvar bázového objektu, kterým jsou tvořeny 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 "0.inc"

// finito 

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

V následujícím pokračování tohoto seriálu si uvedeme základní informace o tvorbě fraktálů v hyperkomplexním, tj. čtyřrozměrném (4D) prostoru. Vysvětlíme si zejména význam hyperkomplexních čísel a quaternionů, které hrají v počítačové grafice poměrně význačnou roli, a to nejenom při vykreslování fraktálních útvarů.

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.

Byl pro vás článek přínosný?

Autor článku

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