CFDG: kontextově volná gramatika pro procedurální generování obrázků
Context Free využívá jazyk CFDG (Context Free Design Grammar) k popisu procedurálního generování obrázků. Jedná se o doménově orientovaný jazyk s kontextově volnou gramatikou, kde základní primitivy tvoří CIRCLE a SQUARE. Renderování je realizováno prostřednictvím knihovny Anti-Grain Geometry. Pravidla definují rekurzivní transformace tvarů s parametry: rotace (r), škálování (s), posun (x, y), barva (hue, sat, b), průhlednost (a) a další.
Jazyk umožňuje generovat složité fraktální struktury z jednoduchých popisů. Každý příklad níže ukazuje reálné CFDG skripty, které vytvářejí vizuální kompozice.
Základní příklad: fraktální vzor
První skript vytváří symetrický vzor na černém pozadí s opakujícími se kruhy a gradenty.
startshape T
// FLIGIZ
background{b -1}
tile {s 2.5}
rule T {3*{r 120 hue 30}S{x .3}}
rule S 3{CIRCLE{hue 30}4*{r 20 b.007 sat .1}S[s.3.7y.9]}
rule S {CIRCLE{hue 15}9*{r 20 b.05 hue -3}S[s.3.7y.9]}
rule S {S{flip 90}}
Zde pravidlo T spouští tři větve s rotací 120°, každá transformuje S. Pravidla S přidávají kruhy s gradientem jasu (b) a sytosti (sat), poté rekurzivně zmenšují měřítko (s 0.37) a posouvají nahoru (y 0.9).
Duhový efekt s stíny
Skript generuje třpytivou kouli se stíny a odlesky prostřednictvím vnořených pravidel.
startshape START
rule START {
CIRCLE{}
RAINBOW_SPLIT{hue 0 sat 0 b 0}
RAINBOW_SPLIT{r 180 hue 120 sat 0}
}
rule RAINBOW_SPLIT{
RAINBOW{}
}
rule RAINBOW_SPLIT{
RAINBOW_MINI{alpha -.9 y -.4 s .2 flip 1 b -1}
RAINBOW{}
}
rule RAINBOW{
SHADOW{}
CIRCLE{}
HIGHLIGHT{
RAINBOW_SPLIT{hue 1.5 sat .1 s .99 b .001 x .09 r 2.8}
}
}
rule RAINBOW_MINI{
SHADOW{}
CIRCLE{}
HIGHLIGHT{}
RAINBOW_MINI{alpha .1 hue 2 s .98 x .3 r 2.8}
}
rule RAINBOW_MINI .04{
SHADOW{}
CIRCLE{}
HIGHLIGHT{}
RAINBOW_MINI{flip 1 alpha .1 hue 5 s .99 x .3 r 2.8}
}
rule SHADOW {
CIRCLE{hue 3 b -1 sat -.6 s 1.1 y .04 alpha -.7}
}
rule HIGHLIGHT {
CIRCLE{ hue 3 b .7 sat -.3 s .98 y .05}
CIRCLE{ hue 3 b 2 sat -.7 s .9 y .01}
}
Klíčové transformace: RAINBOW_SPLIT vytváří duhový gradient, SHADOW a HIGHLIGHT modelují osvětlení. Rekurze v RAINBOW_MINI s pravděpodobností 0.04 zastavuje větvení.
Simulace starověkých textů
Tento skript imituje rukopisný text pomocí čar a symbolů.
background { hue 40 sat 0.2 b -0.2}
startshape LINES
rule LINES {
20 * {y -90} NEWLINE {hue 90 sat 0.7 b 0.2 a -0.5}
}
rule NEWLINE {
LINE {y 0}
}
rule NEWLINE {
LINE {y 20}
}
rule NEWLINE {
LINE {y 30}
}
rule LINE {
50 * {x 36} CHAR {}
}
rule CHAR 0.3 { }
rule CHAR {
2 * {x 20 flip 180} STROKE {r 90}
2 * {y 20 flip 180} STROKE {}
}
rule CHAR {
4 * {r 60} STROKE {}
}
rule CHAR {
STROKE {r 90}
3 * {y 10 flip 180} STROKE {}
}
rule STROKE {
B {}
}
rule STROKE {
B {flip 90}
}
rule B 30 {
MARK {}
B {x .6 r 10}
}
rule B 30 {
MARK {}
B {x .6 r 3}
}
rule B 250 {
MARK {}
B {x .9}
}
rule B 10 {
MARK {}
B {flip 90}
}
rule B 10 { }
rule MARK 3 {
CIRCLE {}
}
rule MARK {
CIRCLE {s 2}
}
rule MARK {
SQUARE {s 3}
}
rule MARK {
CIRCLE {s 4}
}
rule MARK 0.01 {
CIRCLE {s 7}
}
Struktura: LINES generuje řádky NEWLINE, každý s 50 CHAR. CHAR kombinuje STROKE s rotacemi a zrcadlením (flip). B rekurzivně kreslí čáry MARK (CIRCLE/SQUARE).
Animovaná scéna se stromy
Skript modeluje dynamickou scénu s animací času.
background{b -1} startshape init
rule init{time{z 0 r -90 sat .5 |h 220}}
rule time 40 {draw{} time{r 1 s .9991 b .1| a .1|}}
rule time {slow{|b -1 |a 1 |sat 1}}
rule time {slow{|b 1 |a -1 |sat 1}}
rule slow 20 {draw{} slow{ r 1 s .9991 b .03| a .03| h -1}}
rule slow {time{|sat -1}}
rule draw{
SQUARE[z 0 x 1 s .27 .018 x -.5 a 1 h 1|]
stars{z 1 x .91}
cloud[z 2 x .83 s .17 x .5 h .7| a 1 sat .3|]
ground[z 3 x .73 s .1 x .5]
}
// ... (zbytečná pravidla pro ground, stuff, block, bush, tree, stars, cloud zkrácena pro příklad)
Pravidla time a slow řídí animaci: rotace, vyblednutí (a), jas (b). draw skládá vrstvy podle Z-pořadí.
Pokročilý příklad: procedurální strom
Nejsložitější skript generuje realistický strom s větvemi a listy, využívá funkce a cykly.
startshape MAIN
CF::Background = [hue 0 sat 0.84 b -0.9]
CF::MinimumSize = 1
// Globální konstanty a funkce: GTreePartMove, MaxTrunkDepth() = randint(10,40), RandRange, atd.
shape MAIN {
rule 1 {
SKY [ z -2 s 100 ]
SUN [ z -1 s 400 ]
TREE [ x -0.1 y -0.75 ]
GRASS [ x -1 y -1 ]
}
}
// ... (plný kód s TRUNK, LEAFBUNCH, LEAFSTEM atd. definuje rekurzivní větvení s randint a rand)
Funkce jako MaxTrunkDepth() a NewBranchRotation() přidávají náhodnost. TRUNK rekurzivně roste do EndDepth, pak se větví. LEAFBUNCH simuluje koruny s kroucením.
Hlavní konstrukce CFDG
- Pravidla (rule):
rule Shape { ... }s pravděpodobnostmi (např.rule S 3 {..}). - Transformace: s (škálování), r (rotace), x/y (posun), flip, z (vrstvení).
- Barva a efekty: hue, sat, b (jas), a (alfa).
- Funkce:
randint(min,max),rand(min,max),loop N. - Podmínky:
if/elsepro rekurzi. - Start:
startshape JMÉNO,background{}.
Co je důležité
- CFDG je kontextově volná gramatika, ideální pro fraktály a L-systémy bez kontextu.
- Rekurze s pravděpodobnostmi a náhodností zajišťuje rozmanitost.
- Podpora Z-bufrování pro 2.5D scény.
- Licence GPL, multiplatformní (Win/Mac/Linux).
- Alternativy: Structure Synth pro 3D.
— Editorial Team
Zatím žádné komentáře.