Posted: November 14, 2017
Version: Houdini 16
Voronoi Fracture Surface Operator
Voronoi 다이어그램(Diagram) 은 수학적 개념이다.
Voronoi Fracture SOP 은 제공되는 점들의 위치에 따라 지오메트리를 여러개로 분할시킨다.
Voronoi Fracture 노드
Voronoi Fracture SOP 은 다음과 같은 특징을 가진다.
1. 두 개의 인풋
Voronoi Fracture 노드는 최소 두 개의 인풋이 필요하다.
첫 번째 인풋은 쪼개고자 하는 메인 지오메트리이다.
두 번째 인풋은 면 분할시 참조되는 점들(Voronoi Cells) 이다.
2. 면 분할(Split) 방식
두 개의 Voronoi Cell 마다 그 사이를 수직으로 지오메트리를 분할한다.
아래 그림을 통해 사각형이 어떻게 Voronoi Cell 들에 의해서 분할되는지 관찰한다.
빨간 선은 cell 0 과 1 사이를 수직으로 분할한다.
여기에 cell 2 가 더해지면, cell 0 과 2 사이는 초록선으로 분할되고 cell 1 과 2 사이는 파란선으로 분리된다.
2D Voronoi Fracture
간단한 평면 오브젝트에 Voronoi Fracture 노드를 적용해 보자.
후디니를 열고 /obj 에 그리드 지오메트리를 하나 만든다.
만들어진 'grid1' 노드를 더블클릭하여 Geometry 레벨로 들어간다.
안쪽에 있는 'grid1' 노드의 파라미터창을 다음과 같이 수정한다.
Size 속성에서 가로/세로 길이를 2미터로 정해준다.
분할선 개수를 정해주는 Rows/Columns 속성값도 각각 2로 낮춘다.
다음과 같이 분할선이 없는 깨끗한 네모의 그리드가 준비된다.
현재 이 그리드의 총 Primitive 개수는 1개이다.
이제 이 그리드 위에 Scatter SOP 을 이용해서 새로운 점들을 만들어 보자.
이 점들은 추후 Voronoi Cells 역할을 하게 된다.
TAB 메뉴를 이용하여 Scatter SOP 을 하나 만든다.
만들어진 'scatter1' 노드를 'grid1' 에 연결한다.
'scatter1' 노드의 Force Total Count 속성값에 15를 입력한다.
다음과 같이 15개의 점이 그리드 위에 생긴다.
이제 그리드 오브젝트를 여러개의 조각으로 쪼개보자.
TAB 메뉴를 이용하여 Voronoi Fracture SOP 을 하나 만든다.
만들어진 'voronoifracture1' 노드를 다음과 같이 연결해 준다.
연결후 'voronoifracture1' 노드의 Display Flag 를 선택한다.
Voronoi Fracture 첫번째 인풋에는 분할시키려는 대상(grid1) 을 연결한다.
Voronoi Fracture 두번째 인풋에는 참조할 점들(scatter1) 을 연결한다.
그 결과, 한 개의 면이었던 그리드가 15개의 조각으로 나뉘어진다.
그리고 총 Primitive 개수는 15개가 된다.
두번째 인풋인 Voronoi Cells 과 분할된 면들의 관계를 잘 살펴본다.
만들어진 조각들은 서로 붙어있지 않는 개별적인 분할 영역이다.
Display Options 바에서 display point numbers 버튼을 눌러서 확인한다.
각 조각을 이루는 점들이 분할된 선들 위에서 겹치고 있다.
'voronoifracture1' 노드의 Visualize Pieces 체크박스를 켜준다.
쪼개진 조각마다 랜덤한 색상이 적용되어 분할된 영역을 좀더 뚜렷하게 확인할 수 있다.
아래 테스트는 두번째 인풋인 Voronoi Cells 을 애니메이션 시킨 것이다.
Voronoi Cells 의 위치에 따라 쪼개지는 모양도 달라진다.
3D Voronoi Fracture
이번에는 3D 오브젝트에 Voronoi Fracture 노드를 적용해 본다.
평면이 아닌 입체적인 오브젝트를 다룰 때는 눈여겨 볼 사항들이 좀 더 있다.
위 예제에 계속해서 이어 나간다.
TAB 메뉴를 이용하여 Sphere SOP 을 하나 만든다.
만들어진 'sphere1' 노드의 Primitive Type 속성을 Polygon Mesh 로 바꾼다.
다음과 같이 'grid1' 노드를 'sphere1' 노드로 대체하여 연결해 준다.
이번에도 스피어 오브젝트가 15개의 조각으로 나뉘어진다.
'voronoifracture1' 노드의 [Cut] 탭에 있는 Cut Plane Offset 속성값을 드래그해서 올려본다.
이 속성은 분할면(Cut Plane) 들을 원래 위치에서 얼마나 이동(Offset) 시켜 분할할지를 결정한다.
조각들 사이에 틈이 생기면서 안쪽에 생긴 새로운 면들이 잘 보인다.
'voronoifracture1' 노드의 Create Inside Surface 체크박스를 On/Off 해본다.
기본적으로 이 속성이 켜져있기 때문에 안쪽 면(Inside Surface) 들을 생성한 것이다.
Create Inside Surface = Off
inside 그룹은 새로 생긴 스피어 안쪽 면들을 가리킨다.
outside 그룹은 원래의 스피어였던 바깥쪽 면들을 가리킨다.
Group: inside
Group: outside
그룹 이름은 [Groups] 탭에 있는 Interior Group, Exterior Group 속성에서 바꿀 수 있다.
작업시 이러한 그룹을 이용하면 유용할 때가 굉장히 많다.
예를 들어, 안쪽과 바깥쪽 면에 각각 다른 재질(Material) 을 적용할 수 있다.
또는 어떤 오브젝트가 쪼개지면서 파편이나 먼지가 안쪽 면에서만 발생하도록 만들 수 있다.
'voronoifracture1' 노드의 Geometry Spreadsheet 을 열어본다.
분할된 조각마다 각기 다른 문자열(String) 의 name 어트리뷰트 값이 할당된다.
현재 15개의 조각들이므로 첫번째 조각에 속한 Primitives 는 'piece0' 값이 할당되고 마지막 조각에 속한 Primitives 는 'piece14' 값이 할당된다.
이 어트리뷰트 이름은 [Attributes] 탭에 있는 Name Prefix 속성에서 바꿀 수 있다.
어떤 이름이든 간에 그 문자열 끝에는 조각마다 고유의 번호가 따라붙는다.
이러한 name 어트리뷰트는 어떤 작업을 조각마다 반복수행(Loop) 할 때 유용하다.
사실 name 어트리뷰트는 후디니에서 중요한 어트리뷰트들 중 하나이다.
어떤 노드들은 인풋에서 오는 name 어트리뷰트에 따라 그 처리방식이 달라진다.
심지어 다이나믹 영역에서도 name 어트리뷰트는 빈번하게 쓰인다.