본문 바로가기

생명의 철학

3차원 린덴마이어 시스템인 L-system 4의 소개(2001.4)

 

 

 

3차원 린덴마이어 시스템인 L-system 4의 소개

 

L-system 4  다운받기

L-system Hompage

 

 

이것은 Laurens Lapre가 만든 DOS버젼의 L-system 소프트웨어인 <lapser>를 Timothy C. Perz가 WINDOW버젼으로 바꾼 것이다.강력한 기능에도 불구하고 인터페이스가 불편했던 것을 상당한 부분 해소시켜 사용하기에 편리하게 만들었다.지금 버전5까지 나와있다.

3차원 형태로 구동됨으로 명령어가 앞의  Biofractal에 비해서 상당히 복잡하다.여기서는 이것의 사용방법을 소개한다기 보다 우선 내가 이해할 목적으로 정리해 보았다.간단한 몇가지 명령어와 그것의 의미를 간단히 살펴보기로 한다.

이하의 내용들은 이 소프트웨어의 help메뉴속에 들어 있는 것을 근간으로해서 쓴 것이다.우선 화면을 잠깐 살펴보자.

우선 file메뉴에서 확장자 .ls로 된 파일 하나를 열어 보자.Leaves.ls를 열었다.그러면 윈도우창에 편집창이 뜬다.여기에 적혀 있는 기호들은 Leaves를 만들어내는 명령문이다.그전에 이 명령문들의 의미를 알기 위해서 상단 팝업메뉴의 Options의 Show Help Panel을 선택해 두자.그러면 위 그림에서 보듯이 윈도우창의 우측에 명령문의 리스트들이 뜬다.

편집창의 우측 하단의 Generate를 클릭하면 새로운 보기창(ViewForm)이 뜨면서 이 명령문을 실행해서 그림을 출력한다.

이것은 3차원상에서 움직인다.설명할 필요도 없겠지만 좌측에 회전단추와 이동단추가 있다.회전단추의 화살표 ↓↑←→는 앞,뒤,좌,우로 회전시키는 조작단추이다.마우스로 그 단추를 누르고 있으면 그림이 회전한다.우측에 그림상태를 선택하는 단추가 있다.frame은 線畵이고 solid는 3차원적 묘사인데 지금  solid가 선택된 상태이다.우측 하단의 color는 배경화면을 선택하는 것이다.지금 검은색이 선택된 상태이다.

 

생성규칙

 

이것은 편집창이다.첫째줄은 반복횟수를 규정하고 둘째줄은 각도 그리고 셋째줄은 선의 두께를 규정한다.그리고 넷째줄은 공리를 규정하고 다섯째줄 이하는 생성규칙을 규정한다.물론 다섯째줄 이하는 그 줄의 수가 얼마이든 상관없다.마지막에 규칙의 종료를 나타내기 위해서 반드시 @을 써넣어야 한다. #으로 표시된 것은 편집자가 참고하기 위한 것으로 프로그램실행에 아무런 영향도 미치지 않는다.

 

이것을 정리하면 다음과 같다.

 

The number of recursions                                          (Line 1)                

The default angle used for orientation commands      (Line 2)

The default line thickness used for drawing               (Line 3)

Axiom (Start string)                                                    (Line 4)

Rule 1 (1st Substring which acts on axiom )               (Line 5)

             .

             .

             .

Rule N (Nth Substring which acts on axiom )           (Line N+4)

"@"  (End of Rules Marker )                                    (Line N+5)

 

 

L-대상 만들기

 

우리가 먼저 이해해야할 중요한 것은 L-system하의 대상들은 3차원 공간속에 방향을 갖는다는 것이다.아래 그림을 보자.

 

 

2차원에서는 전,후가 없지만 3차원은 전후의 공간의 깊이를 갖는다.화면의 전방(그림의 →방향)에서 내가 이것을 보고 있다고 상상하자.내 앞으로 기울어지는 방향을 +방향으로 약속하고 뒤로 기울어지는 것을 -방향으로 약속한다.

이것을 측면에서 보면 시계반대방향이 +이고 시계방향이 -이다.이 방향의 의미를 실제 L-대상을 만들면서 살펴보자.

한 예로서 편집창에 다음 명령어를 입력해 보자.

 

2

25

50

F

@

 

이제 Generate를 클릭해 이 결과를 보자.다음과 같은 기둥을 보게 될 것이다.이제 다음과 같은 명령어를 입력해 보자.

 

2

25

50

+F

@

 

 

결과를 머릿속에 미리 그려보자.앞의 F가 +F로 바뀌어 있다.나를 향해서 25도 기울여져 있을 것이다.-F를 입력하면 나의 반대방향으로 25도 뒤로 기울어져 있을 것이다.보기창은 3차원 회전이 가능함으로 화면의 좌측 키를 조작해 확인해 볼 수 있다.

명령어의 첫째줄은 반복계산(recursion)의 횟수를 의미한다.다음 예를 보자.

 

4          #반복횟수

25

50

A           #공리

A=+FA    #규칙

@

 

이것은 4회 반복한다.이것은 아래와 같은 것을 의미한다.

 

Loop1   +F           A=+F                 

Loop2   +F+F        A =+F+F

Loop3   +F+F+F      A=+F+F+F

Loop4   +F+F+F+F    A=+F+F+F+F

 

이것의 형태가 어떨까를 상상해 보자.반복횟수가 4이므로 앞서의 원기둥이 4개로 되어 있을 것이고 +방향으로 25도이므로 시계반대방향으로 25도씩 기울어짐으로 각 단위기둥 마다 25도씩 기울어져 측면에서 보면 아래 그림과 같은 형태를 취하고 있을 것이다. 이것을  -FA의 경우와 비교해 보자.

좌측 +FA,우측 -FA

 

이 둘을 한 대상으로 나타내면 어떻게 될까? 아래 문장은 그것을 나타내고 있다,

 

4

25

50

AB

A=+FA

B=-FB

@

 

 

이것은 +F+F+F+F-F-F-F-F인 경우다.이것을 머릿속에 상상해 본다음 실행시켜 보자.

+F+F+F+F-F-F-F-F의 형태가 되는 이유는 우리가 이것의 공리를 AB로 주었기 때문이다.그래서 +FA가 만들어진 다음 -FA가 만들어진다.그러나 우리는 이것을 연속된 형태가 아니고 2개의 분지된 가지로 만들 수 있다.이 기호가 앞서 소개한

[ ]이다.이것은 일단 분지한 다음 분지전의 위치와 방향으로 복귀한다.아래 문장을 보자.

 

4

25

50

[A][B]

A=+FA

B=-FB

@

 

최종결과는 [+F+F+F+F][-F-F-F-F]가 될 것이다.이 그림이 어떤 모습일까를 생각해 보자.밑에서 시작해서 +방향으로 가지를 치고 다시 출발점으로 돌아와서 -방향으로 가지를 칠 것이다.이 문장을 편집창에 입력한 다음 그 결과를 확인해 보자.

3차원 공간에서는 방향이 넷이 있다.다른 2개의 방향을 규정해 주는 것이 명령어 ^와 &이다. 이것을 사용해서 다음 문장을 실행해 보자.

 

4

25

50

[A]c[B]c[C]c[D]

A=+FA

B=-FB

C=^FC

D=&FD

@

 

여기서 소문자 c는 color명령어로 A,B,C,D에 각기 다른 칼러를 지정해주는 것이다.이것은 장식용이기 때문에 위 문장에서 빼버려도 형태는 그대로 유지된다.

자연적 대상에 보다 근사하게 접근하기 위해서는 반복적 회귀(recursion)의 수를 더 늘려야 한다.그렇게 되면 가지에 가지가 분지되고 다시 가지의 가지에 가지가 분지되는 식으로 프랙탈의 형태를 닮아 갈 것이다.아래 문장을 보자.

8

25

50

E

E=[A][B][C][D]

A=c+FAE

B=c-FBE

C=c^FCE

D=c&FDE

@

 

여기서 보면 E가 모든 가지 A,B,C,D에 삽입되어 있다.그러므로 예컨대 A는 FA[A][B][C][D]가 되는 셈이다.그리고 다른 B,C,D도 마찬가지이다.(앞의 소문자c는 칼러바꾸기 기능이므로 신경쓸 필요가 없다.)이것이 어떤 형태일까를 상상해 보자.4개의 가지가 갈라지고 그 4개의 가지 각각에 또 4개의 가지가 들어 있다.부분속에 전체가 반영되는 프랙탈 구조임을 알 수 있다.이것을 실행시켜서 그것을 확인해 보자.전체 형태가 머릿속에 잘 그려지지 않는가? 그럼 아래 동화상을 보자.

 

 

이것을 프랙탈이라고 한다.그러면 프랙탈 곡선의 가장 간단한 사례로서 앞서 2차원상에서 검토해본 코흐곡선을 이 3차원 L-system에서 구현해 보자.다음 문장을 편집창에 입력하자.

 

4      # no need for deep recursion yet.

45     # the angle of 45 degrees.

50     # well... 50 is a good thickness.

A      # The axiom (for now).

A=++F-F++F-F--

@

 

그리고 실행하면 우측과 같은 그림이 뜰 것이다.이게 무엇인지 당황할 필요가 없다.측면으로 돌려보면 예의 코흐곡선의 가장 간단한 단위가 나타날 것이다.이것은 앞서 익숙한 형태와는 달리 세워져 있고 삼각형의 뾰족한 부분은 뒤로 물러나 있다.이것은 A=++F-F++F-F--의 규칙이 만들어낸 결과이다.아래 그림은 그것을 보여주고 있다.

전체 형태가 보이도록 측면으로 약간 돌렸다.규칙을 --F+F--F+F++로 바꾸면 들어가 있던 뾰족한 부분이 앞으로 튀어 나온다.실제 실행해 보고 이 규칙의 차이가 무엇을 의미하는지를 생각해 보면 L-system의 3차원 공간의 방향에 대해 감을 잡는데 도움이 될 것이다.

L-system이 초기조건을 세로로 서도록 프로그램 했는지 그 이유는 알 수 없지만(아마 나의 무지의 소치이겠지..) 가로로 눕도록 프로그램 했다면 훨씬 더 이해하기 쉬웠을 것이다.그러면 아래 그림과 같이 될 것이다.

 

이제 다음 코흐곡선의 3차원 모형을 만들어 보자.

 

 

 

세로로 세워진 형태로 뜨는데 비교를 위해서 가로로 회전시켰다.편집창에 다음 문장을 입력하면 3차원 코흐곡선의 형태가 만들어진다.

 

4

45

50

B

A=++F-F++F-F--

B=A-A++A-A

@

 

이 문장과 단위 코흐곡선을 만들 때의 문장을 비교해 보면 여기에는B=A-A++A-A가 삽입되어 있고 공리는 A가 아니고 B이다.이것은 무엇을 의미하는 것일까?B의 각 A에  A값 ++F-F++F-F--을 대입하라는 것이다.그러므로 이것은 ++F-F++F-F---++F-F++F-F--++++F-F++F-F---++F-F++F-F--을 의미한다.그러므로 번거롭겠지만 다음과 같이 입력해도 똑같은 결과를 얻을 수 있다.

 

4

45

50

A

A=++F-F++F-F---++F-F++F-F--++++F-F++F-F---++F-F++F-F--

@

 

이 기법을 더 확대할 수 있다.아래와 같이 입력하면 된다.

4

45

50

D

A=++F-F++F-F--

B=A-A++A-A

C=B-B++B-B

D=C-C++C-C

@

 

앞서 4개의 단위 코흐곡선이 만들어졌지만 여기서는 이것을 3번 반복하고 있으므로 4×4×4=64개의 단위 코흐곡선이 만들어질 것이다.

 

이제 앞서 검토했던 나무구조의 3차원적 형태를 검토해 보겠다.다음 문장을 편집창에 입력해 보자.그러면 좌측의 원기둥이 만들어질 것이다.

 

5

45

10

F

@

 

좌우에 가지가 나는데 줄기와 가지의 비율이

이라고 하자.말하자면 줄기가 가지치기를 하면서
(=0.701..)의 비율로 줄어드는 나무를 생각해 보자.이것을 생성하는 문장은 다음과 같다.

 

5

45

10

A

A=F[+'(0.7071)F][-'(0.7071)F]

@

 

여기서 기호 '(0.7071)은 0.7071의 비율로 줄어든다는 것을 의미한다.그 의미는 메인창의 팝업메뉴의 options의 show help panel을 클릭해 두면 우측에 명령어가 뜨는데 거기서 확인할 수 있다.이 문장이 무엇을 의미하는지를 알 수 있을 것이다.줄기를 1로 했을 때 0.701의 길이에 해당하는 줄기가 앞뒤로 45도의 각도로 돋아난다는 것을 의미한다.실행시켜 보면 그냥 막대기만 보이는데 가지가 앞뒤로 나서 뒤 가지가 정면에서 보이지 않기 때문이다.약간 측면으로 회전시키면 위 그림과 같은 가지를 볼 수 있다.

이것을 아래와 같이 표현해도 동일한 결과를 얻을 수 있을 것이다.

 

5

45

10

A

A=F[+BF][-BF]

B='(0.7071)

@

 

그런데 이 식은 반복계산을 구성하기에 편리하다.가지치기가 계속됨에 따라 0.7071×0.7071×0.7071...의 비율로 가지의 길이가 계속 줄어들고 이럴수록 이것은 실제의 나무에 근사하게 닮아간다.위의 식을 다음과 같이 변형시키면 이 효과를 얻을 수 있다.

 

5

45

10

A

A=[+BFA][-BFA]

B='(0.7071)

@

 

 

 

가지가 앞뒤로만 나 있고 좌우로 없는 것은 비현실적이다.다음 조건을 줌으로써 앞뒤좌우의 4방향으로 가지가 나 있는 나무를 만들 수 있다.문장을 자세히 보면 A가 A속에 들어 있는 프랙탈 구조임을 알 수 있다.

 

 

5

45

10

A

A=[+BFA][-BFA][^BFA][&BFA]

B='(0.7071)

@

 

 

지금까지 기본적인 몇가지 명령문들에 대해서 알아 보았다.이 소프트웨어 안에는 적지 않은 수의 파일들이 내장되어 있다.이것들을 실행하면서 구체적 적용의 기술을 익힐 수 있을 것이다.