본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

후디니 Connectivity로 조각마다 번호 매기기와 랜덤 색

vfx 잡학지식 읽는 시간 약 10분

Connectivity SOP는 한 덩어리로 이어진 조각마다 `class` 번호를 만들어 줍니다. 이 번호를 `rand()`의 seed로 쓰면 같은 조각의 점이나 면에 같은 색을 줄 수 있습니다.

다만 Point와 Primitive 중 무엇을 골라야 하는지, 그리고 두 면이 꼭짓점에서만 만났을 때 하나로 묶이는지는 처음 보면 헷갈립니다. 좌표가 겹쳐 보이는 것만으로도 연결됐다고 봐야 할까요?

먼저 `class`가 저장되는 요소를 고르고, Spreadsheet에서 값을 확인한 뒤, 같은 `class`를 색의 seed로 넘기세요. 핵심 기준은 면의 모양이 아니라 실제 point를 공유하는지에 있습니다.

Connectivity SOP는 연결 묶음에 class를 만듭니다

후디니 22 Connectivity SOP 기본값으로 박스 세 개의 점에 class 0·1·2가 매겨진 Geometry Spreadsheet와 파라미터 화면
Houdini 22.0.466 Apprentice에서 Box 세 개(tx 0·2·4)를 Merge한 뒤 Connectivity를 기본값으로 건 화면입니다. Connectivity Type은 Point, Attribute는 class, Attribute Type은 Integer이며, 24개 점이 박스마다 8개씩 class 0·1·2로 나뉘었습니다. 아래 Wrangle은 @Cd = rand(@class + 17);로 조각별 색을 줍니다.

Connectivity SOP는 입력 지오메트리에서 서로 연결된 point 또는 primitive 묶음을 찾습니다. 각 묶음에는 0부터 시작하는 정수 번호가 붙습니다. 기본 Attribute 이름은 `class`입니다.

`class`는 각 요소가 어느 연결 묶음에 속하는지를 나타내는 라벨입니다. 예를 들어 연결된 덩어리가 세 개라면 번호는 보통 0, 1, 2처럼 만들어집니다. 번호 자체는 조각의 모양이나 이름이 아니라 이번 입력의 연결 결과를 가리킵니다.

Point와 Primitive는 class를 저장할 자리가 다릅니다

Connectivity Type은 연결 성분을 어떤 요소에 기록할지 정합니다. 기본값은 Point입니다. 노드의 Attribute 칸은 `class`, Attribute Type은 Integer로 두면 됩니다.

Connectivity Typeclass가 생기는 곳Wrangle Run Over확인할 항목
Pointpoint attributePoints점별 `class` 값
Primitiveprimitive attributePrimitives면별 `class` 값

분리된 물체마다 point 색을 칠하려면 Point를 고르고 Point Wrangle을 사용하세요. 면마다 값을 보거나 primitive attribute로 넘기려면 Primitive를 고르고 Primitive Wrangle로 처리하세요. Connectivity Type과 Wrangle의 Run Over는 같은 요소를 향하게 맞추세요.

측정한 예에서는 크기가 같은 Box 세 개를 X=0, 2, 4에 놓고 Merge했습니다. Houdini 19.5.435에서는 24개 point와 18개 polygon primitive가 만들어졌고, Point와 Primitive 모드 모두 class가 0, 1, 2로 세 개 나왔습니다.

두 모드의 class 개수가 같다고 해서 같은 속성은 아닙니다. Point 모드에서는 Spreadsheet의 Points 탭에 `class`가 보이고, Primitive 모드에서는 Primitives 탭에 보입니다. 결과를 확인할 때는 숫자뿐 아니라 속성의 소유자도 확인하세요.

UV 섬을 기준으로 나누려면 옵션을 바꾸세요

UV가 잘린 곳을 별도 조각으로 취급해야 한다면 Primitive 모드의 `Use UV Connectivity`를 사용할 수 있습니다. 이 옵션은 Seam Group을 지정하지 않았을 때 사용할 수 있습니다. UV Attribute의 기본 이름은 `uv`입니다.

기본 판정은 primitive끼리 point를 공유하는지 봅니다. `Use UV Connectivity`를 켜면 point 속성이 아니라 vertex에 저장된 texture coordinate를 기준으로 연결을 판단합니다. 같은 point를 쓰더라도 서로 마주 보는 vertex의 `uv` 값이 끊겨 있으면 UV 섬이 나뉠 수 있습니다.

따라서 일반적인 기하 조각을 구분할 때는 기본 UV 옵션을 끈 채 시작하세요. UV 경계를 조각처럼 취급하는 작업일 때만 켜고, Attribute Spreadsheet의 vertex `uv` 값을 함께 확인하세요.

class를 rand() seed로 써서 조각별 색을 지정합니다

Connectivity 뒤에 Wrangle을 연결하고, Point mode라면 Run Over를 Points로 두세요. Primitive mode라면 Primitives를 선택하세요. 각 요소가 자신의 `class` 번호를 seed로 읽도록 씁니다.

@Cd = rand(@class + 17);

`@Cd`는 색 속성이고, `@class`는 조각마다 같은 번호입니다. 그래서 같은 조각 안의 여러 point가 같은 seed를 받고, 각 조각은 서로 다른 seed를 받습니다. 숫자 17은 seed를 옮기는 예시 값입니다.

Houdini 19.5.435에서 Box 세 개에 이 코드를 Point Wrangle로 실행하자 세 class에 세 Cd가 만들어졌습니다. 다만 class 0과 1의 색은 서로 꽤 가까웠습니다. `rand()`는 다른 색을 뽑아도 눈에 띄는 대비까지 보장하지 않으므로, 조각 수가 많거나 마스크 용도로 쓸 때는 직접 고른 palette가 더 읽기 쉽습니다.

점마다 색이 달라진다면 Connectivity가 만든 `class` 대신 `@ptnum`을 seed로 사용했는지 확인하세요. 한 조각의 모든 요소를 같은 색으로 만들려면 위치 번호가 아니라 조각 번호를 사용해야 합니다.

아래 도구는 연결 성분 수와 seed를 바꿔 보며 class별 색이 어떻게 배정되는지 보여 줍니다. 실제 Houdini `rand()`의 RGB를 재현하는 계산기는 아니며, class 번호와 색을 묶는 원리를 확인하는 미리보기입니다.

조각 수와 seed로 class 색 미리보기

각 색 카드는 하나의 연결 조각을 뜻합니다. 조각 수를 바꾸면 class 번호가 늘고, seed를 바꾸면 팔레트가 회전합니다.

class 번호마다 색을 연결하는 원리를 보여 주는 예시입니다. 색상은 웹용 팔레트로 만들었으므로 Houdini의 rand()와 같은 RGB 값이 나오지는 않습니다.

꼭짓점에서만 닿은 면은 하나로 묶일까요?

이제 처음 질문에 답하겠습니다. 두 면이 실제 point 하나를 공유하면 모서리가 아니라 꼭짓점 한 곳에서만 만나도 기본 Primitive Connectivity에서는 한 연결 성분입니다.

하지만 화면 좌표만 같은 별도 point라면 결과가 다릅니다. 두 점의 위치는 같아 보여도 topology에서 같은 point를 공유하지 않으므로 두 연결 성분으로 남습니다. 화면에서 겹쳐 보이는지보다 point를 공유하는지를 기준으로 판단하세요.

입력 기하Point modePrimitive mode의미
점 하나를 공유하는 삼각형 2개1 class1 class꼭짓점 접촉도 연결
좌표만 같고 점은 별도인 삼각형 2개2 classes2 classes위치 중첩은 point 공유가 아님
분리된 삼각형 2개와 loose point 1개3 classes2 classesPoint 모드는 고립 point도 분류

첫 번째와 두 번째 입력은 Houdini 19.5.435 hython으로 직접 만들어 각각 Connectivity에 연결했습니다. 따라서 코너에서 class가 합쳐졌다면, 화면에서 점이 가까워서가 아니라 실제로 공통 point를 쓰는지 확인하면 됩니다.

결과가 예상과 다를 때는 속성부터 확인하세요

  • Connectivity Type이 원하는 속성 소유자(Point 또는 Primitive)와 맞는지 확인하세요.
  • Geometry Spreadsheet에서 `class`가 실제로 만들어졌는지, 몇 종류인지 확인하세요.
  • 면이 이어졌는데 예상보다 class가 적으면 point를 공유하는지 살펴보세요. 좌표만 겹치는지는 별도 문제입니다.
  • UV 섬을 나눠야 한다면 Primitive mode, `Use UV Connectivity`, vertex `uv` 값을 차례로 확인하세요.
  • Wrangle의 Run Over와 `@class`의 저장 위치를 맞추세요. 그 뒤 `@Cd`를 뷰포트에서 확인하세요.

attribute 소유자에 따라 Wrangle이 몇 번 실행되는지 더 확인하려면 후디니 Wrangle Run Over 차이를 참고하세요. class를 만들어 조각별 반복 처리를 이어가려면 후디니 For-Each 루프가 다음 단계입니다.

정리하면, Connectivity는 연결 묶음에 class 번호를 만들고, 같은 class를 색의 seed로 쓰면 조각별 색을 줄 수 있습니다. 코너에서 만났는지 볼 때는 좌표보다 point 공유 여부를 확인하세요.

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.