독학.NET

SOP VORONOI FRACTURE

수학 알고리즘인 Voronoi 패턴으로 지오메트리를 여러개로 쪼개버리는 Voronoi Fracture 노드에 대해서 알아보자.

Posted: November 14, 2017
Version: Houdini 16

Voronoi Fracture Surface Operator

Voronoi 다이어그램(Diagram) 은 수학적 개념이다.

Voronoi Fracture SOP 은 제공되는 점들의 위치에 따라 지오메트리를 여러개로 분할시킨다.

Voronoi Fracture 노드

Voronoi Fracture 노드

 

Voronoi Fracture SOP 은 다음과 같은 특징을 가진다.

 

1. 두 개의 인풋

Voronoi Fracture 노드는 최소 두 개의 인풋이 필요하다.

첫 번째 인풋은 쪼개고자 하는 메인 지오메트리이다.

두 번째 인풋은 면 분할시 참조되는 점들(Voronoi Cells) 이다.

 

2. 면 분할(Split) 방식

두 개의 Voronoi Cell 마다 그 사이를 수직으로 지오메트리를 분할한다.

아래 그림을 통해 사각형이 어떻게 Voronoi Cell 들에 의해서 분할되는지 관찰한다.

빨간 선은 cell 0 과 1 사이를 수직으로 분할한다.

빨간 선은 cell 0 과 1 사이를 수직으로 분할한다.

여기에 cell 2 가 더해지면, cell 0 과 2 사이는 초록선으로 분할되고 cell 1 과 2 사이는 파란선으로 분리된다.

여기에 cell 2 가 더해지면, cell 0 과 2 사이는 초록선으로 분할되고 cell 1 과 2 사이는 파란선으로 분리된다.

3. 다이나믹 에서의 응용

건물/교량의 붕괴장면이나 어떤 사물의 폭파장면에 필수적이다.

Voronoi Fracture 노드는 이러한 이펙트를 하기위한 준비단계에서 아주 유용하다.


2D Voronoi Fracture

간단한 평면 오브젝트에 Voronoi Fracture 노드를 적용해 보자.

후디니를 열고 /obj 에 그리드 지오메트리를 하나 만든다.

SOP_voronoi_2.jpg

 

만들어진 'grid1' 노드를 더블클릭하여 Geometry 레벨로 들어간다.

SOP_voronoi_33.jpg

 

안쪽에 있는 'grid1' 노드의 파라미터창을 다음과 같이 수정한다.

Size 속성에서 가로/세로 길이를 2미터로 정해준다.

분할선 개수를 정해주는 Rows/Columns 속성값도 각각 2로 낮춘다.

SOP_voronoi_13.jpg

 

다음과 같이 분할선이 없는 깨끗한 네모의 그리드가 준비된다.

현재 이 그리드의 총 Primitive 개수는 1개이다.

SOP_voronoi_2.jpg

 

이제 이 그리드 위에 Scatter SOP 을 이용해서 새로운 점들을 만들어 보자.

이 점들은 추후 Voronoi Cells 역할을 하게 된다.

 

TAB 메뉴를 이용하여 Scatter SOP 을 하나 만든다.

만들어진 'scatter1' 노드를 'grid1' 에 연결한다.

SOP_voronoi_4.jpg

 

'scatter1' 노드의 Force Total Count 속성값에 15를 입력한다.

SOP_voronoi_34.jpg

 

다음과 같이 15개의 점이 그리드 위에 생긴다.

SOP_voronoi_7.jpg

 

이제 그리드 오브젝트를 여러개의 조각으로 쪼개보자.

TAB 메뉴를 이용하여 Voronoi Fracture SOP 을 하나 만든다.

만들어진 'voronoifracture1' 노드를 다음과 같이 연결해 준다.

연결후 'voronoifracture1' 노드의 Display Flag 를 선택한다.

연결후 'voronoifracture1' 노드의 Display Flag 를 선택한다.

 

Voronoi Fracture 첫번째 인풋에는 분할시키려는 대상(grid1) 을 연결한다.

Voronoi Fracture 두번째 인풋에는 참조할 점들(scatter1) 을 연결한다.

 

그 결과, 한 개의 면이었던 그리드가 15개의 조각으로 나뉘어진다.

그리고 총 Primitive 개수는 15개가 된다.

두번째 인풋인 Voronoi Cells 과 분할된 면들의 관계를 잘 살펴본다.

두번째 인풋인 Voronoi Cells 과 분할된 면들의 관계를 잘 살펴본다.

 

만들어진 조각들은 서로 붙어있지 않는 개별적인 분할 영역이다.

Display Options 바에서 display point numbers 버튼을 눌러서 확인한다.

각 조각을 이루는 점들이 분할된 선들 위에서 겹치고 있다.

SOP_voronoi_10.jpg
같은 위치에 한개 이상의 점들이 겹치는지 확인할 필요가 있을 때, 이 display point numbers 버튼을 사용하면 편리하다.

 

'voronoifracture1' 노드의 Visualize Pieces 체크박스를 켜준다.

SOP_voronoi_11.jpg

 

쪼개진 조각마다 랜덤한 색상이 적용되어 분할된 영역을 좀더 뚜렷하게 확인할 수 있다.

아래 테스트는 두번째 인풋인 Voronoi Cells 을 애니메이션 시킨 것이다.

Voronoi Cells 의 위치에 따라 쪼개지는 모양도 달라진다.


3D Voronoi Fracture

이번에는 3D 오브젝트에 Voronoi Fracture 노드를 적용해 본다.

평면이 아닌 입체적인 오브젝트를 다룰 때는 눈여겨 볼 사항들이 좀 더 있다.

 

위 예제에 계속해서 이어 나간다.

TAB 메뉴를 이용하여 Sphere SOP 을 하나 만든다.

만들어진 'sphere1' 노드의 Primitive Type 속성을 Polygon Mesh 로 바꾼다.

SOP_voronoi_15.jpg

 

다음과 같이 'grid1' 노드를 'sphere1' 노드로 대체하여 연결해 준다.

SOP_voronoi_16.jpg

 

이번에도 스피어 오브젝트가 15개의 조각으로 나뉘어진다.

SOP_voronoi_17.jpg

 

'voronoifracture1' 노드의 [Cut] 탭에 있는 Cut Plane Offset 속성값을 드래그해서 올려본다.

이 속성은 분할면(Cut Plane) 들을 원래 위치에서 얼마나 이동(Offset) 시켜 분할할지를 결정한다.

SOP_voronoi_18.jpg

 

조각들 사이에 틈이 생기면서 안쪽에 생긴 새로운 면들이 잘 보인다.

SOP_voronoi_19.jpg
2d 오브젝트와 달리 입체적인 3d 오브젝트는 안쪽에 생기는 새로운 면들을 추가로 얻는다.

 

'voronoifracture1' 노드의 Create Inside Surface 체크박스를 On/Off 해본다.

SOP_voronoi_20.jpg

 

기본적으로 이 속성이 켜져있기 때문에 안쪽 면(Inside Surface) 들을 생성한 것이다.

Create Inside Surface = Off

Create Inside Surface = Off

 

'voronoifracture1' 노드 위에서 마우스 중간버튼을 홀드해서 요약된 정보를 보자.

inside, outside 두 가지 Primitive 그룹 이 있다.

SOP_voronoi_22.jpg

 

inside 그룹은 새로 생긴 스피어 안쪽 면들을 가리킨다.

outside 그룹은 원래의 스피어였던 바깥쪽 면들을 가리킨다.

Group: inside

Group: inside

Group: outside

Group: outside

 

그룹 이름은 [Groups] 탭에 있는 Interior Group, Exterior Group 속성에서 바꿀 수 있다.

SOP_voronoi_24.jpg

 

작업시 이러한 그룹을 이용하면 유용할 때가 굉장히 많다.

예를 들어, 안쪽과 바깥쪽 면에 각각 다른 재질(Material) 을 적용할 수 있다.

또는 어떤 오브젝트가 쪼개지면서 파편이나 먼지가 안쪽 면에서만 발생하도록 만들 수 있다.

이러한 그룹의 활용방안에 대해서는 다른 강좌에서 자세히 다루기로 한다.

 

Voronoi Fracture 노드는 name 이라는 Primitive 어트리뷰트 또한 만들어 낸다.

name 어트리뷰트는 String 타입의 데이터 값이다.

SOP_voronoi_25.jpg

 

'voronoifracture1' 노드의 Geometry Spreadsheet 을 열어본다.

분할된 조각마다 각기 다른 문자열(String) 의 name 어트리뷰트 값이 할당된다.

현재 15개의 조각들이므로 첫번째 조각에 속한 Primitives 는 'piece0' 값이 할당되고 마지막 조각에 속한 Primitives 는 'piece14' 값이 할당된다.

현재 15개의 조각들이므로 첫번째 조각에 속한 Primitives 는 'piece0' 값이 할당되고 마지막 조각에 속한 Primitives 는 'piece14' 값이 할당된다.

 

이 어트리뷰트 이름은 [Attributes] 탭에 있는 Name Prefix 속성에서 바꿀 수 있다.

어떤 이름이든 간에 그 문자열 끝에는 조각마다 고유의 번호가 따라붙는다.

이러한 name 어트리뷰트는 어떤 작업을 조각마다 반복수행(Loop) 할 때 유용하다.

SOP_voronoi_28.jpg

 

사실 name 어트리뷰트는 후디니에서 중요한 어트리뷰트들 중 하나이다.

어떤 노드들은 인풋에서 오는 name 어트리뷰트에 따라 그 처리방식이 달라진다.

심지어 다이나믹 영역에서도 name 어트리뷰트는 빈번하게 쓰인다.

이러한 name 어트리뷰트의 다양한 활용방안에 대해서는 다른 강좌에서 자세히 다루기로 한다.