Tutorial 2: 흩날리는 모래


파티클 시스템을 이용해서 흩날리며 밑으로 꺼지는 모래를 만들어보자.

이 튜토리얼을 이해하려면 SOP, VOP, POP, ROP 영역의 선행학습이 요구된다.

hip 다운로드




모래입자 준비하기

/obj 에 지오메트리를 하나를 생성한 후, 이름을 'sandbox' 으로 바꿔준다.



Geometry 레벨로 들어가서 Box SOP 을 만들고 파라미터 창을 다음과 같이 수정한다.



다음처럼 널찍한 박스 한 개가 만들어진다.



Points from Volume SOP 을 만들어 'box1' 노드에 연결하고 파라미터 창을 다음과 같이 수정한다.

이 노드는 인풋 지오메트리의 볼륨을 측정하고 거기에 점들을 생성하는 기능을 한다.



박스 형태의 무수한 점들이 생겼다. 이는 우리가 시뮬레이션할 모래 입자들이다.

'Point Separation' 속성은 얼만큼의 간격으로 점들을 생성할지를 결정한다.

즉, 이 속성값이 작을수록 더욱 촘촘하면서 많은 점들이 생긴다.



'Jitter Scale' 속성은 직각 형태(Grid Style) 로 생성된 점들을 흐트러뜨리는 역할을 한다.

XYZ 각 축으로 0.01 의 간격으로 생긴 그리드 형태의 점들이 자연스럽게 흐트러진다.




시뮬레이션 우선입자 설정하기

이제 준비된 모래입자들을 파티클 시스템으로 흩날리게 하면 된다.

하지만 이 모래입자들이 모두 동시에 흩날리기 시작한다면 조금 시시할 것이다.

VOP 의 노이즈를 이용해서 시뮬레이션 시작 타이밍을 다르게 만들어보자.


Attribute VOP 노드를 한개 만들고 그 이름을 'make_noise' 으로 바꿔준다.

다음과 같이 연결하고 엔터를 눌러 VEX Builder 레벨로 들어간다.



TAB메뉴를 이용해서 다음과 같이 2개의 VOP 노드를 만든다.


새로 만든 VOP 노드들을 다음과 같이 연결해 준다.



'aanoise1' 노드의 파라미터 창을 다음과 같이 수정한다.

대강 이 정도 노이즈의 크기로 모래입자들의 시뮬레이션 타이밍을 나눈다고 생각하며 조절한다.

Anti-Aliased Noise 노드는 -0.5 ~ 0.5 사이의 실수를 출력한다.

노이즈 에 대한 보다 자세한 정보는 여기 에 있다.



Set Vector Component 노드는 실수값을 받아서 X Y Z 요소중 하나에 대입하여 벡터값을 출력한다.

'Vector Component' 속성은 벡터값의 몇 번째 요소에 대입할 것인지를 결정한다.

그 벡터값이라는 것은 노드의 'Input' 속성을 말하고 그 기본값은 <0 0 0> 이다.

즉, 노이즈에서 출력한 값은 벡터값 <0 0 0> 의 첫번째 요소(Component1) 를 덮어쓰게 된다.

이 노드를 연결한 이유는 최종 출력물인 Cd 어트리뷰트가 벡터형이기 때문이다.


결과적으로 빨강색과 검정색이 섞인 노이즈가 만들어진다.

모든 점들의 Cd 어트리뷰트의 두번째 세번째 값, 즉 Green, Blue 가 모두 0 이기 때문이다.

굳이 빨강색으로 정한 이유는 노이즈 작업시 그 변화를 좀 더 가시적으로 확인하기 위함이다.


여기서부터는 다소 어려울 수 있으므로 좀더 집중해서 따라하도록 하자.

모래입자들 중 빨강색을 갖는 입자부터 시뮬레이션을 적용할 것이다.

하지만 위에서 적용한 노이즈는 움직이지 않고 고정되어 있다.

즉, 빨강색 점들은 프레임 1에서 모두 흩날리기 시작하고 검정색 점들은 영원히 움직이지 않을 것이다.


이 노이즈에 애니메이션을 적용해서 모든 점들이 빨강색을 갖을 수 있는 기회를 줘야한다.

노이즈 애니메이션을 위해 'aanoise1' 노드의 'offset' 인풋을 마우스 중간버튼으로 프로모트한다.



단축키 'U' 를 눌러서 위쪽 Geometry 레벨로 올라간다.

'make_noise' 노드 파라미터에 프로모션으로 인해 'Offset' 속성이 생겼음을 볼 수 있다.

이 속성을 다음과 같이 수정한다.



이제 타임라인의 플레이버튼을 클릭해 보자.



후디니 화면 우측 밑 Playbar 에 있는 Real Time Toggle 버튼을 눌러서 리얼타임으로 플레이 한다.



글로벌 변수 $T 로 인해서 노이즈가 천천히 +Y 방향으로 움직임을 확인할 수 있다.




파티클 시뮬레이션 세팅하기

자, 드디어 파티클 다이나믹을 할 시간이 왔다.

같은 Geometry 레벨에서 'POP Network - Old' 노드를 만들고, 그 이름을 'sand_sim' 으로 바꿔준다.

다음과 같이 연결하고 엔터를 눌러 Particles 레벨로 들어간다.



Source POP 을 만들고 [Source] 탭의 파라미터 창을 다음과 같이 수정한다.

상위레벨에 있는 POP Network 첫번째 인풋에 연결된 'make_noise' 노드가 파티클 소스가 된다.



다음, [Birth] 탭의 파라미터 창을 다음과 같이 수정한다.

중요한 점은 준비했던 모래입자들이 파티클이 되는 것이 아니라 파티클을 만들어내는 소스라는 것이다.

우선 'Impulse' 식으로 파티클을 방출하기 위해 'Const. Activation' 속성값을 0으로 바꿨다.


'Impulse Activation' 속성값에 있는 '$F==1' 은 조건문이며 이는 참(1) 또는 거짓(0) 을 리턴한다.

그 원리는 다음과 같다.

프레임 1에서 '$F==1' = '1==1' = 참(1)

프레임 2에서 '$F==1' = '2==1' = 거짓(0)

프레임 100에서 '$F==1' = '100==1' = 거짓(0)

다시 말해서, 오직 프레임 1에서만 파티클을 방출하겠다는 뜻이다.

$F==1 은 익스프레션 if($F==1, 1, 0) 의 축약형이다.


'Impulse Birth Rate' 속성값에 있는 $NPT 은 로컬변수이다.

$NPT 는 POP Network 소스로 사용되고 있는 'make_noise' 노드에서의 총 점의 개수를 리턴한다.

'Impulse Birth Rate' 속성 이름을 클릭하여 값을 확인해 본다.

결과적으로 초기에 만든 모래입자들과 같은 개수의 파티클들이 프레임 1에서 방출된다.



현재 이 파티클에 어떠한 힘(Force) 도 적용되지 않았기 때문에 플레이를 해도 움직이지 않는다.

어떤 Force 를 적용하기 이전에 빨강색을 가진 입자부터 Force 에 영향을 받도록 구분할 필요가 있다.


Group POP 노드를 한개 만들고 그 이름을 'group_red' 으로 바꿔준다.

'source1' 노드에 연결하고 파라미터 창을 다음과 같이 수정한다.


우선, 그룹이름을 정하기 위해 'Group Name' 속성에 'red' 라고 입력한다.

'Rule' 속성에서 특정 규칙에 부합되는 파티클은 'red' 그룹에 속할 수 있도록 한다.

입력한 '$CR>0' 은 조건문이며 이는 참(1) 또는 거짓(0) 을 리턴한다.

$CR, $CG, $CB 은 로컬변수로서 각각 파티클의 색상정보인 R, G, B 값을 가진다.


그 원리는 다음과 같다.

빨강색 입자는 R값이 0보다 크기때문에 참(1) 이 되고 'red' 그룹에 속하게 된다.

반면, 검정색 입자는 R값이 0이거나 0보다 작기때문에 거짓(0) 이 되고 'red' 그룹에서 제외된다.


이제 파티클에 중력을 적용해 보자.

Force POP 노드를 한개 만들고 그 이름을 'gravity' 으로 바꿔준다.

'group_red' 노드에 연결하고 파라미터 창을 다음과 같이 수정한다.


아래로 떨어지는 중력이므로 'Force' 속성 Y 값에 -9.8 을 입력한다.

이 힘을 'red' 그룹에만 적용시키기 위해 'Source Group' 속성에 'red' 를 입력한다.


플레이를 해보면 다음과 같이 빨강색 입자들만 아래로 떨어진다.

그런데 어디인가 조금 이상한 부분이 있다.

우리가 만든 노이즈 애니메이션이 적용이 안되서 검정색 입자들이 끝까지 움직이지 않고 있다.



다시 POP Network 안쪽 'source1' 노드로 돌아가서 생각해 보자.

프레임 1에서 상위 'make_noise' 가 소스로 사용되었기 때문에 그 색상정보를 고대로 파티클에 전달한다.

그런데 프레임 2부터는 파티클을 방출할 소스가 사라진다 (Impulse Activation = 0).

파티클 시스템은 더 이상 'make_noise' 를 참조하지 않기 때문에 색상정보 또한 전달하지 않는다.


즉, 매 프레임마다 'make_noise' 의 색상정보를 파티클에 전달해줄 수 있는게 필요하다.

AttribTransfer POP 노드를 한개 만들고 그 이름을 'transfer_Cd' 으로 바꿔준다.

'gravity' 노드에 연결하고 파라미터 창을 다음과 같이 수정한다.

이 노드는 Particles 레벨 바깥쪽의 특정 노드의 어트리뷰트를 매 프레임 안으로 가져오는 역할을 한다.

POP 노드들은 SOP 처럼 위에서 아래 방향으로 흐르지 않고 모든 노드가 동시에 계산이 된다. 그러므로 Source POP 와 같은 특정노드를 제외하고 대부분의 POP 노드는 순서없이 연결해도 상관없다.


'Geometry Source' 속성은 어떤 노드에서 어트리뷰트 정보를 가져올 것인지를 정한다.

상위레벨에 있는 POP Network 첫번째 인풋인 'make_noise' 노드가 그것이다.

[Attributes] 탭에 있는 'Points' 속성에서 전달할 어트리뷰트 이름을 입력한다 (Cd = 색상).


다시 플레이를 해보자.

이번에는 노이즈 애니메이션이 전달이 되어 모든 입자들이 빨강색을 갖자마자 아래로 떨어진다.