VEX 함수 vertex

지오메트리 버택스 어트리뷰트의 데이터값을 리턴하는 vertex 함수에 대해서 알아보자.

Posted: April 5, 2021

Version: Houdini 18.0


Vertex VEX Function

vertex() 함수는 해당하는 버택스의 특정 어트리뷰트 값을 돌려준다.

vertex() 함수의 기본형태는 다음과 같다.

vertex(a, b, c)

 

각각의 인자는 다음과 같은 역할을 한다.

a: 어트리뷰트를 얻으려는 대상 지오메트리

b: 얻으려는 어트리뷰트 이름

c: 어트리뷰트를 얻으려는 지오메트리의 버택스번호

괄호안에 각 인자들의 타입 은 다음과 같다.

인자 a 는 Wrangle 노드의 인풋번호이므로 Integer 타입을 기대한다.

인자 b 는 어트리뷰트 이름이므로 String 타입을 기대한다.

인자 c 는 Vertex Number 이므로 Integer 타입을 기대한다.


점번호 VS 버택스번호

이미 SOP기초 페이지에서 점과 버택스의 차이점을 간략히 소개했다.

이외에도 이 두요소는 번호를 매기는 순서에도 차이를 보인다.

다음은 어떤 평면도형의 점번호와 버택스번호를 각각 나타낸다.

0번 1번은 이 둘의 번호가 같지만 2번 3번은 번호가 뒤바뀌어져 있다는걸 알 수 있다.

버택스의 경우 사각형의 가장자리를 순차적으로 지나가듯 번호가 매겨진다.

point number

point number

vertex number

vertex number

사각형 면이 한개밖에 없으므로 총 점의개수와 버택스개수는 둘다 4개로 동일하다.

Vertex 함수 예제

vertex() 함수를 이용해서 버택스번호에 따라 박스의 색을 바꿔보자.

후디니를 열고 ‘/obj’ 에 Geometry 노드를 하나 만든다.

vex-vertex-img3.png

 

만들어진 ‘geo1' 노드를 더블클릭하여 Geometry 레벨로 들어간다.

Box SOP, Grid SOP, Attribute Wrangle SOP 을 하나씩 만들고 다음과 같이 연결해 준다.

연결한 뒤에는 'attribwrangle1' 노드의 Display Flag 를 선택한다.

연결한 뒤에는 'attribwrangle1' 노드의 Display Flag 를 선택한다.

 

Wrangle 노드와 같이 여러개의 인풋을 연결할 때는 그 순서에 주의한다.

박스의 색깔을 변화시키는게 목적이므로 'box1' 노드를 첫번째 인풋에 연결한다.

어트리뷰트 참조만 하기때문에 ‘grid1' 노드는 두번째 인풋에 연결한다.

 

아직 VEX 를 입력하지 않았기 때문에 박스는 어떤 변화도 없다.

vex-detail-img0.png

‘grid1’ 노드의 파라미터를 다음과 같이 수정한다.

rows/columns 값에 각각 2를 입력해서 분할선을 제거해 준다.

그리드는 분할선이 제거되어 면이 한개뿐인 사각형이 된다.

size 값은 추후 박스와 비슷한 크기로 같이 보기위해 줄여준것 뿐이다.

size 값은 추후 박스와 비슷한 크기로 같이 보기위해 줄여준것 뿐이다.


Color SOP 3개를 만들고 다음과 같이 ‘grid1’, ‘attribwrangle1’ 사이에 차례대로 연결해 준다.

연결한 뒤에는 ‘color3' 노드의 Display Flag 를 선택한다.

연결한 뒤에는 ‘color3' 노드의 Display Flag 를 선택한다.


각 color 노드의 파라미터를 다음과 같이 수정한다.

점마다 다른색을 부여하기 위해 group 파라미터에 일일히 다른 번호를 입력하였다.

이때 입력한 번호는 점번호를 의도한 것이므로 group type 또한 points로 바꿔주어야 한다.

기본값 guess from group 은 면번호로 인식하기 때문에 주의하도록 한다.

vex-vertex-img7.png
vex-vertex-img8.png
vex-vertex-img9.png

이제 그리드색은 1번점은 빨강, 2번점은 초록, 3번점은 파랑색이 되었다.

point number 에 따른 컬러

point number 에 따른 컬러

0번 점은 색을 지정해주지 않았지만 다른점들로 인해 강제로 Cd 어트리뷰트가 생성되며 기본값 흰색을 얻는다. 후디니에서는 어떤 어트리뷰트의 기본값은 0값을 할당하지만 Cd 어트리뷰트는 디스플레이 목적상 특별히 1값이 할당된다.

‘color3’ 노드위 마우스 중간버튼으로 Cd 어트리뷰트가 생겻음을 확인한다.

이때 color 노드의 클래스 파라미터가 point 여서 Cd는 점 어트리뷰트가 된다.

vex-vertex-img13.png

Cd를 버택스 어트리뷰트로 만들기 위해 Attribute Promote SOP 을 만들고 다음과 같이 연결한다.

이 노드는 특정 어트리뷰트를 클래스 간 이동(promote) 시키고자 할때 사용한다.

vex-vertex-img14.png

‘attribpromote1’ 노드의 파라미터를 다음과 같이 수정한다.

original name 에서 이동시킬 어트리뷰트 이름을 입력한다.

original class 는 이동시키기 전 어트리뷰트 클래스를 말한다.

new class 는 새롭게 이동시킬 클래스를 말한다.

vex-vertex-img11.png

‘attribpromote1’ 노드위 마우스 중간버튼으로 Cd가 버택스 어트리뷰트로 프로모션된 것을 볼 수 있다.

vex-vertex-img12.png

위에서 그리드색은 1번 점은 빨강, 2번 점은 초록, 3번 점은 파랑색이이었다.

이번에는 1번 버택스는 빨강, 2번 버택스는 파랑, 3번 버택스는 초록색이 되었다.

그 이유는 위에서 설명했듯이, 2번과 3번 번호가 뒤바뀌기 때문이다.

vertex number 에 따른 컬러

vertex number 에 따른 컬러

이제 그리드에 버택스 어트리뷰트가 있으므로 vertex() 함수를 써보자.

'attribwrangle1' 노드의 VEXpression 란에 다음과 같이 VEX 를 입력한다.

VEXpression 칸에 입력하는 동안은 결과를 볼수 없다. 마우스 커서를 VEXpression 칸 밖으로 이동시켜 클릭해야 입력된 VEX 가 적용된다. 바로 결과를 볼 수 있는 단축키는 Ctrl + Enter 이다.

VEXpression 칸에 입력하는 동안은 결과를 볼수 없다. 마우스 커서를 VEXpression 칸 밖으로 이동시켜 클릭해야 입력된 VEX 가 적용된다. 바로 결과를 볼 수 있는 단축키는 Ctrl + Enter 이다.

그 결과, 박스의 색깔이 파랑색이 되었다.

이제 VEX 코드를 한문장씩 차근차근 보도록 하자.

vex-vertex-img17.png
 
vector read_color = vertex(1, "Cd", 2);

vertex() 함수 첫번째 인자로 쓰인 1은 'attribwrangle1' 노드의 인풋번호를 뜻한다.

인풋번호는 0부터 시작하므로 1은 두번째 인풋인 'attribpromote1' 노드를 말한다.

즉, 어트리뷰트를 참조할 대상이 그리드인 것이다.

 

두번째 인자 "Cd" 는 그리드가 가진 어트리뷰트들 중, 컬러값(Cd) 을 참조한다는 뜻이다.

참고로, 그리드는 현재 P, Cd 이외에는 어떤 어트리뷰트도 갖고 있지 않다.

세번째 인자는 그리드 4개의 버택스중에 2번 버택스의 Cd 값을 돌려달라는 뜻이다.

그리고 이 리턴값을 'read_color' 라는 vector 타입 변수 에 할당하였다.

참조하려는 어트리뷰트(Cd) 가 벡터이므로 변수 'read_color' 의 타입도 vector 로 정해준 것이다.

 

@Cd = read_color;

박스의 색깔 'Cd' 어트리뷰트 값에 위에서 만든 'read_color' 변수를 대입했다.

이와 같이, 변수는 VEX 안에서 원할 때마다 불러져 쓰일 수 있다.

결과적으로 그리드의 2번 버택스가 가지는 Cd 어트리뷰트를 참조하여 파랑색으로 바뀌는 것이다.