Phyllotaxis

관리자
2019-07-17
조회수 304






17년 6월 8일 시네마4D 유저그룹 세미나를 진행했는데

Jake Wegesin의 Volume Fields 영상을 보여드리고 질문받은 내용 중에

"볼륨 필드를 어떻게 지오메트리에 적용 하나요?"

라는 질문을 받았습니다. 세미나 시간이 부족해 그 자리에서 설명을 못드렸었죠.

그래서 다음에 Volume Fields 영상과 같이 지오메트리에 볼륨필드를 적용해서 공유해야겠다는 생각을 했습니다.


그래서 어제 Volume Fields 영상과 같이 한번 구현해보려 시도하였습니다.

제일 마음에 드는 씬이 꽃과 알로에 등 자연에서 자주 보이는 패턴중 하나인 Phyllotaxis를 활용한 씬 이였습니다.



이 패턴을 후디니에서 어떻게 구현하는지는 예전에 l-system을 공부한적이 있어서 대략 알고있었습니다. 

황금비율(golden ratio)과 황금각도(golden angle)를 이용하는 방법인데 후디니에서 vex로 구현 해보았습니다.

(실제로 자연에서 꽃잎이나 잎들이 자랄때 각도가 약 137.5도 정도 나오는게 정말 신기합니다.)



이 내용은 칸아카데미의 유튜브 영상 에서 너무 쉽게 설명해주기에 글로 보시는 것보다. 영상으로 보시는걸 추천드립니다.


우선 황금비율은 위 그림처럼 어떤 선분을 나누었을때 

긴 선분(a)와 짧은 선분(b)의 비가 전체 길이(a+b)과 긴 선분(a) 의 비와 같을 때 황금비율이라 정하고 있습니다.

즉, a+b : a = a : b 이고

Φ(golden ratio) = a+b / a = a / b 라고 할 수 있습니다.

이를 정리하면 Φ = 1 + ( 1 / Φ ) 이고 근의 공식을 활용하면 황금비율을 구할 수 있습니다. 

(1 + sqrt(5))/2




golden ratio를 알아냈으면 golden angle을 알아내는건 쉽습니다.

선분이 아니라 원의 각도에서 황금비율을 적용하면 전체각도(360도)를 전체선분(a+b)이라 치고,

360 : a = a : b

정리하면, 360 / a = a / b, a / b 는 위에서 Φ(golden ratio)와 동일하므로 

360 / a = Φ

이 식으로 황금각도(b, 약 137.5도)를 구할 수 있습니다.

 360 - b = a 이므로 황금각도는 b = 360( 1 +Φ  )

위 내용을 활용하여 golden ratio와 golden angle을 vex로 구했습니다. 

(각도의 맨 마지막 -1은 무시)


반복문(for)으로 내가 원하는 갯수의 포인트를 만들어 주는데,

포인트의 각도는 포인트를 추가함에 따라 계속 golden angle을 더해주고,

지름의 경우에는 for문에서 (현재 반복(i) / 전체 반복(count))으로 설정하여 반복 될 수록 지름이 증가하고, 1에 수렴하도록 정해줬습니다.


vex 코드로 구현

여기서 생성되는 포인트의 포지션을 정해줄때

우리는 각도와 반지름을 알기때문에 극좌표를 알 수 있고, 극좌표는 직교좌표로 변환해주면

포지션 = (반지름 * cos(각도) , 0 , 반지름 * sin(각도) )으로 설정하면 됩니다. (x,z축 기준). 위키백과

3차원상에서는 또 하나의 각도와 축이 늘어나 (원통좌표계, 구면좌표계) 좌표변환이 약간 더 복잡해집니다. 위키백과


Phyllotaxis를 후디니에서 표현


이제 이 포인트를 이용해 원하는 모델링에 보로노이 다이어그램을 적용해주면 영상에서 본 패턴의 지오메트리가 만들어 집니다. 위키백과

그리고 본 질문 내용인..

볼륨필드를 지오메트리에 활용하는 방법은 많은데 제가 여기서 사용한 방법은

volume slice를 한 뒤 나오는 지오메트리를 xyzdist 함수로 가까운 면의 attribute를 가져오는 방법 입니다.

(point cloud를 활용하는 등 여러가지 방법이 있습니다.)



Volume slice로 볼륨의 단면을 지오메트리화 시킨 뒤

아까만든 패턴에 xyzdist 함수로 density를 가져와 높이와 컬러에 적용시키면 됩니다.


xyzdist 함수로 density를 가져와 포지션에 적용

density의 범위를 수정하여 컬러에 적용



결국.. 질문과 다른곳에 초점이 쏠린 것 같지만 

point cloud를 이용해 볼륨필드의 정보를 가져오거나, 

위 방법처럼 단면을 지오메트리화 시켜 xyzdist 함수로 볼륨필드의 정보를 가지고 오는 방법,

또는 속도필드를 활용해 파티클이나 Grain 시뮬레이션도 가능하구요.

다른 방법도 찾아보면 많겠죠!

이렇게 볼륨필드를 활용해 여러 작업물을 만드는 것도 재밌는거 같습니다.




0 0