CFDG : grammaire sans contexte pour la génération procédurale d'images
Context Free utilise le langage CFDG (Context Free Design Grammar) pour décrire la génération procédurale d'images. Ce langage spécifique au domaine repose sur une grammaire sans contexte, avec des primitives de base comme CIRCLE et SQUARE. Le rendu est assuré par la bibliothèque Anti-Grain Geometry. Les règles définissent des transformations récursives de formes avec des paramètres tels que la rotation (r), l'échelle (s), la translation (x, y), la couleur (hue, sat, b), la transparence (a), et bien d'autres.
Ce langage permet de générer des structures fractales complexes à partir de descriptions simples. Chaque exemple ci-dessous présente de vrais scripts CFDG produisant des compositions visuelles époustouflantes.
Exemple de base : Motif fractal
Ce premier script crée un motif symétrique sur fond noir avec des cercles répétés et des dégradés.
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}}
Ici, la règle T lance trois branches tournées de 120°, chacune transformant S. Les règles S ajoutent des cercles avec des dégradés de luminosité (b) et de saturation (sat), puis réduisent récursivement l'échelle (s 0.37) et décalent vers le haut (y 0.9).
Effet arc-en-ciel avec ombres
Ce script génère une sphère chatoyante avec ombres et reflets grâce à des règles imbriquées.
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}
}
Transformations clés : RAINBOW_SPLIT crée un dégradé arc-en-ciel, tandis que SHADOW et HIGHLIGHT simulent l'éclairage. La récursion dans RAINBOW_MINI avec une probabilité de 0,04 arrête la branche.
Simulation de textes anciens
Ce script imite un texte manuscrit à l'aide de traits et de symboles.
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}
}
Structure : LINES génère des rangées de NEWLINE, chacune avec 50 CHAR. CHAR combine STROKE avec rotations et renversements. B dessine récursivement des traits via MARK (CIRCLE/SQUARE).
Scène animée avec arbres
Ce script modélise une scène dynamique avec animation temporelle.
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]
}
// ... (règles restantes pour ground, stuff, block, bush, tree, stars, cloud abrégées pour l'exemple)
Les règles time et slow contrôlent l'animation : rotation, fondu (a), luminosité (b). draw compose les calques par ordre Z.
Exemple avancé : Arbre procédural
Le script le plus complexe génère un arbre réaliste avec branches et feuilles, en utilisant fonctions et boucles.
startshape MAIN
CF::Background = [hue 0 sat 0.84 b -0.9]
CF::MinimumSize = 1
// Constantes et fonctions globales : 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 ]
}
}
// ... (code complet avec TRUNK, LEAFBUNCH, LEAFSTEM etc. définissant une branche récursive avec randint et rand)
Des fonctions comme MaxTrunkDepth() et NewBranchRotation() ajoutent de l'aléatoire. TRUNK grandit récursivement jusqu'à EndDepth, puis branche. LEAFBUNCH simule le feuillage avec torsions.
Éléments de base de CFDG
- Règles (rule) : rule Shape { ... } avec probabilités (ex. : rule S 3 {..}).
- Transformations : s (échelle), r (rotation), x/y (translation), flip, z (calques).
- Couleur et effets : hue, sat, b (luminosité), a (alpha).
- Fonctions : randint(min,max), rand(min,max), loop N.
- Conditionnels : if/else pour récursion.
- Démarrage : startshape NAME, background{}.
Points clés
- CFDG est une grammaire sans contexte, idéale pour fractales et systèmes L sans dépendances contextuelles.
- Récursion avec probabilités et aléatoire assure la variété.
- Supporte le Z-buffering pour scènes 2,5D.
- Sous licence GPL, multiplateforme (Windows/Mac/Linux).
- Alternatives : Structure Synth pour 3D.
— Editorial Team
Aucun commentaire pour le moment.