Zpět na domů

CFDG jazyk pro generování obrázků Context Free

CFDG — jazyk pro Context Free umožňující generovat obrázky prostřednictvím kontextově volných gramatik. Jsou popsány základní konstrukce, transformace a příklady: fraktály, duhy, text, animované scény, stromy. Vhodný pro procedural generation v IT.

Generování obrázků v CFDG: fraktály a stromy v Context Free
Advertisement 728x90

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.

Google AdInline article slot
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í.

Google AdInline article slot

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.

Google AdInline article slot
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/else pro 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

Advertisement 728x90

Číst dál