VEX 함수 rand

인자에 따라 무작위의 랜덤한 숫자를 리턴하는 rand 함수에 대해서 알아보자.

Posted: April 13, 2018
Version: Houdini 16.5

Rand VEX Function

rand() 함수는 인자에 따라 랜덤한 수를 리턴한다.

이때 리턴하는 값은 0 과 1 사이의 실수(float) 이다.

 

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

rand(a)

 

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

만약 인자가 변하지 않는 특정 숫자라면 리턴값도 한개이므로 보통 다음과 같이 사용한다.

 

도형의 점마다 각기 다른 랜덤값을 얻기위해 점번호를 뜻하는 @ptnum 을 인자로 쓴다.

도형의 면마다 각기 다른 랜덤값을 얻기위해 면번호를 뜻하는 @primnum 을 인자로 쓴다.

@ptnum, @primnum 앞에 @ 이 붙은것으로 봐서, VEX 에서 어트리뷰트 로서 다뤄지고 있다는 것을 알 수 있다. 다만 이 둘은 후디니에서 특별히 지정된(Reserved) 어트리뷰트 이름들이다.

Rand 함수 예제

rand() 함수를 이용해서 그리드에 랜덤한 색상을 적용해 보자.

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

VEX_func_rand_1.jpg

 

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

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

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

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

 

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

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

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

 

그 결과, 그리드의 색상이 검정/흰색 계열로 랜덤하게 바뀌었다.

VEX_func_rand_5.jpg

 

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

float rval = rand(@ptnum);

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

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

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

 

@Cd = rval;

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

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

 

'attribwrangle1' 노드의 Geometry Spreadsheet 을 열고 만들어진 어트리뷰트를 확인한다.

그리드 점마다 랜덤한 Cd 값을 얻었지만 그 범위는 0 과 1 사이 안에 있다.

현재 Cd 는 Point 어트리뷰트임을 이해한다.

현재 Cd 는 Point 어트리뷰트임을 이해한다.

 

현재 'rval' 변수의 타입이 float 이므로 각 점마다 r,g,b 모두 같은 값이 된다.

이 때문에 흑백계열의 색만 얻은 것이다.

 

'rval' 변수의 타입을 vector 로 바꿔보자.

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

vector rval = rand(@ptnum);
@Cd = rval;

 

이번에는 그리드 색이 알록달록하게 바뀌었다.

VEX_func_rand_8.jpg

 

Geometry Spreadsheet 을 다시 열고 Cd 어트리뷰트를 확인한다.

각 점마다 r,g,b 모두 다른 값이 된다.

VEX_func_rand_7.jpg
VEX 어트리뷰트 강좌에서는 어트리뷰트 타입(f,i,v,s) 을 @ 앞에 지정해야 한다고 배웠다. 이번 강좌에서 이러한 타입을 생략한 이유는 @Cd, @ptnum 모두 후디니에서 지정한(Reserved) 어트리뷰트들이기 때문이다. 즉, 굳이 타입을 생략해도 @Cd 는 Vector, @ptnum 은 Integer 타입이라는 것을 후디니는 이해한다.