애플의 아이폰3 모델의 초기 바탕화면은 '물방울이 맺혀있는 창문'이었다.  CG를 잘 몰랐던 때였으니, 그 당시 물방울이 실제 물방울 사진인 줄로만 알았다. (실제 창문의 물방울일 수도 있음)CG특수효과를 공부하다보면, 의외로 물방울 특수효과를 남용할 정도로 많이 사용한 광고가 많이 있다는 사실을 깨달을 수 있다.


물론 실제 사진과 CG 물방울은 무게감이 살짝 다르다. 이번 포스팅에서는 창문에 흘러내리는 물방울을 표현해보자.


1 창문 만들기

plane 폴리곤 매시를 생성하고, 아래와 같이 넓이와 높이를 지정해준다. 


Modeling -> Deform 메뉴로 가서 bend를 적용해준다. deform 메뉴에서 bend를 사용하면, 아래와 같이 폴리곤 매시가 구부러지는 효과를 만들 수 있다. curvature 수치를 조절하면서 커브드 디스플레이 같은 형태의 창문을 만들어보자.



2 첫번째 파티클 생성

창문형태로 만든 폴리곤 매시에서 파티클이 생성되도록 만들어야 한다. emitter type을 surface로 지정하고, speed를 제로세팅한다. 


중력을 무시하도록 설정을 해야만 창문에 파티클이 달라붙는 효과를 낼 수 있다. 중력에 체크를 해두면 그대로 파티클들이 후두둑 떨어진다. 파티클들이 흘러내리는 효과는 아래에서 Mel스크립트로 구현할 예정이다.


파티클 입자들이 눈에 좀더 잘 보이도록 하려면, 아래와 같이 파티클 사이즈를 줄이면서 동시에 'sphere'타입으로 설정한다. 


여기까지 진행한 후에 창문 폴리곤 매시에 움직임을 적용해보자. 아래 사진을 살펴보면, 문제가 있음을 알 수 있다. 우리가 원하는 연출은 창문에 달라붙어 흘러내리는 물방울이 되어야 하는데, 폴리곤을 움직인다고 물방울이 제자리에서 계속 생성되면 곤란하다.


 파티클이 생성되자마자 창문 폴리곤에 찰싹 달라붙으려면 어떻게 해야할까?



3 Goal 적용하기

답은 'Goal'기능을 활용하는 것이다. 


particle1shape노드를 선택하고, Goal 기능을 실행해보자. Goal은 말 그대로 '목표'를 의미하는 기능인데, 폴리곤 매시와 함께 선택한 파티클들이 폴리곤 표면(목표)을 향해 나아가는 효과를 연출할 수 있다.


Goal Weight값을 '1'로 설정을 하면, 파티클 입자가 생성되자마자 바로 폴리곤 voltex부분에 달라붙는다.  


그러나 위와 같이 정확하게 voltex부위에 파티클들이 달라붙으면, 실사감(현실)이 상당히 떨어진다. 현재 목표로 하는 장면은, 물방울이 어지럽게 달라붙는 장면이다. 이를 위해서는 goalU, goalV, parentU, parentV 항목을 per파티클 방식으로 추가해야 한다.


Goal을 실행했을 때, 자세히 살펴보면 파티클들은 폴리곤이 갖고 있는 UV좌표값, U와 V부근을 따라서 이동하는 것을 깨달을 수 있다. 만일 폴리곤 UV크기를 아래와 같이 100분의1로 줄여버리면 어떻게 될까? 


폴리곤에 달라붙는 파티클의 속도 역시 100분의 1로 줄어든다. 즉, Goal은 UV좌표값 크기에 영향을 받는다. 이때 주의해야 할 사항은, 반드시 emitter의 속성에서 need parent uv nurbs 항목에 체크를 해줘야 한다는 점이다. 이 부분이 꺼져 있으면, UV크기에 따라 아무런 반응이 나타나지 않는다.



4 MEL작성(goal)

위에서 생성한 goalU,goalV,parentU,parentV 값을 이용해서, goalUV값들이 즉시 parent되도록 스크립트를 작성해보자.


[MEL]

nParticleShape1.goalU = parentU;

nParticleShape1.goalV = parentV;


위의 코드를 실행하면, 아래 사진처럼 현재 UV좌표에 표시된 영역에만 파티클들이 달라붙는 것을 볼 수 있다.


UV맵을 원래 상태로 크기를 조절한다. modify -> layout을 선택하면, UV크기는 영역에 맞게 조절된다. 


현재까지 상태를 시뮬레이션 해보면 아래처럼 무작위로 파티클들이 생성됨을 볼 수 있다. 여기서 UV좌표값을 100분의 1로 줄이고 파티클들을 모두 폴리곤에 parent한다. 사실상 UV좌표가 커졌지만 파티클들은 100분의 1 상태에서 무작위로 달라붙은 상태 그대로 크게 보일 뿐이다.(UV를 원래대로 되돌렸기 때문에) 



5 흘러내리는 파티클 모션

물방울이 흘러내리는 효과를 나타내려면, goalU(goalV)값을 프레임당 조금씩 아래로 이동시켜야 한다. 


[MEL]

nParticleShape1.goalU -= -0.01;


U방향으로 파티클들이 이동해서 달라붙는다. (흡사 파티클들이 흘러내리는 것처럼 보여짐)


Numeric 모드에서 goalU의 수치값을 살펴보자. 이때 창문 끝에 해당하는 지점의 수치값을 기억해둔다. 해당 프로젝트에서는 대략 0.992 정도이다. 


만일 goalU값이 0.992이상 커진다면, 파티클들을 모두 사라지도록 만들어야 한다. 


[MEL]

if ( nParticleShape1.goalU >= 0.992 ){

nParticleShape1.lifespanPP = -1;

}



위의 코드를 실행하면, goalU값이 0.992이상 되자마자 파티클들이 모두 사라진다. 



6 창틀 만들기 

램프를 활용해서, 파티클들이 나타나지 않는 영역을 설정해보자. 램버트 쉐이더를 생성한 후, 램프노드를 아래와 같이 설정한다. (흰 부분은 파티클들이 나타나고, 검은 부분은 적용이 되지 않는 부분)


place2d노드에서 coverage값을 조절해서, 완전 파티클들이 보이지 않는 영역을 아래와 같이 만들어준다.


"창문에 흘러내리는 물방울 특수효과 (2)"에서 계속