Posted: May 7, 2018
Version: Houdini 16.5
point(a, b, c)
각각의 인자는 다음과 같은 역할을 한다.
a: 어트리뷰트를 얻으려는 대상 지오메트리
b: 얻으려는 어트리뷰트 이름
c: 어트리뷰트를 얻으려는 지오메트리의 점번호
괄호안에 각 인자들의 타입 은 다음과 같다.
인자 a 는 Wrangle 노드의 인풋번호이므로 Integer 타입을 기대한다.
인자 b 는 어트리뷰트 이름이므로 String 타입을 기대한다.
인자 c 는 Point Number 이므로 Integer 타입을 기대한다.
Point 함수 예제
point() 함수를 이용해서 스피어를 그리드 점들 위에 번갈아 위치시켜 보자.
후디니를 열고 /obj 에 스피어 지오메트리를 하나 만든다.
만들어진 'sphere1' 노드를 더블클릭하여 Geometry 레벨로 들어간다.
Grid SOP, Attribute Wrangle SOP 을 하나씩 만들고 다음과 같이 연결해 준다.
연결한 뒤에는 'attribwrangle1' 노드의 Display Flag 를 선택한다.
Wrangle 노드와 같이 여러개의 인풋을 연결할 때는 그 순서에 주의한다.
스피어의 위치를 변화시키는게 목적이므로 'sphere1' 노드를 첫번째 인풋에 연결한다.
그리드는 어트리뷰트 참조만 하기때문에 'grid1' 노드는 두번째 인풋에 연결한다.
아직 VEX 를 입력하지 않았기 때문에 스피어는 어떤 변화도 없다.
'grid1' 노드의 Template Flag 를 선택해서 같이 보도록 한다.
'attribwrangle1' 노드의 VEXpression 란에 다음과 같이 VEX 를 입력한다.
VEXpression 칸에 입력하는 동안은 결과를 볼수 없다. 마우스 커서를 VEXpression 칸 밖으로 이동시켜 클릭해야 입력된 VEX 가 적용된다. 바로 결과를 볼 수 있는 단축키는 Ctrl + Enter 이다.
그 결과, 스피어의 위치가 그리드의 0번 점 위치로 옮겨진다.
이제 VEX 코드를 한문장씩 차근차근 보도록 하자.
point() 함수 첫번째 인자로 쓰인 1은 'attribwrangle1' 노드의 인풋번호를 뜻한다.
인풋번호는 0부터 시작하므로 1은 두번째 인풋인 'grid1' 노드를 말한다.
즉, 어트리뷰트를 참조할 대상이 그리드인 것이다.
두번째 인자 "P" 는 그리드가 가진 어트리뷰트들 중, 위치값(P) 을 참조한다는 뜻이다.
참고로, 그리드는 현재 P 이외에는 어떤 어트리뷰트도 갖고 있지 않다.
세번째 인자는 그리드 100개의 점들중 0번 점의 P 값을 돌려달라는 뜻이다.
그리고 이 리턴값을 'pos' 라는 vector 타입 변수 에 할당하였다.
참조하려는 어트리뷰트(P) 가 벡터이므로 변수 'pos' 의 타입도 vector 로 정해준 것이다.
스피어의 위치 'P' 어트리뷰트 값에 위에서 만든 'pos' 변수를 대입했다.
이와 같이, 변수는 VEX 안에서 원할 때마다 불러져 쓰일 수 있다.
결과적으로 스피어는 그리드 0번 점 위로 위치하게 된다.
VEX 코드를 다음과 같이 고친다.
point() 함수 세번째 인자에 0 대신 @Frame 을 넣었다.
@P = pos;
@Frame 은 후디니에서 지정된(Reserved) 어트리뷰트들 중 하나이다.
@Frame 은 글로벌 변수 $F 와 똑같이 현재 프레임 번호를 리턴한다.
이처럼 함수 인자에 고정이 아닌 변하는 수(@Frame) 가 쓰이면 그 함수가 리턴하는 값도 변하게 된다.
플레이를 해 본다.
다음과 같이 스피어가 그리드 점 위치를 차례대로 옮겨 다닌다.
그 원리는 다음과 같다.
Frame 1 에서 스피어 위치 = 그리드 (@Frame)번 점의 P = 그리드 1번 점의 P
Frame 2 에서 스피어 위치 = 그리드 (@Frame)번 점의 P = 그리드 2번 점의 P
Frame 3 에서 스피어 위치 = 그리드 (@Frame)번 점의 P = 그리드 3번 점의 P
...
Frame 99 에서 스피어 위치 = 그리드 (@Frame)번 점의 P = 그리드 99번 점의 P