VEX 함수 min

두개의 인자를 비교한뒤 이중 더 작은 수를 리턴하는 min 함수에 대해서 알아보자.

Posted: April 19, 2018
Version: Houdini 16.5

Min VEX Function

min() 함수는 두개의 인자중 더 작은 수를 리턴한다.

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

min(a, b)

 

괄호안에는 두개의 인자(a,b) 가 필요하다.

두개의 숫자를 비교하므로 인자 a,b 의 타입 은 다음과 같아야 한다.

  • Float
  • Integer
  • Vector

 

String(문자열) 타입은 크기비교가 불가능하므로 쓸 수 없다.

min() 함수는 두 인자의 순서가 뒤바뀌어도 그 결과값은 같다.

Min 함수 예제

그리드에 스피어를 복사하면서 min() 함수를 활용한다.

후디니를 열고 /obj 에 그리드 지오메트리를 하나 만든다.

VEX_func_min_1.jpg

 

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

Sphere SOP, Copy to Points SOP 을 한개씩 만들고 다음과 같이 연결한다.

Copy 에 관한 정보는 여기에서 확인한다.

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

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

 

다음과 같이 그리드 점에 스피어들이 복사된다.

VEX_func_min_3.jpg

 

현재 스피어들의 크기가 모두 똑같기 때문에 조금 심심하다.

앞서 배운 rand() 함수를 이용해서 스피어 크기를 랜덤하게 만들자.

 

Attribute Wrangle SOP 을 만들고 다음과 같이 연결해 준다.

VEX_func_min_4.jpg

 

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

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

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

 

그 결과, 스피어들의 크기가 랜덤하게 바뀌었다.

VEX_func_min_6.jpg

 

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

float rval = rand(@ptnum);

우선 rand() 함수의 인자로 @ptnum 을 넣었다.

@ptnum 은 그리드 각 점번호이므로 이를 인자로 받은 rand() 함수도 서로 다른 랜덤값을 리턴한다.

이 리턴값을 'rval' 라는 float 타입 변수 에 할당하였다.

 

f@pscale = rval;

Float 타입의 'pscale' 어트리뷰트 를 만들고 그 값에 위에서 만든 'rval' 변수를 대입했다.

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

 

여기에서 pscale 은 조금 특별한 어트리뷰트다.

pscale 은 후디니에서 지정된(Reserved) 어트리뷰트들 중 하나이다.

즉, pscale 어트리뷰트 값은 작업시 특정부분에 관여하게 된다.

 

Copy 노드는 이러한 pscale 의 영향을 받는 대표적인 노드이다.

pscale 은 point scale 로서 복사되는 지오메트리의 크기(scale) 에 영향을 준다.

 

결국, 복사되는 스피어들의 크기는 다음과 같이 결정된다.

원래의 스피어('sphere1') 크기 * 그리드 각 점의 랜덤한 pscale

 

이제 min() 함수를 추가해 보자.

VEX 코드를 다음과 같이 고친다.

float rval = rand(@ptnum);
f@pscale = min(rval, 0.5);

 

이번에는 랜덤한 rval 변수값을 min() 함수의 인자로 넣었다.

각각의 rval 변수값을 0.5 와 비교한뒤 더 작은 수를 pscale 어트리뷰트값에 할당한다.

단순히 크기비교만 하기 때문에 인자의 순서를 뒤바꿔도 결과는 같다.

min(rval, 0.5) = min(0.5, rval)

 

rval 변수값이 0.5 보다 작으면 min() 함수는 rval 값을 리턴한다.

rval 변수값이 0.5 보다 크면 min() 함수는 0.5 를 리턴한다.

 

pscale 이 0.5 이상이었던 큼직한 스피어들의 크기가 모두 0.5 가 된다.

pscale 이 0.5 이하였던 작은 스피어들은 원래의 크기를 유지한다.

VEX_func_min_7.jpg
이처럼 특정한 수를 기준으로 그 이상/이하를 잘라내고 일률적인 값으로 만드는 작업을 클램핑(Clamping) 이라고 한다. 후디니 작업시 이러한 클램핑을 할때가 많으므로 용어를 잘 알아두도록 하자.