Generative Algorithm 033

7_2_기하학과 위상수학(Geometry and Topology)

이때까지는 NURBS에 적용되는 component들에 대하여 살펴보았다. Grasshopper에는 이 뿐만 아니라 다른 종류의 surface에도 적용 가능한 여러 component들이 있다. NURBS가 그려내는 부드러운 곡면이 꼭 원하는 결과물이 아닐 수 있다. 혹은 좀 더 미세한 제어와 간단한 함수에 의한 처리가 가능한 surface를 그리고 싶을 수도 있다. 예를 들면 B-spline이나 Besier surface 같은 경우가 있을 수 있다. 이번 장에서는 Mesh에 대해서 다루고자 한다.
Mesh란 free-from surface의 한 종류로 아주 작은 면(face)들이 모여 하나의 surface를 형성하는 것이다. 이러한 surface에는 그 내부에 고유한 규칙을 가지고 있다거나 수학적 함수에 의거하지 않는다. 대신 각 face가 모여 전반적 surface의 형상을 결정한다. 즉 하나의 Mesh surface 에는 각 face를 만들어내는 점(grid of point)이 분포되어 있고 이러한 각 face는 삼각형, 사각형, 혹은 육각형일 수도 있다. 이러한 점들이 mesh surface를 형성하는 기본 단위이며 이 점들은 모두 연결되어 있다.
Mesh가 가진 가장 중요한 두 가지 특징으로는 바로 mesh를 형성하는 점들의 위치와 각 점들간의 연결이다. 점들의 위치는 각 face가 가진 면의 형상을 결정하고 이것들의 연결성은 topology와 연관된다.

Geometry VS. Topology

기하학(geometry)가 공간에서 객체의 위치를 결정짓는다면 위상수학(topology)는 각 객체간의 관계를 결정하게 된다. 수학적으로 말하자면 topology란 객체가 가진 한 특징으로서 이것은 그 객체를 변환(transformation)하거나 변형(deformation)하여도 변하지 않는 것이다. 즉 원(circle)과 타원(ellipse)은 위상수학적(topologically)으로 같은 것으로 이 둘은 기하학적(geometrical) 차이만을 가지게 된다. 아래 그림을 살펴보면 각 네 개의 point들이 서로 연결되어 있는 것을 볼 수 있다. 왼쪽 두 개의 그림을 살펴보면 A와 B는 이 둘은 각기 같은 방식으로 연결되어있기 때문에 같은 topology를 가지고 있다고 말할 수 있다. 하지만 이 둘은 기하학적으로 같지 않은데 이는 한 점의 위치가 다르기 때문이다. 반면 오른쪽에 있는 두 A 와 B는 같은 위치에 점을 가지고 있지만 다른 방식으로 연결되어 있기 때문에 이 점들은 기하학적으로 같고, 위상수학적으로 다른 형상이라고 할 수 있다.
이러한 topology의 개념은 mesh를 이해하는데 매우 중요한 역할을 한다. 각 mesh의 face들은 그 모서리에 point를 가지며 각 face들의 corner point들은 각자 같은 순서와 방식으로 서로 연결된다. 이러한 mesh를 변환(transformation)하게 되었을 때 각 face의 모서리 점들(vertices)의 위치가 변하게 된다. 각 점들이 가지는 변환의 정도 또한 각기 다를 수 있다. 그러나 각 vertex들이 연결되는 방식은 유지되게 된다.

회색 surface나 빨간색 surface 모두 mesh로 같은 face와 모서리 점들(vertices)을 가진다. 단지 회색 surface의 vertices들이 다른 위치를 가지게 되면서 mesh의 기하학적 형상(geometrical configuration)을 바꾸고 있을 뿐이다. 하지만 각 mesh들이 같은 방식으로 연결 되고 있으므로 두 mesh surface는 위상수학적(topologically)으로 같다고 할 수 있다.
이러한 mesh 객체들의 위상수학적인 측면을 이해한다면 point들의 뭉치가 있을 때 그것을 연속하는 mesh surface로 표현할 수 있게 된다. 또한 여러 algorithm을 이용하여 point를 조절하여도 이 mesh surface는 유지되는데, 이는 바로 각 점들이 가지는 topology 때문이다.
예를 들어 Dynamic relaxation이나 particle system과 같이 유한한 요소를 분석하는 것에는 이것은 mesh를 이용하여 작업하는 것이 다른 종류의 surface를 이용하는 것보다 훨씬 쉬운데 이러한 함수들은 mesh vertices의 위치를 변화시키면서도 그 연속성은 유지되기 때문이다.
또한 mesh surface는 그 위에 구멍을 뚫거나 면을 불연속(discontinuity)하게 처리할 수 있기 때문이다. 또한 여러 가지 algorithm을 이용하여 mesh를 다듬고 이를 더욱 부드럽게 만들 수 있다. 또한 mesh는 각 face가 다른 색을 가질 수 있기 때문에 분석의 결과를 표현하는데 유용하게 사용할 수 있다.
Grasshopper의 Mesh 탭을 살펴보면 mesh를 조작할 수 있는 여러 개의 component를 찾을 수 있다. 이제 mesh를 처음부터 다뤄보고 이것에 대한 이해를 넓혀보도록 하자.

 

7_3_On Meshes

Point로 이루어진 격자가 있다. 이제 이 point들을 이용하여 면을 만들어보자. 이러한 point grid가 surface를 구성하고 있고 이 surface가 위로 갈수록 바람(혹은 vector를 가진 여러 종류의 힘)의 영향을 많이 받는다고 가정해보자. 그렇다면 이러한 영향은 각 point가 받는 것이라고 볼 수 있다. 이러한 point의 위치 변화는 surface를 변형시킬 것이다. 또한 풍량을 조절하여 그 형상을 바꿀 수 있을 것이다.

첫 번째 단계는 무척 간단하다. <series>와 <number slide>를 이용하면 점의 위치와 그 간격을 조절 할 수 있다. 이<number slide>는 각각 <N_pt>와 <distance_pt>로 그 이름이 변경되었다. 이 중 <N_pt>는 ‘even number’가 되도록 설정하자. 이 때 <point>의 data matching 방식을 ‘cross reference’로 바꾸는 것을 잊지 말자.

위는 바람의 힘과 그것의 영향을 받는 surface의 관계를 나타내는 diagram이다. 왼쪽은 수직 방향으로 생기는 힘과 그 영향이고 오른쪽은 위에서 보았을 때의 그것이다.
위 두 가지를 이용하면 바람의 영향을 modeling할 수 있다. 첫 번째 것은 간단한 수학 방정식(X^2)로 표현 될 수 있다. 이 때 변수 X는 바로 각 point의 Z 좌표값을 적용하게 된다. 이 <point>를 <point decompose>에 연결하여 각 점의 Z좌표값을 추출하자.
Y 축 방향으로 풍력이 작용한다고 가정해보자. Grid 위의 각 점들은 위에 있을수록 더 큰 z값을 가지기 때문에 위에 있는 점이 더 큰 영향을 받게 되는 것을 알 수 있다. 즉 Z좌표값에 비례하는 Y방향의 vector를 만들고 이것을 각 점에 적용시켜 Y방향으로 각 값만큼 이동시키는 것이다.

<decompose point>에 의하여 추출된 Z좌표 값은 <f2;(x^2)>에 의하여 제곱이 되고 다시 <number slider>에 의하여 그 영향의 정도를 조절되게 된다. 그 결과물은 <multiply>(Vector > Vector > Multiply)를 이용하여 <unit Y>에 곱해지게 된다.

이렇게 만들어진 vector를 이용하여 점을 이동시키면 위와 같이 우리가 원하는 결과물을 얻을 수 있다. 이제 두 번째 mechanism을 적용시켜 보자. 위에서 언급한대로 평면상에서 보았을 때 가운데 있는 부분이 바람의 영향을 더욱 많이 받게 된다. 아래 그림은 각 열(row)위에 있는 점들이 어떻게 이동하는 지를 보여주는 것이다.

열 위에서 점 위치의 이동


위에서 적용된 vector값에 다시 인수의 data list를 생성하고 이를 곱한 vector값을 이용하여 point들을 이동시켜주면 된다. 즉 오른쪽과 왼쪽 양 끝에 있는 점의 vector에는 0을 곱하면 vector값이 0이 되기 때문에 원래 자리에 남게 된다. 나머지 점들은 가운데 쪽으로 갈수록 더 큰 값을 곱해주면 위와 같은 결과물을 얻을 수 있다. 그러한 인수의 data list를 만드는 방식은 아래와 같다.

먼저 <range>를 이용하여 0을 처음 값, 1을 마지막 값으로 가지는 data list를 생성해준다. 즉 0은 양끝 쪽에, 1은 가운데 쪽에 있는 점의 vector에 적용되는 것이다. 이를 위해서는 <range>를 활용하면 된다. 먼저 D에 들어있는 정의역(domain)의 범위를 ‘0 to 1’ 로 정해준 뒤 이것을 <N_pt>를 <f1: (x/2)-1>에 연결하여 점의 개수를 2로 나누고 다시 1만큼 빼준다. <range>가 만들어내는 data list의 길이는 N에 들어오는 수보다 항상 1만큼 크기 때문이다. 이 경우 0과 1사이의 수를 3등분 하게 되면 (0, 0.333, 0.666, 1)이라는 수를 가지게 된다. 다시 이것을 <reverse>를 이용하여 data의 순서를 뒤집으면 (1, 0.666, 0.333, 0)이된다. 이 두 list를 <merge2>를 이용하여 합쳐주면 (0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0) 이라는 data list를 생성할 수 있다. 위의 그림에 panel을 살펴보면 쉽게 이해할 수 있을 것이다. 이제 이것을 <duplicate>를 이용하여 복사를 해주게 된다. 이때 이것에 들어오는 N값은 <N_pt>를 이용해주면 된다. 이 경우 점은 8개의 X좌표값과 8개의 Z좌표값이 조합된 64개가된다. 위에서 생성된 data list가 8개이고 여기에 다시 8을 곱하면 점의 개수만큼의 data list를 생성할 수 있다.[1]

이번 예시의 경우 약간의 분석적인 사고를 요구하는 것이 사실이다. 현실에서는 Particle Spring System이나 Finite Element Analysis 의 경우 복수개의 vector가 점 전체에 영향을 끼치며 점들 사이에도 각자의 힘이 서로에게 영향을 끼치게 된다. 즉 하나의 surface을 만드는 point grid가 있을 때 여기에 하나의 힘이 작용하면 이것은 모든 점에 영향을 끼치게 될 뿐만 아니라 그와 동시에 점들끼리도 서로 영향을 끼치게 되는 것이다. 이러한 과정은 반복적인 loop을 거쳐 계산되며 이것의 결과물이 전체(system)내에서 각 점의 위치를 결정하게 된다. 이 예제의 경우 각 점이 서로에게 끼치는 영향을 배제하고 매우 간단한 수학적인 계산을 통하여 각 점이 받는 힘만을 고려한 것이다. 현실에서의 영향은 이것보다 훨씬 더 복잡함을 알아두도록 하자. 여기서는 이러한 결과물을 ‘mesh’를 이용하여 표현해보는 것이 그 목적이다. 이제 이 점들을 이용하여 mesh를 생성해보자.

메쉬(Mesh)

먼저 <mesh>(Mesh > Primitive > Mesh)를 불러온 뒤 이것에 위에서 생성한 점들을 연결하여 준다. 하지만 이것으로 mesh가 생성되는 것은 아니다. Mesh surface를 생성하기 위해서는 이것을 구성하게 될 face정보를 제공해줘야 한다. 이 정보는 일련의 수로 이루어진 data list로 이것은 각 vertex[2]가 연결되는 방식을 결정해주고 이것을 통해 surface를 생성해주게 된다. 즉 이 vertices 는 mesh의 기하학적인 면을 결정해준다. 하지만 이 뿐만 아니라 위상학적인 정의(topological definition)을 해줘야 mesh를 생성할 수 있는 것이다.
Point grid위에 있는 각 점들을 4개씩 연결하여 사각형의 면(quadrant face)을 생성하여보자. Point grid를 살펴보면 각 point들이 고유의 index number를 가지는 것을 알 수 있다. 즉 각 점의 좌표값을 알고 그것을 이용하지 않아도 이 index number를 이용하면 점을 다룰 수 있게 된다.

각 점들이 가지고 있는 index number


Mesh를 정의 하기 위해서는 각 face들이 가지는 네 개의 vertex을 정의해주어야 한다.

위에서 보이는 것과 같은 순서로 점들을 연결해주면 quadrant face을 생성해줄 수 있다. 이 순서는 바로 하나의 점으로부터 출발하여 같은 행(row) 위에 있는 오른쪽 옆에 있는 점, 그 다음은 같은 열(column) 바로 위에 있는 점, 그 다음은 같은 행(row)바로 왼쪽 옆에 있는 점, 그리고 그 시작점으로 돌아오게 된다. 여기서 가장 처음에 생기는 face에 필요한 점은 바로 [0, 1, 6, 5]이다.  그 다음 face는 [1, 2, 7, 6]이다.
Mesh surface 전체를 정의하기 위해서는 위와 같은 순서로 점을 연결하는 algorithm을 짜야 한다. 위의 matrix를 살펴보면 n 번째 점이 있을 때 그 다음 점의 index number는 바로 n+1 이다.
그 다음 점에는 n에 열(column)의 개수 c를 더해주고 다시 1을 더해주면 된다. 즉 n+c+1로 위 경우 c=5이다. 그 다음 점은 n+c가 된다.
즉 어떠한 점의 index number n이 주어졌을 때 quadrant face가 가지는 vertex의 index number는 [n, n+1, n+c+1, n+c] 이다.

각 face를 정의해주면 mesh가 생성되게 된다.


위의 그림을 보면 위처럼 vertex의 index number를 정의해준다 하더라도 약간의 문제가 있음을 눈치챌 수 있을 것이다. 이 전에 다룬 삼각형 pattern을 만드는 예제를 떠올려보자. 마지막 열과 마지막 행위에 있는 점들은 면의 시작점이 될 수 없다는 것을 알 수 있다. 즉 여기서 필요한 것은 mesh의 face를 생성하기 위한 algorithm 뿐만 아니라 face의 ‘시작점’이 될 수 있는 점과 그렇지 않은 점을 구분해주는 data management가 필요하다.
간단하게 말해서 마지막 열과 마지막 행을 제외한 나머지 점들이 각 면의 시작점으로 정의해주면 된다. 즉 이에 해당하는 점들의 index number를 제외하는 수의 data list를 만들어야 한다.

위에서 언급한 data list를 생성해주기 위한 algorithm이다. 기본적으로 <series>를 이용해주면 된다. <N_pt>에서 나오는 수는 row와 column의 수와 같다. 이것을 <f1: x*(x-1)>를 이용하면 이것은 열(column)의 수 * 행(row)의수 -1 과 그 의미가 같다. 즉 이렇게 되면 마지막 row 만큼의 index number를 생성하지 않게 된다.[3] 즉 이것은 columns*(rows-1) 와 같다. 이제 이것을 <cull Nth>에 연결하여 n번째 수를 모두 버려주자. 그러면 오른쪽 열 위의 점의 index number에 해당하는 수를 버릴 수 있다.

이렇게 생성된 수의 data list는 위와 같다. 이제 이것을 index number로 가지는 vertex들을 골라보자.

<Mesh quad> (Mesh > Primitive > Mesh quad)는 Grasshopper에서 mesh의 face를 생성하는 역할을 해준다. 이것에 각 면의 첫 번째 vertex에 해당하는 index number를 A에 넣어준다.

두 번째 점은 n+1과 같으므로 <f1: x+1>을 적용시켜줄 수 있다. 그 다음 점은 ((n+1)+c)이므로 여기에 위 <f1: x+1>에서 나온 수를 x로 하고 <N_pt>를 y로 하는 <f2: x+y>를 생성해준다. 마지막 점은 다시 여기서 1을 빼주면 된다. 즉, <f1: x-1>을 적용시켜준다. 이것을 <quad>의 각 A, B, C, D에 연결시켜주고 <mesh>의 F에 연결해준다.


[1] 즉 (0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0, 0, 0.333, 0.666, 1, 1, 0.666, 0.333, 0) 이라는 data list가 생성된다. 이것이 ‘행(row)’의 방향으로 반복되는 점에 적용된다.

[2] Vertex는 꼭지점을 의미한다. 그 복수형이 vertices 이다. 참고는 http://ko.wikipedia.org/wiki/%EA%BC%AD%EC%A7%80%EC%A0%90
http://en.wikipedia.org/wiki/Vertex_(geometry)

[3]Data는 원칙적으로 U방향으로 생성됨을 잊지 말자. 이 경우 U 방향은 X축 방향, row 방향 으로 생각할 수 있다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s