返回首页

CFDG 生成图像语言 Context Free

CFDG — Context Free 的语言,通过上下文无关文法生成图像。描述基本构造、变换和示例:分形、彩虹、文本、动画场景、树木。适合 IT 中的程序生成。

CFDG 中的图像生成:Context Free 中的分形和树木
Advertisement 728x90

CFDG:用于程序化图像生成的上下文无关文法

Context Free 使用 CFDG(Context Free Design Grammar,上下文无关设计文法)语言来描述程序化图像生成。这种领域特定语言采用上下文无关文法,基本图元包括 CIRCLE(圆)和 SQUARE(方块)。渲染引擎基于 Anti-Grain Geometry 库。规则定义了形状的递归变换,支持参数如旋转(r)、缩放(s)、平移(x, y)、颜色(hue, sat, b)、透明度(a)等。

这种语言能从简单描述生成复杂的分形结构。下面的每个示例都展示了真实的 CFDG 脚本,能产出惊艳的视觉效果。

基础示例:分形图案

这个脚本在黑色背景上创建对称图案,使用重复圆形和渐变效果。

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

这里,规则 T 启动三个旋转 120° 的分支,每个分支变换 S。S 规则添加圆形,并应用亮度(b)和饱和度(sat)渐变,然后递归缩放(s 0.37)并向上平移(y 0.9)。

彩虹效果与阴影

这个脚本使用嵌套规则生成闪烁的球体,带有阴影和高光。

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

关键变换:RAINBOW_SPLIT 创建彩虹渐变,SHADOW 和 HIGHLIGHT 模拟光照。RAINBOW_MINI 中的 0.04 概率递归停止分支。

Google AdInline article slot

模拟古籍文本

这个脚本使用笔画和符号模仿手写文本。

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

结构:LINES 生成多行 NEWLINE,每行含 50 个 CHAR。CHAR 结合 STROKE 并施加旋转和翻转。B 递归绘制笔画,使用 MARK(CIRCLE/SQUARE)。

带树木的动画场景

这个脚本模拟动态场景,支持基于时间的动画。

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]
}
// ... (ground, stuff, block, bush, tree, stars, cloud 等规则省略)

规则 time 和 slow 控制动画:旋转、渐隐(a)、亮度(b)。draw 按 Z 序合成图层。

高级示例:程序化树木

最复杂的脚本生成逼真的树木,包括分支和叶片,使用函数和循环。

startshape MAIN
CF::Background = [hue 0 sat 0.84 b -0.9]
CF::MinimumSize = 1
// 全局常量和函数:GTreePartMove, MaxTrunkDepth() = randint(10,40), RandRange 等。
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 ]
}
}
// ... (完整代码包含 TRUNK, LEAFBUNCH, LEAFSTEM 等,定义递归分支,使用 randint 和 rand)

函数如 MaxTrunkDepth() 和 NewBranchRotation() 引入随机性。TRUNK 递归生长至 EndDepth,然后分枝。LEAFBUNCH 模拟叶丛,带扭曲效果。

CFDG 核心语法

  • 规则 (rule)rule Shape { ... },支持概率(如 rule S 3 {..})。
  • 变换:s(缩放)、r(旋转)、x/y(平移)、flip、z(图层)。
  • 颜色与效果:hue、sat、b(亮度)、a(透明度)。
  • 函数randint(min,max)rand(min,max)loop N
  • 条件:if/else 用于递归控制。
  • 起始startshape NAMEbackground{}

核心要点

  • CFDG 是上下文无关文法,完美适合分形和 L-系统,无上下文依赖。
  • 带概率和随机化的递归确保多样性。
  • 支持 Z 缓冲,实现 2.5D 场景。
  • GPL 许可,跨平台(Windows/Mac/Linux)。
  • 替代方案:Structure Synth(3D)。

— Editorial Team

Advertisement 728x90

继续阅读