CFDG: Kontextfreie Grammatik für prozedurale Bildgenerierung
Context Free nutzt die CFDG-Sprache (Context Free Design Grammar), um prozedurale Bildgenerierung zu beschreiben. Diese domänenspezifische Sprache basiert auf einer kontextfreien Grammatik, wobei die Grundprimitiven CIRCLE und SQUARE sind. Das Rendering erfolgt über die Anti-Grain Geometry-Bibliothek. Regeln definieren rekursive Transformationen von Formen mit Parametern wie Rotation (r), Skalierung (s), Verschiebung (x, y), Farbe (hue, sat, b), Transparenz (a) und mehr.
Die Sprache ermöglicht es, aus einfachen Beschreibungen aufwendige Fraktalstrukturen zu erzeugen. Jedes der folgenden Beispiele zeigt echte CFDG-Skripte, die beeindruckende visuelle Kompositionen hervorbringen.
Einfaches Beispiel: Fraktalmuster
Dieses erste Skript erzeugt ein symmetrisches Muster auf schwarzem Hintergrund mit sich wiederholenden Kreisen und Verläufen.
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}}
Hier startet die Regel T mit drei Ästen, die um 120° gedreht sind und jeweils S transformieren. Die S-Regeln fügen Kreise mit Helligkeits- (b) und Sättigungsverläufen (sat) hinzu, dann rekursiv skaliert (s 0.37) und nach oben verschoben (y 0.9).
Regenbogeneffekt mit Schatten
Dieses Skript erzeugt eine schimmernde Kugel mit Schatten und Lichtern durch verschachtelte Regeln.
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}
}
Wichtige Transformationen: RAINBOW_SPLIT erzeugt einen Regenbogenverlauf, während SHADOW und HIGHLIGHT Beleuchtung simulieren. Rekursion in RAINBOW_MINI mit 0,04 Wahrscheinlichkeit stoppt das Verzweigen.
Simulation antiker Texte
Dieses Skript imitiert handschriftlichen Text mit Strichen und Symbolen.
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}
}
Struktur: LINES erzeugt Zeilen mit NEWLINE, jede mit 50 CHAR. CHAR kombiniert STROKE mit Rotationen und Spiegeln. B zeichnet rekursiv Striche mit MARK (CIRCLE/SQUARE).
Animierte Szene mit Bäumen
Dieses Skript modelliert eine dynamische Szene mit zeitbasierter Animation.
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]
}
// ... (restliche Regeln für ground, stuff, block, bush, tree, stars, cloud gekürzt als Beispiel)
Regeln time und slow steuern die Animation: Rotation, Verblassen (a), Helligkeit (b). draw kompositiert Ebenen nach Z-Reihenfolge.
Fortgeschrittenes Beispiel: Prozeduraler Baum
Das komplexeste Skript erzeugt einen realistischen Baum mit Ästen und Blättern, unter Verwendung von Funktionen und Schleifen.
startshape MAIN
CF::Background = [hue 0 sat 0.84 b -0.9]
CF::MinimumSize = 1
// Globale Konstanten und Funktionen: GTreePartMove, MaxTrunkDepth() = randint(10,40), RandRange, etc.
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 ]
}
}
// ... (voller Code mit TRUNK, LEAFBUNCH, LEAFSTEM etc. definiert rekursives Verzweigen mit randint und rand)
Funktionen wie MaxTrunkDepth() und NewBranchRotation() sorgen für Randomisierung. TRUNK wächst rekursiv bis EndDepth, dann verzweigt. LEAFBUNCH simuliert Laub mit Drehungen.
Kernkonstrukte von CFDG
- Regeln (rule):
rule Shape { ... }mit Wahrscheinlichkeiten (z. B.rule S 3 {..}). - Transformationen: s (Skalierung), r (Rotation), x/y (Verschiebung), flip, z (Ebenen).
- Farbe und Effekte: hue, sat, b (Helligkeit), a (Alpha).
- Funktionen:
randint(min,max),rand(min,max),loop N. - Bedingungen:
if/elsefür Rekursion. - Start:
startshape NAME,background{}.
Wichtige Erkenntnisse
- CFDG ist eine kontextfreie Grammatik, ideal für Fraktale und L-Systeme ohne Kontextabhängigkeiten.
- Rekursion mit Wahrscheinlichkeiten und Randomisierung sorgt für Vielfalt.
- Unterstützt Z-Buffering für 2,5D-Szenen.
- GPL-lizenziert, plattformübergreifend (Windows/Mac/Linux).
- Alternativen: Structure Synth für 3D.
— Editorial Team
Noch keine Kommentare.