TV광고를 보면 은근히 도미노와 같은 시뮬레이션이 많이 등장한다.

특정 오브젝트가 움직이면서 모여있는 오브젝트들과 충돌이 발생했을 때, 모여있는 오브젝트들의 색상이 변한다거나 방향이 변하는 식이다. 



특히 캔디제품을 홍보하는 광고에서 엄청난 수의 아몬드나 사탕이 쏟아지는 특수효과를 쉽게 찾아볼 수 있다. Maya에서 이를 표현하려면 두 가지가 필요하다. 


1. Instance

2. 충돌


Instance는 말 그대로 특정 모델링을 파티클 알갱이로 변환하는 기능이다. (최근 마야에서는 MASH를 활용한 Instance를 주로 사용하는 분위기다.) 인스턴스는 버튼 클릭 몇번으로 해결할 수 있다. 문제는 충돌 연출이다. 충돌연출은 어쩔 수 없이 코딩단계가 조금 필요하다. Maya에서 제공하는 노드에디터로 해당 연출을 진행하더라도 큰 상관없지만 특수효과에서는 GUI방식이 오히려 더 복잡할 수 있다. 이때 필요한 기술이 'Mel 스크립트'이다.


이번 포스팅에서는 MEL를 활용하여 도미노 효과를 만들어보자.


1 '매트릭스 배열' 파티클 생성하기 

"create n파티클 tool"에서 matrix 구조를 선택한 뒤, 아래와 같은 파티클 형태를 생성한다. 이후 create particle grid에 체크하고, "With cursor"를 선택한다. 


2 emitter생성

emitter를 하나 생성하고, type을 'directional(방향성)'로 설정한다. rate에는 키프레임을 설정해서, 특정 프레임 이후부터는 파티클이 생성되지 않도록 지정한다. "Basic Emission speed"의 값을 20정도로 설정하고, spread(산개되는 정도)값을 0.2로 설정해준다.


emitter에서 태어난 파티클(nparticleShape2)끼리의 2차 충돌이 있어야만 실제상황과 같은 물리적 연출을 할 수 있다. 따라서 self collision값을 'on'으로 설정한다.


3 충돌 이벤트값 설정

파티클들이 특정 파티클에 충돌할 경우, 이를 감지하고 신호를 발생시켜주는 이벤트 속성이 마야에 내장객체로 지정돼 있다. 파티클끼리의 충돌을 알려주는 속성값은 'collisionSelfComponentId' 이다. n파티클1shape노드에서 Add Dynamic Attribute -> general -> particle -> collisionSelfComponentId 를 추가한다. 


shading탭으로 가서, collisionSelfComponentId 이름을 지정하고, Numeric 상태로 값변화를 살펴보자. 


파티클끼리 충돌이 발생하지 않을 때 collisionSelfComponentId값은 '-1'로 지정돼 있다. 하지만 파티클끼리의 충돌이 발생하면, 아래와 같이 충돌강도에 따라서 값이 바뀐다. 처음 충돌한 지점의 값은 400~500정도로 설정된다.


충돌에 영향을 받는 파티클들만 쉽게 알아보기 위해서 "Add dynamic Attribute -> Color" 에서 

'Add per particle Attribute'를 선택하고 Add attribute를 한다. 


4 충돌 & 색지정 MEL

충돌이 발생한 파티클들의 색을 변화시켜주는 MEL스크립트를 작성해보자.


if ( nParticleShape1.collisionSelfComponentId >= 0 ){

                   nParticleShape1.rgbPP = << rand( 0, 1) , 1, rand( 0, 1) >>

                               }


위의 MEL코드를 해석하자면,

"collisionSelfComponentId값이 0보다 크다면(충돌 발생), rgbPP(각 파티클별 색상)를 랜덤값으로 변경하라"는 의미이다.


MEL을 create하고, 시뮬레이션을 진행해보자. 충돌이 발생하는 지점에서 랜덤값으로 녹색값이 1이란 전제하에 녹색계열의 랜덤값이 파티클 색으로 나타난다. 


그런데 위의 사진을 살펴보면, 특정 파티클들과 부딪친 후, 자신들끼리 부딪치는 경우에만 색상이 한다. (collisionSelfComponentId의 특징) 만일, self(자신들끼리)로 부딪치는 값을 계산하지 않고, 

처음 충돌이 발생한 파티클들만 알아내려면 어떻게 해야 할까?


5 collisionComponentId 추가

collisionSelfComponentId와 달리 collisionComponentId값은 처음 충돌이 발생한 지점의 파티클들만 계산한다. 첫 충돌만을 연출하기 위해서 n파티클shape1의 add dynamic attribute -> general -> particle -> collisionComponentId를 추가해보자. 


self충돌 이벤트와 거의 같은 코드를 작성한다.


if( nParticleShape1.collisionComponentId >= 0 ){ 

nParticleShape1.rgbPP = << 1, 0, 0 >> 

                                }


위의 코드는 collisionComponentId의 값이 0보다 크다면(충돌 발생) 해당 파티클(nParticleShape1)의 색상을 빨간색으로 변경하라는 의미이다. 


시뮬레이션을 진행하면, 아래와 같이 첫번째 충돌이 발생한 파티클들의 색상만 붉게 변한다.


최종적으로 코드를 살펴보자면, 아래와 같다(사진 참고)


emitter에서 생성된 파티클들이 파티클shape1과 충돌하면서, 충돌지점에는 빨간색으로 진행되다가 self충돌되는 부분부터는 녹색계열의 랜덤값으로 색상이 나타난다.


위의 효과를 instance기능과 동시에 사용한다면, 특정 물체가 부딪치면서 도미노처럼 색상이 변하는 식의 특수효과를 연출할 수 있다.