후디니 Wrangle Run Over 차이: Points·Primitives·Vertices·Detail 실행 횟수
후디니 Wrangle(Attribute Wrangle)에 같은 VEX 코드를 넣었는데, Points에서는 박스가 움직이고 Detail에서는 그대로일 수 있습니다. 코드가 달라진 것도 아닌데 왜 결과가 다릅니까? Run Over를 바꾸면 실행 대상과 횟수가 함께 달라집니다. 먼저 Box 하나로 다섯 모드를 비교하면 어디에 값을 쓰고 있는지 구분할 수 있습니다.
여기서 헷갈리는 이유는 실행 단위와 속성 클래스가 한꺼번에 바뀌기 때문입니다. 실행 횟수는 점·면·버텍스·전체·지정 숫자 중 무엇을 순회하는지로 결정되고, 새로 쓰는 @ 속성은 현재 Run Over에 맞는 클래스에 만들어집니다. 이번 글은 그 실행 방식을 다룹니다. 속성 클래스 자체가 낯설다면 포인트·버텍스·프리미티브 속성이 저장되는 위치를 먼저 확인하세요.
후디니 Wrangle Run Over 실행 횟수를 Box 하나로 세어 봅니다
실험에는 Houdini 19.5.435의 Box SOP를 사용했습니다. 기본 박스에는 점 8개, 프리미티브 6개, 버텍스 24개가 있습니다. 면 하나가 점 네 개를 참조하지만, 모서리마다 면 쪽 연결이 별도로 있기 때문에 버텍스 수는 점 수와 다릅니다.
Attribute Wrangle에서 Run Over를 바꾸고 아래 코드를 실행했습니다. 첫 줄은 현재 반복 번호를 iter_index라는 새 속성에 기록합니다. 둘째 줄은 실행될 때마다 Detail 속성 exec_count에 1을 더해 호출 수를 셉니다.
i@iter_index = @elemnum;
setdetailattrib(0, "exec_count", 1, "add");
후디니 Wrangle에서 Run Over별로 기록한 결과는 아래와 같습니다. Numbers는 비교를 위해 Number Count를 5로 설정했습니다. 나머지 네 모드는 입력 박스의 요소를 전부 대상으로 했습니다.
| Run Over | 박스에서 실행된 횟수 | iter_index가 생성된 클래스 | 확인할 값 |
|---|---|---|---|
| Points | 8회 | point | 0–7 |
| Primitives | 6회 | primitive | 0–5 |
| Vertices | 24회 | vertex | 0–23 |
| Detail (only once) | 1회 | detail | 0 |
| Numbers Number Count=5 | 5회 | i@iter_index는 생성되지 않음 | @elemnum 0–4 |

@ptnum은 Run Over마다 같은 번호를 뜻하지 않습니다
@elemnum은 현재 반복의 순번입니다. Points에서는 0부터 7까지, Primitives에서는 0부터 5까지, Vertices에서는 0부터 23까지 올라갔습니다. 그래서 일반적인 코드를 여러 Run Over에 재사용할 때는 @elemnum이 편합니다. 반대로 특정 클래스의 번호가 필요하다면 그 이름의 변수가 실제로 무엇을 가리키는지 확인해야 합니다.
Points 모드에서 @ptnum은 현재 점 번호입니다. Vertices 모드에서는 현재 버텍스가 연결된 점 번호를 가리킵니다. Primitives 모드에서는 그 면의 첫 번째 버텍스가 연결된 점 번호를 가리킵니다. 이번 박스의 Primitives 결과에서 @ptnum은 1, 2, 3, 0, 2, 5였습니다. 한 면을 실행할 때 그 면의 모든 점을 돌며 출력하는 변수가 아니라는 뜻입니다.
@primnum도 마찬가지입니다. Primitives에서는 현재 프리미티브 번호입니다. Vertices에서는 현재 버텍스가 속한 프리미티브입니다. Points에서는 점을 포함하는 프리미티브 하나를 가리킵니다. 점을 포함하는 프리미티브가 없으면 -1이고, 점 하나가 여러 면에 속하면 어느 면이 선택될지 임의적입니다. @vtxnum은 Vertices 모드에서 지오메트리 전체의 선형 버텍스 번호입니다. Primitives에서는 각 면의 0번째 버텍스 번호가 나오고, Points에서는 그 점에 연결된 버텍스 중 하나가 선택될 수 있고, 연결된 버텍스가 없으면 -1입니다.
총 개수를 나타내는 변수와 현재 번호도 구분하세요. @numpt는 전체 점 수, @numprim은 전체 프리미티브 수입니다. 이 박스에서는 각각 8과 6이었습니다. @numvtx는 Points·Primitives·Vertices 모드에서 현재 프리미티브의 버텍스 수를 가리켰고, Detail에서는 전체 버텍스 수 24를 반환했습니다. Points 모드에서는 연결된 면을 하나 선택하는 상황이 있으므로, 다른 토폴로지에서는 @numvtx 해석에 주의하세요.
Detail의 한 번 실행은 포인트 순회가 아닙니다
가장 큰 오해는 Detail (only once)을 “모든 포인트를 한 번씩”으로 읽는 것입니다. 실제로는 입력 지오메트리 전체를 대상으로 코드가 한 번 실행됩니다. Detail에서 @elemnum은 0이고, 이 실험의 @ptnum·@primnum·@vtxnum은 -1이었습니다. 현재 점·면·버텍스가 하나씩 선택된 상태가 아니기 때문입니다.
이를 확인하려고 Detail Wrangle에서 v@P = {1, 2, 3};를 실행했습니다. Box의 8개 점 위치는 전후에 그대로였고 Detail 클래스의 P 속성도 만들어지지 않았습니다. Detail에서 @P를 쓴다고 모든 점의 위치가 바뀌지는 않습니다. 모든 점의 위치를 바꾸려면 Run Over를 Points로 두세요. Detail 코드 안에서 특정 점을 바꿔야 한다면 점 번호를 지정하는 쓰기 함수를 사용해야 합니다.
그렇다면 Detail과 Numbers는 무엇이 다릅니까? Detail은 입력 지오메트리에서 한 번 실행하지만, Numbers는 지오메트리 요소 대신 Number Count에 적은 횟수만큼 실행합니다. Number Count=5로 둔 실험에서는 @elemnum이 0부터 4까지, @numelem이 5였습니다. 이 모드의 @ 바인딩은 읽기 전용 detail-level이어서 i@iter_index = @elemnum;만으로 요소별 속성이 만들어지지 않았습니다. 호출 횟수를 세고 싶다면 위 예시처럼 setdetailattrib() 같은 명시적 함수로 집계하세요.
다른 클래스 값은 point()와 prim()으로 읽습니다
@foo는 현재 Run Over 대상에 연결된 속성 바인딩입니다. 다른 클래스의 속성을 읽을 때는 함수의 첫 번째 인수로 입력 지오메트리, 다음으로 속성 이름, 마지막으로 해당 클래스의 요소 번호를 넘깁니다.
float point_scale = point(0, "pscale", @ptnum);
string prim_name = prim(0, "name", @primnum);
point()의 마지막 인수는 점 번호이고, prim()의 마지막 인수는 프리미티브 번호입니다. 함수가 Run Over를 보고 원하는 점이나 면을 찾아주는 것은 아닙니다. Points에서 @primnum을 넣으면 공유된 점을 포함하는 임의의 면을 읽을 수 있습니다. Primitives에서 @ptnum을 넣으면 해당 프리미티브의 첫 버텍스가 연결된 점을 읽습니다. 원하는 요소가 따로 있다면 올바른 번호를 직접 구해 넘기세요. 지정한 요소나 속성이 없으면 두 함수는 0(해당 값 형식의 기본값)을 반환합니다.
Wrangle 결과가 기대와 다르면 실행 단위부터 확인하세요
코드를 고치기 전에 이 세 가지를 확인하면 됩니다.
- 대상 지오메트리에 점·프리미티브·버텍스가 각각 몇 개인지 확인합니다.
- Run Over가 무엇을 순회하는지 보고, 실행 횟수와
@elemnum범위를 예상합니다. - 새 속성 이름이 어느 클래스에 생성됐는지 Geometry Spreadsheet에서 확인합니다. 다른 클래스의 값을 읽는다면
point()또는prim()의 요소 번호가 맞는지 확인합니다.
Houdini 19.5.435에서 직접 확인한 횟수는 Box의 Points 8회, Primitives 6회, Vertices 24회, Detail 1회였습니다. SideFX Houdini 22.0 온라인 문서도 같은 다섯 Run Over 선택지와 Numbers의 @elemnum·@numelem 규칙을 설명합니다. 이 실험에서 확인한 실행 횟수와 새 속성 클래스의 결과는 공식 문서의 기본 동작 설명과 일치했습니다.
공식 문서에서 각 변수를 더 확인하려면 아래 항목을 보세요.
원문 확인이 필요하면 SideFX 공식 문서를 여세요.
한 줄 정리
Wrangle 코드가 몇 번 실행되는지 알고 싶다면, 식보다 먼저 Run Over가 어떤 요소를 순회하는지 확인하세요.
vfx 잡학지식

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