Generative Algorithm 039

8_2_Laser Cutting and Cutting based Manufacturing

 
복잡한 형태를 가진 3d model을 Laser cutter 가공이 가능하도록 만들어보자. Laser cutter를 이용하면 특히 가전면(developable surface)을 가진 모형이나 여러 면을 가진 접어서 만들어야 하는 모형(folded ones)을 제작할 때 매우 편리하다. Digital model에서 연결된 면들을 하나의 면이 되도록 편 뒤(unfold) 그 형태에 맞춰 모형재료를 자르고 다시 접거나 말아서 붙이는 방식으로 모형을 제작할 수 있기 때문이다. 즉 digital model의 면을 평평한 면의 단위로 분리하여 자른 뒤 이것을 다시 붙여가며 조립해가는 것이다. 복곡면(Double curved surface)의 경우도 위와 같은 방법으로 제작이 가능하다. 방울과 같은(blobby) 형태를 만들 경우에는 먼저 면을 두 방향으로 연속하는 section을 나눈 뒤 이 모양에 따라 재료를 자르고 다시 Bridle joint[1]등을 이용하여 격자형으로 조립할 수 있다.
즉 laser cutter란 판형재료를 가공할 수 있는 도구라는 것이다.  어떠한 형상이라도 연속하는 section과 같이 평평한 면으로 해석해내면 그 모형을 제작할 수 있다. 이때 재료는 종이, 금속, cardboard, 나무 등 무엇이든 가능하다.
이제부터 grasshopper를 이용하여 주어진 곡면을 sectioning을 이용하여 평평한 면으로 해석해보도록 하자.

Rhino에서 원하는 형상을 가진 surface를 그리자. 그리고 이 surface를 <geometry>를 이용하여 Grasshopper와 연동시킨다.
 

단면으로 해석하기(Ribs as Sections)

 
이 free-form surface의 모형을 제작하기 위해서는 먼저 면의 단면을 추출한 뒤 이것을 모형재료의 크기와 맞는 평평한 surface 위에 다시 그리도록 하자. 이때 Rhino에서 그려진 surface에는 두께가 없으므로 원하는 두께는 따로 설정해줘야 한다.

Sectioning을 하는데 사용되는 원리는 바로 면과 연속하는 평면을 교차시켰을 때 생기는 ‘curve를 사용하는 것이다. 먼저 <bounding box>를 이용하여 우리가 가공하고자 하는 3d model을 감싸는 최소한의 box를 구한다. 여기에 <box corners>(Surface > Analysis > Box corners)를 이용하여 이box의 각 꼭지점들을 추출하고 이중 두 끝을 잡아 각각 XZ plane과 YZ plane을 생성한다. 이제 이것을 가로와 세로 방향으로 이동시켜야 한다. 이를 위해 사용 되는 것이 <distance>와 <range> 이다. <distance>는 위에서 생성된 두 plane이 각각 y방향과 x 방향으로 이동하는데 사용되는 거리의 범위가 된다. 이것을 <range>를 이용하여 N만큼 나누어서 생기는 data list의 각 위치에 plane이 이동하게 된다.[2]

즉 주어진 면을 감싸고 있는 bounding box의 x와 y방향의 모서리의 길이와 꼭지점 하나를 추출한다. 이 꼭지점에 XZ plane을 생성하여 Y방향으로 연속 이동 시키고 YZ plane을 생성하여 X 방향으로 연속해서 이동시킨다. 이제 이 plane 들이 처음 연동시킨 surface와 교차되는 부분을 추출하면 우리가 원하는 section을 얻을 수 있다. 이 때 section의 개수는 <number slider>이용하여 N 값을 조절해주면 우리가 원하는 만큼 조절해줄 수 있다.

Plane의 원점(Origin)과 각 XY 방향은 위와 같이 frame으로 표시되게 된다. 위 그림에서 볼 수 있는 것처럼 각 frame들은 모서리에 수직방향으로 생기게 된다.

이제 이 plane들과 surface가 교차(intersect)하는 부분을 찾아보도록 하자. 이 경우 surface(Brep)과 plane이 교차하는 것이므로 intersect component 중 <Brep | Plane intersect>(Intersect > Mathematical > BRep | Plane) 를 사용하면 된다. 즉 두 개의 <Brep | Plane Intersect>를 만든 뒤 이 둘의 Brep에 처음 surface를 연동시킨 <geometry>를 연결시켜 준다. 또한 이 전 단계에서 얻어진 X방향으로 연속된 plane과 Y방향으로 연속된 plane들을 P에 연결시켜주면 된다.

이것의 결과물은 위에서 보는 것과 같이 각각 X, Y 방향으로 연속되는 curve이다.

Section 배열하기 (Nesting)

다음 단계는 바로 위에서 얻어진 curve들을 평평한 평면 위에 배열하는 것이다. 이것은 이 후 laser cutter를 이용하여 재료를 자르는데 사용될 것이다. 아래 그림과 같이 재료와 같은 크기를 가지는 직사각형의 Surface 을 그린다. 그리고 이 surface를 아래와 같이 연속하여 배열시킨다.

이제 <Orient>(XForm > Euclidian > Orient)를 이용하여 위에서 얻은 curve를 위 surface 위에 그려보자. <Orient>는 먼저 방향을 바꿀 G: geometry와 이동의 기준으로 사용 될 A: reference plane, 그리고 이 geometry가 이동되어 그려질 대상이 되는 B: target plane으로 이루어진다. 먼저 <Orient>에 G는 위에서 <Brep | Plane Intersect>에서 나오는 Curve가 될 것이고 A: reference plane은 위에서 section curve를 얻기 위해서 사용했던 plane들을 사용할 수 있다. 이제 target plane을 만들어보자.

먼저 위에서 그린 직사각형의 surface를 <surface>를 이용하여 Grasshopper와 연결시킨다. 이것에 <Surface Frame>(Surface > Util > Surface Frames)을 연결하도록 하자. 이것은 면 위에 UV 방향으로 우리가 원하는 수 만큼의 frame (plane의 원점과 방향이 표시된)을 생성할 수 있다.

<surface frame>에 생기는 frame의 개수는 U,V에 입력되는 수를 통하여 조절할 수 있다. 이 때 주의해야 할 것은 U에 1을 입력하더라도 이 방향으로 생성되는 frame은 총 2열이라는 것을 알 수 있다. Surface를 U 방향으로 1로 나누는 것이기 때문에 시작인 0과 끝이 1에 각각 frame이 생성되기 때문이다.[3] 즉 우리가 필요한 것 보다 더 많은 수의 frame이 생기게 된다. 이를 위해서 우리가 필요한 수만큼의 plane을 골라내어야 한다. 이 때 사용 가능한 것이 <split>이다. 이것은 L을 통하여 data list가 들어올 때 i: integer에 입력되는 수 만큼의 data 를 A로, 그 나머지를 B로 내보내주는 역할을 한다. 먼저 <Brep | Plane Intersection>에서 나오는 C의 개수를 <list length>를 이용하여 찾아준다. 이것을 split의 i에 연결시키면 우리가 원하는 수 만큼의 plane을 취할 수 있다. 또한 section이 surface의 모서리와 닿는 것을 방지하기 위하여 X방향으로 1만큼 이동시켜 주었다.

위의 algorithm의 결과물로 위처럼 curve들이 cutting sheet에 그려졌다.
 
 
 


 
[1] http://en.wikipedia.org/wiki/Bridle_joint
[2] 예를 들어 X방향으로의 길이가 50이라고 했을 때 이 길이를 <range>의 D에 넣고 N에 4를 넣으면 (0.0, 12.5, 25.0, 37.5, 50.0) 이라는 data list가 생긴다. 이는 현재 0.0에 위치하는 YZ plane이 12.5, 25.0, 37.5, 50.0 에도 생기게 되는 것을 의미한다.
[3] 이 때 주의할 점은 0.8.0004build에서는 <surface frame>에서 나오는 frame이 tree data의 형태로 나온다는 것이다. 즉 <surface frame>과 <split>사이에 <flatten tree>를 사용하면 위와 같은 결과를 얻을 수 있다.
 

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