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

후디니 For-Each 루프: 조각별·횟수별 차이와 메타데이터

vfx 잡학지식 읽는 시간 약 11분 조회 4

조각마다 다른 값을 적용하려면 Piece 루프, 같은 작업을 정해진 횟수만큼 이어 하려면 Count 루프를 고르세요. 두 방식의 차이는 반복할 대상을 어떻게 정하느냐에 있습니다. 그런데 Block End의 Merge와 Feedback은 왜 또 따로 고를까요?

Piece와 Count는 반복 대상, Feedback과 Merge는 반복 결과를 모으는 방식입니다. 이 두 선택을 구분하면 “조각별 처리”와 “10회 누적”을 같은 문제로 착각하지 않습니다. Houdini 19.5.435에서 다섯 조각과 열 번 반복을 직접 만들고 점 위치와 속도를 비교했습니다.

Piece는 조각을, Count는 횟수를 셉니다

For-Each Connected Piece나 For-Each Named Primitive는 입력을 몇 개의 조각으로 나눠 한 조각씩 같은 노드 흐름에 통과시킵니다. 반면 For-Each Number는 지정한 수만큼 반복합니다. 한 바위마다 다른 위치 오프셋을 주는 작업은 Piece, 같은 메시를 열 번 밀어 누적하는 작업은 Count와 Feedback이 자연스럽습니다.

원하는 작업반복 기준시작할 설정
연결된 조각별 처리Connected PieceConnectivity의 class를 Piece Attribute로 사용
name이 같은 프리미티브 묶음별 처리Named PrimitivePiece Attribute=name, Piece Elements=Primitives
점 하나씩 처리PointPiece Elements=Points, Piece Attribute 비움
같은 작업을 N회 반복Number / CountIteration Method=By Count, Iterations=N

Connected Piece는 Connectivity SOP로 연결 요소마다 고유한 class 값을 만드는 방식입니다. Named Primitive는 동일한 name 값을 가진 프리미티브를 한 조각으로 묶습니다. Piece Attribute를 비우면 Piece Elements에서 고른 각 점이나 프리미티브가 따로 한 번씩 처리됩니다. 프리미티브 연결은 점을 공유하는지로 판단하므로, 서로 닿아 보이는 면도 실제로 점이 분리돼 있으면 다른 조각이 될 수 있습니다.

Block Begin은 입력을 고르고 Block End는 결과를 모읍니다

시작 노드의 Method는 각 반복에 어떤 geometry를 넣을지 정합니다. Extract Piece or Point는 매번 선택된 조각만 보냅니다. Fetch Feedback은 첫 반복에 원본을 보내고, 다음 반복부터 직전 Block End 출력물을 입력으로 돌려보냅니다. Fetch Input은 원래 입력을 가져옵니다. Fetch Metadata는 현재 반복 번호 같은 정보를 가진 빈 geometry를 만듭니다.

끝 노드의 Iteration Method는 조각을 셀지 반복 횟수를 셀지 정합니다. By Pieces or Points는 입력의 조각을 모두 순회하고, By Count는 Iterations에 적은 수만큼 실행합니다. Gather Method는 각 반복의 결과를 어떻게 내보낼지 정합니다. Feedback Each Iteration은 마지막 반복 결과만 출력합니다. Merge Each Iteration은 pass마다 나온 결과를 한데 모읍니다.

Gather의 Feedback이 다음 반복 입력을 만드는 것은 아닙니다. 다음 입력을 직전 결과로 바꾸는 설정은 시작 노드의 Fetch Feedback입니다. Gather의 Feedback Each Iteration은 출력 결과를 마지막 pass 하나로 제한합니다. 그래서 Merge를 고르면 반복마다 결과를 모으더라도, 시작 노드가 Fetch Feedback이면 다음 pass는 여전히 직전 pass의 출력으로 시작합니다.

Piece와 Count 흐름을 직접 비교해 보세요

반복 1 / 5

이번 입력

노드 흐름의 출력

다음 반복의 입력

최종 Gather 결과

이 도구는 흐름을 이해하기 위한 개념도이며 Houdini 네트워크를 실제로 계산하지 않습니다. Piece 모드에서는 입력 조각이 매번 달라집니다. Count 모드에서는 Fetch Feedback이 켜져 있어 다음 입력에 직전 결과가 이어집니다. Gather 선택은 pass 결과의 출력 방식만 바꿉니다.

다섯 조각은 Y=0부터 4까지 나뉘었습니다

Houdini 19.5.435 hython에서 Box 다섯 개를 만들고 각 프리미티브에 name 값을 piece0부터 piece4까지 넣었습니다. Block Begin은 Extract Piece or Point, Block End는 By Pieces or Points로 두었습니다. Piece Elements는 Primitives, Piece Attribute는 name으로 설정했습니다. loop 안의 Point Wrangle은 metadata iteration 값을 Y 이동량으로 썼습니다.

조각iteration처리 후 평균 Y점 수
piece0008
piece1118
piece2228
piece3338
piece4448

출력은 점 40개와 프리미티브 30개였습니다. 각 조각이 자기 iteration 값만큼 올라갔습니다. 점에 pieceid 0–4를 만들어 둔 뒤 Point Wrangle 한 번으로 @P.y += i@pieceid;를 실행해도 같은 평균 Y가 나왔습니다. 이 단순 이동처럼 요소별로 한 번에 계산할 수 있는 작업이라면 Wrangle의 Run Over와 실행 횟수 차이도 함께 살펴보세요.

후디니 For-Each Block End Merge Each Iteration 설정과 조각별 iteration 0~4 결과
Houdini 22.0.466 Apprentice에서 면 5개를 조각으로 돌린 For-Each 루프입니다. Block End는 Gather Method가 Merge Each Iteration이고, 메타 데이터의 iteration 값(0~4)만큼 조각을 0.5씩 올렸습니다. 22 화면의 Iteration Method 이름은 By Pieces or Points입니다.

열 번 반복하면 Feedback과 Merge는 다른 출력을 만듭니다

이번에는 점 8개인 Box를 입력하고 Count의 Iterations를 10으로 설정했습니다. 각 반복에서 점을 Y 방향으로 1씩 이동했습니다. 시작 노드는 Fetch Feedback으로 두어 매번 직전 결과에서 다시 시작했습니다.

Gather Method최종 점 수최종 Y 위치수집되는 형상
Feedback Each Iteration89.5–10.5iteration 9를 마친 뒤의 마지막 형상만 출력
Merge Each Iteration80평균 Y가 1부터 10까지인 결과 10개pass 0–9에서 나온 형상 10개를 병합

두 방법 모두 열 번째 pass 자체는 Y=10 위치에 도착했습니다. Feedback Gather는 그 마지막 형상만 남겼습니다. Merge Gather는 pass가 끝날 때마다 나온 형상을 모아 열 개 층으로 출력했습니다. 여기서 Merge가 직전 출력을 다음 입력으로 바꾼 것은 아닙니다. 입력을 이어 준 설정은 Block Begin의 Fetch Feedback입니다.

Merge Each Iteration은 점과 프리미티브 번호 범위를 다시 매길 수 있습니다. 반복 뒤에도 조각을 찾을 계획이면 ptnum 같은 순번만 믿지 말고 name, class, pieceid처럼 목적에 맞는 속성을 보존하세요.

Metadata의 iteration은 0부터 시작합니다

반복 번호나 전체 횟수가 필요하면 Block Begin에서 Create Meta Import Node를 눌러 Fetch Metadata 노드를 만드세요. 이 노드는 numiterations, iteration, value, ivalue 같은 detail 속성을 제공합니다. iteration은 첫 반복에서 0이며 한 번 돌 때마다 1씩 올라갑니다. 열 번 반복의 번호가 0–9인 이유입니다.

파라미터의 HScript 표현식에서 iteration을 읽을 때는 아래처럼 메타 노드 경로를 지정합니다.

detail("../foreach_begin1_metadata1", "iteration", 0)

Attribute Wrangle의 VEX에서는 메타데이터 geometry를 두 번째 입력에 연결한 뒤 detail(1, "iteration", 0)을 사용합니다. HScript 표현식의 경로 문자열과 VEX의 입력 번호를 같은 문법으로 섞지 마세요. piece별 이동에 이 값을 쓰면 순번이 0부터 시작한다는 점도 계산에 반영해야 합니다.

작은 실험에서는 단일 Wrangle이 더 빨랐습니다

점마다 일정량을 더하는 동일한 작업을 루프와 한 번의 Point Wrangle로 비교했습니다. 각 조건은 준비 cook 한 번을 제외하고 다섯 번 측정한 중앙값입니다. 두 테스트 모두 결과 위치가 일치했습니다.

테스트For-Each 루프단일 Wrangle이번 측정
5개 조각, 총 12,500 points9.454 ms3.583 ms루프가 약 2.64배 느림
10회 Count, 10,000 points3.604 ms0.460 ms루프가 약 7.83배 느림

이 수치는 Houdini 19.5.435 hython의 단순한 Y 이동 실험일 뿐, 다른 지오메트리나 노드 조합의 속도를 예측하지 않습니다. 이처럼 같은 점 속성만 바꾸면 Wrangle이 간결할 수 있습니다. 반대로 조각마다 별도 노드 체인을 적용하거나, 각 반복의 결과를 검사·합쳐야 한다면 For-Each가 구조를 분명하게 보여 줍니다. 속도가 중요하면 내 입력과 실제 노드로 다시 재세요.

Houdini 22 문서에서는 메뉴 이름이 다릅니다

Houdini 19.5.435에서 Block End의 Iteration Method 메뉴는 By Pieces or Points라고 표시됐습니다. 현재 SideFX의 Houdini 22.0 온라인 문서에는 같은 모드가 By Pieces로 적혀 있습니다. Piece Elements에서 Points와 Primitives를 고르는 기능은 그대로 설명되므로, 작업 중인 화면의 버전에 맞춰 이름을 읽으세요.

Piece는 조각, Count는 횟수, Fetch Feedback은 다음 입력, Gather Method는 출력 모음 방식을 정합니다.

SideFX 공식 문서

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.