홈으로 돌아가기

이미지 생성을 위한 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, 기타, 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 NAME, background{}.

주요 요점

  • CFDG는 컨텍스트 의존성이 없는 프랙탈과 L-시스템에 완벽한 컨텍스트 프리 문법입니다.
  • 확률과 무작위화가 포함된 재귀가 다양성을 보장합니다.
  • 2.5D 장면을 위한 Z-버퍼링 지원.
  • GPL 라이선스, 크로스플랫폼(Windows/Mac/Linux).
  • 대안: 3D를 위한 Structure Synth.

— Editorial Team

Advertisement 728x90

다음 읽기