후디니 ch() 상대 경로와 chs·chf: 채널 레퍼런스가 0일 때
후디니 ch() 상대 경로를 맞게 쓴 것 같은데 결과가 0으로 나오면 경로부터 고치고 싶어집니다. 하지만 0은 경로 오류뿐 아니라 파라미터 타입과 표현식 문맥이 맞지 않을 때도 나옵니다. ch()로 연결한 값은 원본 파라미터가 바뀔 때마다 다시 읽는 채널 레퍼런스입니다. 지금 입력한 곳이 HScript인지 VEX인지, 그리고 읽으려는 값이 숫자·문자열·벡터 중 무엇인지부터 구분해야 합니다.
이 글에서는 /obj/geo1 아래 box1, xform1, wrangle1을 만든 뒤 Houdini 19.5.435 hython으로 경로와 함수 조합을 확인했습니다. 상대 경로 해석기와 결과 표를 따라가면, 내 ch()가 0이 된 이유를 경로·내부 이름·타입 중에서 좁힐 수 있습니다.
먼저 HScript 표현식과 VEX 코드를 구분하세요
후디니 익스프레션의 일반 파라미터 입력칸은 기본적으로 HScript입니다. Attribute Wrangle의 Snippet 같은 특정 입력칸은 VEX 코드입니다. 둘 다 ch()라는 이름을 쓰지만, 문자열 처리나 시간 인수의 단위가 같지 않습니다.
| 읽을 값 | HScript 파라미터 표현식 | VEX Wrangle | 주의할 차이 |
|---|---|---|---|
| 숫자 | ch(path), chf(path, frame) | ch(path), chf(path, time) | HScript chf의 두 번째 값은 프레임, VEX chf는 초 |
| 문자열 | chs(path) | chs(path) 또는 ch(path) | VEX ch는 string 반환도 지원 |
| 정수 | ch(path) | chi(path) | chi는 VEX 함수 |
| 벡터 | 축별 내부 이름을 ch()로 읽기 | chv(path) | VEX chv는 vector tuple 전체를 읽음 |
| 램프 | chramp(path, position, component_index) | chramp(path, position) | HScript float ramp의 component_index는 0 |
SideFX의 HScript ch() 페이지는 숫자 값을 반환한다고 설명하고, 별도 chs() 페이지는 문자열을 반환한다고 설명합니다. 다만 Expression Cookbook의 타입 대응표는 HScript 문자열 항목에 ch라고 적어 두 문서 사이에 차이가 있습니다. 이번 실측에서 비숫자 문자열은 ch()로 0, chs()로 원문이 나왔으므로 HScript 문자열에는 chs()를 쓰세요.
VEX에서는 정수 chi(), 실수 chf(), 문자열 chs(), 벡터 chv()처럼 함수가 타입별로 나뉩니다. VEX ch()는 숫자와 문자열 반환을 지원합니다. 따라서 HScript 파라미터 칸과 VEX Wrangle에서 함수 이름을 그대로 바꿔 쓰면 같은 결과를 기대할 수 없습니다.
상대 경로는 표현식을 쓰는 노드에서 출발합니다
ch()의 경로는 파라미터의 화면상 위치가 아니라, 표현식을 평가하는 노드를 기준으로 계산합니다. 아래 예시에서 현재 노드는 /obj/geo1/wrangle1입니다. 같은 네트워크의 box1을 가리키려면 현재 wrangle에서 한 단계 올라간 뒤 box1으로 들어갑니다.
/obj
└─ geo1
├─ box1
├─ xform1
└─ wrangle1 ← 현재 노드
| 대상 | 현재 노드에서 쓸 경로 | 해석 |
|---|---|---|
| 현재 wrangle의 local_test | ./local_test | 현재 노드 안의 파라미터 |
| 같은 네트워크의 box1 X 크기 | ../box1/sizex | 한 단계 위로 간 뒤 box1의 sizex |
| 같은 네트워크의 xform1 X 이동 | ../xform1/tx | 형제 노드 xform1의 tx |
| 부모 geo1의 X 이동 | ../tx | 한 단계 위의 geo1 노드에 있는 tx |
| 절대 경로로 Box X 크기 | /obj/geo1/box1/sizex | /obj부터 시작하는 전체 경로 |
./는 현재 노드를 뜻하므로 ./box1/sizex는 형제 노드로 이동하지 않습니다. 형제 노드로 갈 때는 ../를 먼저 써야 합니다. 경로가 맞아 보여도 마지막 이름이 실제 내부 파라미터 이름인지 확인하세요.
Houdini 상대 경로 해석기
현재 노드와 ch() 안에 넣을 경로를 선택하거나 입력하세요. 마지막 항목을 파라미터 이름으로 나누어 후보 경로를 표시합니다.
노드 후보: /obj/geo1/box1
파라미터 이름 후보: sizex
이 도구는 /, ./, ../를 이용해 경로 문자를 정규화하는 학습용 해석기입니다. 실제 Houdini 씬에서 노드나 파라미터가 존재하는지, 내부 이름과 함수 타입이 맞는지는 검사하지 않습니다.
해석기에서 경로가 기대한 노드로 향해도 값이 나오리라는 보장은 없습니다. Houdini는 노드 경로 뒤의 내부 이름으로 파라미터를 찾아 평가합니다. 화면에 보이는 Translate X와 실제 이름 tx는 다를 수 있으니, 파라미터 툴팁에서 내부 이름을 확인하세요.
벡터 이름은 tuple과 개별 성분을 구분하세요
Translate는 t라는 세 성분 tuple이고, X 성분의 내부 이름은 tx입니다. Box SOP의 Size도 size tuple 아래 sizex, sizey, sizez로 나뉩니다. HScript ch()는 숫자 한 성분을 읽으므로 ch("../xform1/tx")나 ch("../box1/sizex")처럼 축 성분을 지정하세요.
VEX에서는 벡터 전체가 필요할 때 chv("../xform1/t")처럼 tuple 이름을 씁니다. 이때 결과는 (tx, ty, tz) 세 숫자입니다. 반대로 HScript 표현식에서 ch("../xform1/t")를 사용하면 이번 실측에서는 0이 나왔습니다. 벡터 전체를 읽는 VEX의 chv()와 축 하나를 읽는 HScript ch()를 섞지 마세요.
VEX Wrangle에서 @P나 @pscale 같은 geometry attribute를 읽는 일도 ch()의 파라미터 참조와 다릅니다. 속성의 Class와 저장 위치가 달라 값이 안 바뀌는 경우는 후디니 포인트·버텍스·프리미티브 속성 확인 글에서 구분할 수 있습니다.
HScript의 ch()가 문자열에서 0이 되는 이유
문자열 파라미터를 숫자형 ch()로 읽으면 문자열이 숫자로 해석될 수 있을 때만 그 숫자를 돌려줍니다. 문자열 cube_label을 읽은 실측에서는 0이 나왔지만, 문자열 42를 읽었을 때는 42가 나왔습니다. 그래서 모든 문자열 참조가 0이라고 단정하면 안 됩니다.
HScript에서 문자열 값이 필요하면 chs("../box1/string_test")를 사용하세요. 같은 Houdini 19.5.435 테스트에서 ch()는 0을, chs()는 cube_label을 반환했습니다. VEX Wrangle에서는 ch()도 문자열 반환을 지원해 ch("../box1/string_test")와 chs("../box1/string_test")가 모두 cube_label이었습니다.
| 표현식 | 입력 문맥 | 실측값 |
|---|---|---|
| ch("../box1/string_test") | HScript 파라미터 | 0 |
| chs("../box1/string_test") | HScript 파라미터 | cube_label |
| ch("../box1/string_test") | VEX Wrangle | cube_label |
| ch("../box1/numeric_string") | HScript 파라미터, 원본 string은 42 | 42 |

chf()는 이름이 같아도 프레임과 초가 다릅니다
HScript chf("path", frame)은 지정한 프레임에서 파라미터를 평가합니다. VEX chf("path", time_in_sec)는 초 단위의 시간을 받습니다. 두 번째 값을 1이라고 쓰더라도 HScript에서는 1프레임, VEX에서는 1초로 해석합니다.
| 입력 위치 | 표현식 | 두 번째 값의 단위 | 실측 결과 |
|---|---|---|---|
| HScript 파라미터 | chf("../box1/anim_test", 1) | 프레임 | 프레임 1 값 2 |
| HScript 파라미터 | chf("../box1/anim_test", 25) | 프레임 | 프레임 25 값 4 |
| VEX Wrangle | chf("../box1/anim_test", 1.0) | 초 | 24fps에서 1초, 프레임 25 값 4 |
같은 이름 때문에 프레임 단위로 착각하기 쉬운 구간입니다. SideFX 공식 문서의 Houdini 19.5와 22.0 페이지 모두 VEX chf의 시간 인수를 초로 설명합니다. HScript 표현식 칸에 쓴 chf와 Wrangle 코드에 쓴 chf를 바꿔 비교하세요.
Copy Parameter는 destination에서 source를 참조합니다
수동으로 경로를 세기 어렵다면 source 파라미터에서 우클릭해 Copy Parameter를 누르고, destination 파라미터에서 Paste Relative Reference(s)를 선택하세요. Houdini가 destination에서 source를 가리키는 상대 경로를 만듭니다. SideFX 문서 예시는 ch("../sphere1/tx")입니다.
세 축 중 하나만 연결하려면 source와 destination의 해당 성분 입력칸에서 복사·붙여넣기하세요. 파라미터 라벨을 클릭하면 여러 성분을 한 번에 연결할 수 있습니다. 두 노드가 다른 네트워크에 있거나 destination을 옮길 가능성이 있으면 Paste other > Paste absolute references를 선택할 수 있습니다. 노드 이름이 바뀔 때 Houdini가 참조를 자동 갱신한다는 점도 SideFX 문서에 설명되어 있습니다.
0이 나오면 이 순서로 원인을 좁히세요
지금 입력한 곳의 언어부터 확인하세요. 일반 파라미터 표현식인지, VEX Snippet인지 구분한 뒤 아래 순서대로 검사하면 됩니다.
- 현재 노드 경로를 확인하세요. 표현식을 평가하는 노드가 어디인지 Network Editor에서 확인합니다. 상대 경로를 현재 선택한 노드가 아니라 파라미터 소유 노드 기준으로 다시 셉니다.
- 파라미터 내부 이름을 확인하세요. 화면에 보이는 라벨 대신 툴팁에 표시되는 이름을 씁니다. tx와 t, sizex와 size를 바꿔 넣지 않습니다.
- 읽을 값에 맞는 함수를 고르세요. HScript 문자열은 chs(), 프레임 샘플은 chf(), 램프는 chramp()입니다. VEX의 정수 chi()와 벡터 chv()를 HScript 칸에 쓰지 마세요.
- 실제 결과와 오류 상태를 나눠 보세요. 누락 경로나 숫자로 읽지 못한 string은 HScript에서 0이 될 수 있습니다. 반면 VEX 함수 인수 개수가 틀리면 Wrangle compile error와 cook 실패가 나타날 수 있습니다.
Houdini 19.5.435에서는 없는 파라미터 경로를 ch()에 넣어도 0이 반환됐습니다. 반면 VEX chf()에 숫자를 더 넣어 잘못 호출했을 때는 No matching function 오류가 나며 Wrangle cook이 실패했습니다. 0만 보고 연결 성공 여부를 판단하지 말고, 대상 경로와 타입, Wrangle 오류를 함께 확인하세요.
Houdini 19.5와 최신 공식 문서의 차이
실측은 Houdini 19.5.435에서 했고, 비교한 최신 SideFX 문서는 22.0 페이지입니다. 이 글에 필요한 상대 경로 규칙과 ch·chs·chf·chramp의 역할, VEX chf의 초 단위 시간은 두 문서 버전에서 일치했습니다. 21·22를 직접 실행한 결과로 확대하지는 않습니다.
SideFX의 두 문서에는 Paste Relative Reference와 Paste Relative References라는 메뉴 표기가 각각 나옵니다. 두 표기는 모두 destination에서 source를 참조하는 상대 참조 붙여넣기 동작을 가리킵니다. 사용 중인 Houdini 화면의 메뉴 문구를 기준으로 찾으세요.
후디니 ch()가 0이면 함수와 경로를 같이 확인하세요
후디니 ch()가 0을 반환해도 경로만 틀렸다고 볼 수 없습니다. 현재 표현식 문맥, 상대 경로, 파라미터 내부 이름, 읽을 값의 타입을 함께 확인해야 원인을 찾을 수 있습니다.
마지막으로 기억할 기준은 하나입니다. 0이 나오면 경로와 함수 타입을 함께 확인하세요.
참고 자료
vfx 잡학지식

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