후디니 Attribute Promote: 포인트 값을 Detail로 모으는 방법
Attribute Promote SOP에서 Original Class를 Point, New Class를 Detail로 지정하고 Promotion Method를 선택하면 여러 포인트 값을 하나의 Detail 결과로 집계할 수 있습니다. Detail로 바꾼다고 모든 포인트 값이 그대로 복사되는 것은 아닙니다. 평균이나 최댓값처럼 한 값을 정하거나, 원래 목록 전체가 필요하면 Array of All을 고르세요.
포인트 속성을 만들었는데 Detail에서 값을 찾지 못하거나, 기대한 여러 값이 하나만 남아 당황할 수 있습니다. Attribute Promote는 클래스만 바꾸는 복사 노드가 아니라, 여러 원본 요소가 하나의 대상 요소에 대응할 때 어떤 값으로 합칠지 정하는 노드입니다. 포인트·버텍스·프리미티브·Detail이 저장되는 위치부터 헷갈린다면 후디니 속성 클래스별 저장 위치를 먼저 확인하세요.
Attribute Promote는 여러 포인트 값을 하나의 Detail 값으로 집계합니다
계산을 확인하기 위해 포인트의 weight 값을 Point 번호 순서대로 [8, 1, 2, 3, 10, 2]로 만들었습니다. Houdini 19.5.435의 Attribute Promote SOP에 같은 입력을 넣고 Point에서 Detail로 승격한 결과입니다. 평균은 26을 6으로 나눈 값이고, First와 Last는 입력 순서의 첫 값과 마지막 값입니다.
| Promotion Method | Detail 결과 | 계산 기준 |
|---|---|---|
| Maximum | 10 | 가장 큰 값 |
| Minimum | 1 | 가장 작은 값 |
| Average | 4.333333 | 합계 26 ÷ 6 |
| Mode | 2 | 가장 자주 나온 값 |
| Median | 3 | 정렬한 뒤 높은 쪽 중앙값 |
| Sum | 26 | 모든 값의 합 |
| Sum of Squares | 182 | 각 값을 제곱해 더함 |
| Root Mean Square | 5.507571 | √(제곱합 ÷ 개수) |
| First Match | 8 | 매칭 순서의 첫 값 |
| Last Match | 2 | 매칭 순서의 마지막 값 |
| Array of All | [8, 1, 2, 3, 10, 2] | 모든 값을 배열로 보존 |
| Unique Values* | [1, 2, 3, 8, 10] | 중복을 뺀 값 |
Mode에서 최빈값이 여럿이면 작은 값을 선택합니다. 짝수 개의 Median은 가운데 두 값의 평균이 아니라 높은 쪽 값을 선택합니다. 이 입력을 정렬하면 [1, 2, 2, 3, 8, 10]이므로 Median은 3입니다. *최신 SideFX 문서에는 Unique Values가 추가되어 있지만, PC에서 확인한 Houdini 19.5.435 UI에는 이 항목이 없었습니다. 아래 계산기는 고유값을 보기 쉽게 오름차순으로 표시합니다. 공식 문서가 보장하는 것은 중복 제거이며, 출력 순서는 이 실측에서 확인하지 않았습니다.
이 계산기는 숫자형 단일 컴포넌트 속성을 기준으로 합니다. SideFX 문서에 따르면 Index 타입 속성은 문자열처럼 처리되어 Average는 Median처럼, Sum은 문자열 연결처럼 동작하고, 나머지 수치 메서드는 First Match로 처리됩니다. Index 속성에 아래 계산 결과를 그대로 적용하지 마세요.
Houdini · Point → Detail
포인트 값을 넣어 Detail 결과 계산
Point 값을 입력 순서대로 적으세요. 쉼표, 공백, 줄바꿈, 세미콜론으로 구분할 수 있습니다.
| Promotion Method | Detail 결과 | 계산 기준 |
|---|---|---|
| Maximum | 계산 전 | 가장 큰 값 |
| Minimum | 계산 전 | 가장 작은 값 |
| Average | 계산 전 | 합계 ÷ 개수 |
| Mode | 계산 전 | 가장 자주 나온 값, 동률이면 작은 값 |
| Median | 계산 전 | 정렬한 뒤 가운데, 짝수 개면 높은 중앙값 |
| Sum | 계산 전 | 모든 값의 합 |
| Sum of Squares | 계산 전 | 각 값을 제곱해 더한 값 |
| Root Mean Square | 계산 전 | √(제곱합 ÷ 개수) |
| First Match | 계산 전 | 입력 순서의 첫 값 |
| Last Match | 계산 전 | 입력 순서의 마지막 값 |
| Array of All | 계산 전 | 모든 값을 배열로 보존 |
| Unique Values* | 계산 전 | 중복을 뺀 고유값 |
이 계산기는 숫자형 단일 컴포넌트 속성을 가정합니다. 벡터는 컴포넌트별로 계산하세요. *Unique Values는 최신 SideFX 문서에 있지만 Houdini 19.5.435 UI에는 없습니다. 이 표는 고유값을 오름차순으로 보여 줍니다.
Attribute Promote 설정은 Original Class와 New Class부터 맞춥니다
- 포인트 속성을 만든 노드 뒤에 Attribute Promote SOP를 추가하고
Original Name에 속성 이름을 적습니다. 예를 들어weight입니다. Original Class를Point,New Class를Detail로 설정합니다. Detail은 지오메트리 전체에 하나만 있는 클래스입니다.Promotion Method에서 필요한 기준을 고릅니다. 전체 평균이면Average, 범위의 상한이면Maximum, 목록 전체를 남기려면Array of All입니다.- 승격 후 원래 포인트 속성도 계속 써야 한다면
Delete Original을 끄세요. 켜면 Detail 결과를 만든 뒤 원본 속성을 삭제합니다.
New Class는 Piece Attribute를 사용하지 않는 한 Original Class와 달라야 합니다. 예를 들어 Point에서 Point로 승격하려고 하면 작업이 적용되지 않습니다. Attribute Wrangle의 Run Over가 코드의 실행 단위를 바꾸는 것과 속성 클래스를 옮기는 것은 다른 문제입니다. Detail Wrangle의 1회 실행 방식은 후디니 Wrangle Run Over 비교에서 확인할 수 있습니다.
벡터 속성은 길이가 아니라 각 성분을 따로 집계합니다
v처럼 여러 컴포넌트로 된 속성은 각 성분에 Promotion Method를 독립 적용합니다. 테스트에서는 포인트마다 (x, 2x, 10-x) 벡터를 만들었습니다. Average를 적용한 Detail 값은 (4.333333, 8.666667, 5.666667)입니다. 벡터 길이의 평균이 아니라 X, Y, Z 성분별 평균입니다. Maximum이나 Minimum도 성분별로 고르므로, 결과 벡터 세 성분이 반드시 같은 원본 포인트에서 온다고 볼 수 없습니다.
Piece Attribute로 조각마다 평균을 낼 수 있습니다
한 지오메트리 전체가 아니라 조각별 통계가 필요하면 Piece Attribute에 New Class에 있는 문자열 또는 정수 partition 속성을 지정하세요. 속성 값이 같은 포인트·버텍스·프리미티브를 한 조각으로 묶고, 각 조각의 원본 값으로 Promotion Method를 계산한 뒤 결과를 그 조각의 요소들에 씁니다. 이 옵션을 켜면 Original Class와 New Class가 같아도 됩니다.
앞의 여섯 값에 piece=[0,0,0,1,1,1]을 붙이고 Point에서 Point로 Average를 실행하면 앞 세 포인트에는 각각 3.666667, 뒤 세 포인트에는 각각 5가 기록됩니다. 조각을 나누는 기준은 연결성만이 아니라 Piece Attribute 값입니다. 떨어진 점이라도 같은 값이면 같은 조각으로 묶입니다. Point에서 Primitive로 승격할 때 한 점이 같은 조각 안의 여러 프리미티브에 참조되더라도 원본 포인트는 한 번만 집계되며, First Match는 해당 조각에서 가장 낮은 Point 번호의 값을 선택합니다.
VEX Detail Wrangle도 같은 평균·최솟값·최댓값을 만듭니다
Attribute Promote 대신 직접 계산하려면 Attribute Wrangle을 Detail (only once)로 두고 포인트를 순회할 수 있습니다. 아래 코드는 같은 weight 속성에서 평균·최솟값·최댓값·합계를 계산합니다. Run Over를 Detail로 두면 f@weight_avg 같은 출력 속성도 Detail 클래스에 만들어집니다.
int n = npoints(0);
if (n > 0) {
float total = 0.0;
float minv = point(0, "weight", 0);
float maxv = minv;
for (int pt = 0; pt < n; pt++) {
float v = point(0, "weight", pt);
total += v;
minv = min(minv, v);
maxv = max(maxv, v);
}
f@weight_avg = total / n;
f@weight_min = minv;
f@weight_max = maxv;
f@weight_sum = total;
}
| Detail 결과 | Attribute Promote | Detail Wrangle |
|---|---|---|
| Average | 4.333333 | 4.333333 |
| Minimum | 1 | 1 |
| Maximum | 10 | 10 |
| Sum | 26 | 26 |
Houdini 19.5.435 hython에서 위 Detail Wrangle 계산과 Attribute Promote를 같은 포인트 값으로 실행했고 네 결과가 일치했습니다. 별도의 VEX 루프를 작성하면 Mode나 Median 같은 기준도 구현할 수 있지만, 정렬·동률 처리까지 직접 정해야 합니다. 기본 집계 규칙을 쓰려면 노드가 간단하고, 자체 조건이나 계산을 섞어야 한다면 VEX가 더 유연합니다. 성능 차이는 이 테스트에서 측정하지 않았습니다.
Geometry Spreadsheet에서 Detail 결과를 확인하세요

- Attribute Promote 뒤의 노드를 선택하고 Geometry Spreadsheet에서
Detail탭을 여세요. - 결과 속성이 Detail에 한 값으로 보이는지 확인하세요. 원본 값 전체가 필요하면
Array of All로 다시 확인하세요. - 원래 Point 값이 사라졌다면
Delete Original설정을 보세요. 다음 노드가 포인트 값을 필요로 한다면 이 옵션을 끄거나 새 이름으로 결과를 남기세요. - 조각별 결과가 예상과 다르면
Piece Attribute의 클래스와 정수·문자열 값이 실제로 나뉘는지 확인하세요.
참고 자료
vfx 잡학지식

댓글 0
첫 댓글을 남겨보세요.