VFX

[Maya] [VFX] 창문에 흘러내리는 물방울 특수효과 (2)

by MoGL3D 2019. 11. 21.

"창문에 흘러내리는 물방울 특수효과 (1)"에서는 유리창 폴리곤 매시를 만들고, goal기능을 활용하여 파티클들이 표면에 흘러내리는 것까지 진행했다.


 n파티클 시뮬레이션을 진행할 때, 파티클을 생성하고 필드로 움직이는 부분까지는 누구나 쉽게 할 수 있다. 이 과정까지는 Maya의 메뉴에서 몇번의 클릭과 설정값 체크 해제 및 조절만으로 가능하기 때문이다. 문제는 2차적인 시뮬레이션 효과부터다.


현실에서 먼지가 튀는 상황을 잠시 생각해보자. 밀가루 포대나 커피잔이 쏟아졌을 때 가루 입자나 물방울이 단독으로 움직이는 상황이 있을까? 아마도 입자가 하나만 움직이는 경우는 현실에서 거의 찾아보기 힘들 것이다. 가령, 폭발이 발생하면 2차적으로 파편이 튀고, 3차적으로 그을음과 같은 연기가 발생하며, 뒤이어 흙먼지들이 휘날린다. 


즉, 현실감있는 특수효과를 만드려면 반드시 첫번째 모션 이후의 과정을 최대한 현실적으로 연출해내야 한다. 유리창에 흘러내리는 Dripping효과 역시 첫번째 파티클들이 나타나는 것까지는 별다른 코딩없이 진행했으며, 지금부터가 중요하다.


1 Emit from Object 실행하기

흘러내리는 1차적인 물방울(n파티클1)을 선택하고, 메뉴 nParticles -> emit from object 옵션을 실행하자. emit from object는 폴리곤이나 파티클과 같은 원본 객체에서 다시 파티클들이 뿜어져나올 수 있는 기능을 제공한다. 


여기서 주의해야 할 점은, Solver를 새로 만들어줘야 한다는 점이다.  만일 기존 nucleus1(대부분 처음 만든 nucleus이름)에 적용되는 설정을 그대로 이용해버리면, 파티클들이 정신없이 유리창에서 튕겨져 날아가는 시뮬레이션을 목격할 수 있다.



2 radiusPP추가하기

emit from object를 실행하고나면, 새로운 n파티클 노드인 nParticle2노드가 아웃라이너에 생성된다. nParticle2노드를 선택한 후에 Add attribute nParticle 설정에서 'radiusPP'를 추가한다.


nParticle2의 파티클들이 중력값을 받으면 nParticle1의 고리같은 느낌이 사라지고, 그들 스스로 자유낙하한다. 따라서 nucleus2 노드로 가서 ignore gravity를 체크해주도록 하자. 중력값을 무시해야만 물방울 뒤에 매달려 떨어진다.


nParticle2노드에 radiusPP를 추가했었다면, per Particle탭으로 가서 radiusPP에 램프를 추가한다.(아래사진 참고)


램프를 추가한 이후, Edit Ramp로 가서 램프의 흰색과 검은색 위치와 강도를 조절해야한다. 램프의 흰색과 검은색 수치값이 곧 radiusPP(물방울 너비값)를 컨트롤하기 때문이다.



3 blobby(s/w) Render type설정하기

램프를 추가하더라도 파티클 너비값은 별 차이를 보이지 않는다. 왜냐하면 파티클 랜더 타입이 'point'이기 때문이다. 이런 경우에는 재빨리 blobby(s/w)로 설정을 해줘야만 radiusPP의 램프에 따라서 조절할 수 있다.


blobby(s/w)로 설정된 n파티클2노드의 radiusPP -> edit ramp로 간다. 

램프의 색상은 아래와 같이 설정하고, input노드를 클릭한다. (아래 사진참고)


램프 input설정을 마무리하기 전에, v램프로 설정하는 것을 잊지 말자. 만일 여기서 U램프를 설정해야 한다면, 애초에 유리창 폴리곤을 만들때부터 UV방향이 반대로 된 것이다.  


램프 input값에 들어가서, min Value와 max Value값을 아래와 같이 설정해보자. 

min Value값과 max Value값에 따라서 물방울 radius가 달라진다. 실질적으로 물방울 모양을 제대로 만들려면 이 값을 제대로 설정해야만 한다.    



4 빗물 노이즈 만들기

빗물이 흘러내리는 형태는 플렉탈 원리가 적용된다. 물방울이 흘러내리는 방향에 여러가지 노이즈가 뒤섞이는 것이다. 빗물이 흘러내리는 방향을 확인할 겸 아래 MEL스크립트를 설정해보자. 


 [MEL]

nParticleShape1.goalU -= 0.001; 


위의 코드가 삽입되면, nParticle2의 흘러내리는 방향이 U쪽으로 0.001씩 이동한다. 대각선으로 나아가는 것과 같은 시뮬레이션 효과가 나타난다. (아래 사진 참고)   



5 노이즈 효과 추가

MEL에서는 내장함수로 noise( )함수가 있다. 또한 sphrand함수를 사용하면 벡터(방향이 있는)값으로 랜덤값을 만들어줄 수 있다. sphrand( )함수에 관한 설명은 아래 링크를 참고하자.

https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/Maya/files/GUID-02B3C1C5-FD3F-48E2-AD80-004B68E68AB8-htm.html


노이즈를 추가하는 MEL은 아래와 같다.


nParticleShape1.goalU -= noise( sphrand( id + time ) );  


여기서 id와 time을 더하는 이유는, 파티클은 고유의 파티클 id값을 갖고 있기 때문이다. 해당 파티클 id값에 time값을 더하면, 시뮬레이션이 진행되면서 동시에 값이 변하는 실시간 효과를 만들 수 있다. 따라서 time 대신에 frame을 사용하더라도 무관한다.  단, 현재 noise상태에서는 아래와 같이 무작위적으로 움직이는 무늬가 나타난다.



(noise( sphrand( id + time ) ) ) * 0.0012; 


심하게 요동치는 노이즈 값이 0.0012를 곱하여 정도를 낮추도록 하자.   


내친김에 goalV값도 노이즈가 발생하며 진행하도록 만들어보자. 


abs( ( noise( sphrand( id + time ) ) * 0.02) * 0.1 ) ;


절대값 내장함수 abs를 넣는 이유는, 절대값이 없으면 반대방향으로도 noise값이 가해지기 때문에 물방울이 중력을 무시하는 효과를 만들어낸다. 방향이 있는 sphrand( )함수를 사용할 때는, abs( )함수를 반드시 넣도록 하자.   


* 최종 노이즈값 조절



6 lifespan값 조절하기

n파티클2노드의 생존값(?)을 조절해보자. lifespan값이 클수록 물방울 꼬리가 길어진다. 해당 프로젝트에서는 random값으로 설정한다.


이제 랜더링만 남았다. arnold로 진행하는 랜더링 설정은 창문에 흘러내리는 물방울 특수효과 (3)편에서 진행해보자.