2012년 9월 11일 화요일

Maya Tearable Ncloth Motion Vector 에 관하여

ncloth 를 사용하여 시뮬레이션을 할때 tearing을 할 경우가 있습니다.

캐쉬를 잡고 여타 랜더는 잘 되지만 모션 블러를 주거나 모션 벡터 패스를 뽑게 되면

vertex 가 나뉘는 지점에서 오브젝트가 찢어져 보이는 현상(단순 tearing으로 인한 찢어짐이 아니라 버텍스가 여기 저기 날라가는 모습)을 목격할 수 있습니다.

구글링 열심히 해봐도 딱히 제대로 된 해결방안은 찾기 힘들더군요. 뭐 블로그 포스팅 하면서 매번 하는 얘기지만 영어가 짧아 찾질 못한다고 해야 맞는 말인것 같네요.

계속된 tearing을 사용하다 보니 노드 몇가지가 생성되는것을 알게 되었고 그 부분을 만지게 되면서 다음과 같은 방법을 사용하게 되었습니다.

ncloth가 적용된 오브젝트에 tearable surface 를 적용하면 node 3개가 생성이 됩니다.

polySoftEdge, polyMergeVert, polySplitEdge


ncloth 만 적용했을때에는 생성되지 않던 노드 입니다.

위의 노드를 보면 tearing 프로세스는 생각외로 간단(보여지는것만.. ^^)합니다. 선택된 버텍스를 나누고 시뮬레이션의 영향에 따라 합쳐둔 상태에서 나누어질 시점이 되면 merge 가 풀리는 형태 입니다. 풀리는 시점이나 영향등은 tearable surface 로 생긴 constraint 노드에서 조절을 하구요.

저기서 생성된 softEdge는 이런 과정에서 나누어진 오브젝트 간의 엣지가 각이지는것을 방지 하기 위함이구요.

뭐 중요한건 이런 노드가 생긴다 라는것이지 작동은 아니니 다음으로 넘어 가면..

버텍스 포인트로 인해 생성되는 패스(모션 벡터, 노멀 등)를 랜더링 하기 위해서는 위의 3가지 노드중 polyMergeVert 를 지워 주는것으로 간단하게 해결이 가능합니다.

위와 같이 하이퍼 그래프에서 polyMergeVert를 선택하여 del키를 살포시 눌러주면


위와 같이 그냥 사라지죠..







하지만 위의 2가지 그림에서 처럼 polyMergeVert를 지운 오브젝트는 잘리는 부분이 각이 생기게 됩니다. 당연히 오브젝트의 포인트가 나뉘어져 있으니  polySoftEdge 가 잘린 부분엔 작용을 하지 않게 되는것이지요..

그래서 버텍스 포인트에 관련된 패스는 따로 랜더를 걸고 룩에 관련된 패스는 polyMergeVert를 지우지 않은 녀석으로 랜더를 걸어 합성에서 합쳐주는 방식을 사용합니다.

참고로 랜더를 할때 룩에 관련된 랜더레이어는 랜더 셋팅에서 Motion Blur 를 off 해야 하고
모션 벡터를 랜더할 녀석은 full 로 셋팅을 합니다.

추가 적으로 모션 블러를 full 로 놓고(모션블러가 켜진상태) 랜더를 하게 되면 현재 프레임이 1일때 1.2 혹은 1.4 등의 프레임이 랜더가 되게 되므로(셋팅에 따라 랜더 걸리는 프레임은 변화 됩니다.) 몇가지 셋팅을 해주어야 합니다. layer override 기능을 사용해서 말이죠.

모션 벡터만을 거는 것이기 때문에 sutter open 과 shutter close 는 1(동일한 값을 주는것으로 이미지 자체에 블러가 먹지 않게 됩니다.)
Motion Offsets에서 Custom Motion Offsets 을 체크 해주고 Motion Back Offset 의 값을 1로 해주는 것으로 셋팅은 완료가 됩니다.
누크에서 사용할 패스는 2D Motion Vector 라는 이름의 패스이고 생성 하면 mv2DToxik 이라는 패스가 랜더 패스에 생성이 될것입니다.


 이렇게 뽑은 룩관련 패스와 모션 벡터를 이용해서 nuke 에서 vector blur를 주게 되면 끝~

사실 귀찮을때는 머지노드 지우고 그냥 다 걸어서 사용하기도 합니다. 각진 부분이 눈에 안띄길 바라면서 말이죠~~ ^^;;;