2018년 10월 1일 월요일

[2011. 8. 15] [MAYA] 스트레치&스쿼쉬 캐릭터 리깅, Stretchable & Squashable character rigging...

스쿼쉬와 스트레치는 전통적인 캐릭터 애니메이션의 원칙에 있어서 빠지지 않는 중요 요소였습니다...
캐릭터의 동작을 그럴듯하게 해주면서도 재미라는 요소를 부여해 주니까요...
이 스쿼쉬&스트레치는 3D 애니메이션에서는 그 사용빈도랄까 전통적인 2D애니메이션 보다는 줄어든 감은 있습니다만...
제 개인적인 의견은 2D애니메이션에서 3D애니메이션으로 오면서 3D애니메이션은 그 느낌이 좀 더 영화에 가깝고 카메라라거나 씬의 연출도 어찌보면 영화적인 기법들에 가깝워진 감이 있습니다...
사실 이는 전통적인 2D애니메이션이지만서도, 재패니메이션이라는 일본 애니메이션이 좀 더 영화적이었다는 면에서 어느정도 연출적인 면에서 비슷한 면이 있는 것도 같습니다만...
일본애니메이션은 예산 측면이라거나 TV방송용처럼 초장편인 경우가 많아서 프레임레이트라거나 제한이 많아 많은 장수의 그림을 그리지 않고, 여러 트릭적인 연출을 많이 사용하죠... 그로 인해서 카메라패닝같은 연출을 많이 사용하는데, 그로인한 것 같습니다...
그러나 여전히 애니메이션과 영화 연출은 또 차이가 있고요...

어쨌거나 3D애니메이션에서도 가끔 스쿼쉬&스트레치를 과장되게 사용한 경우를 보게 되는데 재밌더라고요...
테디베어였던가? 곰이 테니스치는 아주짧은 애니메이션이 있었는데, 동작이 아주 재밌었던 기억이 있습니다..
그런 스쿼쉬와 스트레치를 줄 수있는 캐릭터 리깅이 있는데, 지금부터 제가 말씀드리려는 방법을 많이 쓰더라고요...
일단 간단히 해당리깅을 적용한 간단한 예제 scene을 첨부했습니다.
간단히 distance tool 과 multiplydivide node 그리고 더불어 condition node 를 사용한 방법의 간단 예제라서 이를 보고 원리를 이해하셔서 각자 자신의 Character rig 에 적용하시면 될 것 같습니다...



















몸통에 spline ik를 많이 사용하는데 거기에 적용하는 한 예입니다... 중간에 가장 큰 circle 컨트롤러의 위 아래로의 움직임에 따라 옆의 그림처럼 스쿼쉬&스트레치되게 했습니다...
보시면 디스턴트툴이 가리키는 거리가 아래쪽의 2 그리고 위쪽은 3이죠...
오른쪽 그림에서 처럼 컨트롤러를 움직이면, 아래쪽이 대략 2.869632 위쪽이 2.130368 이 되면서, 아래쪽은 2보다 커져서 스트레치가 되었고, 위쪽은 3보다 작아지면서 스쿼쉬가 일어났습니다.










원리는 다음과 같습니다...
multiplydivide node 를 사용했습니다...
이node의 작동은 input1으로 x,y,z 의 세 값을 받고 input2로 다시 x,y,z 의 세값을 받아들여서 곱셈을 행하거나 나눗셈을 행하거나 멱(거듭제곱)을 해서 output x,y,z 로 내보내는 작동을 합니다...

이를 이용해서 위 그림에서 연결은 보이는데요...
디스턴스로 거리값을 가지고 있고요... 아까 위에서 봤듯이 기본은 아래쪽으로 2 위쪽으로 3이죠...
우선 아래쪽에 대해서 만들어 보면요..











거리값을 input1 x 에 넣고요... input 2에는 숫자 2를 넣습니다. 그리고 divide로 작동하게 해둡니다.
거리값으로 기본값인 2가 들어갔다고 치면 2로 나누게되니깐 아웃풋값이 1이나오겠죠... 이 output x 값을 해당되는 각 bone(척추는 주로 여러개의 bone으로 이루어져있죠)의 size x축 scale에 연결해 주는 것입니다...
기본값일 때는 1이겠고요... 2 이상으로 거리값이 멀어지면, 1.? 가 되면서 늘어나겠죠...
2 이하가 되면, 0.? 가 되면서 줄어들게 됩니다.
이번엔 y,z 축에 대한 것인데요... 이들은 x 가 늘어나면 줄어들어야 stretch되는 느낌이 날 것이구요...
x가 줄어들면, squash되는 느낌을 위해 y,z는 커져야겠죠...
이를 위해서 이번에는 input2 에 연결해서 나눠 주는 값에 연결하는 것입니다...
그러면 2 이상에서는 0.? 가 아웃풋될 거고요... 2 이하에서는 1.? 가 되겠죠...

이런 원리로 위쪽 부분에 관해서도 해주시면 되는데, 기본값이 3인 것을 염두해서 나눠주는 수와 나눌 수를 3으로 주어야겠죠...

다음은 다리 등에 적용할 때에는 조금 달라져야 할 수도 있을 것입니다... stretch에 관해서는 마찬가지지만, squash는 일어나지 않게 할 수도 있겠죠... 물론 경우에 따라서 위에서 했던 방법으로 그대로 다리쪽에 적용해서 squash가 일어나도록 하기도 합니다.

어쨌거나 다리의 경우는 다리가 시작되는 bone에서 발목까지 2개의 bone을 쓰고 ik 핸들을 붙이는 경우가 많죠...
여기에 distance tool을(하나는 다리 시작되는 bone 그리고 다른쪽은 ik handle) 붙여서 이 거리값 이상일 때, 스트레치되게 하고요...
문제는 줄어들 때도 스쿼쉬되도록 하려면 위에 했던 원리대로 하면 되겠고요...
그렇지 않게 하려면 condition node라는 것이 있습니다...
이는 프로그래밍을 조금이라도 이해하시는 분이면 알 수 있는데 if else 라고 하는 것과 같습니다...
condition node의 값을 보면,

















first term 이라는 값과 second term 이라는 값이 있고 operation 이 있죠...
operation 은 첫번째 값과 두 번째 값을 비교하는데 어떻게 비교할 것인가를 정하는 것입니다...
위에서 Greater than 이라는 것은 '보다 크다'는 것이죠.
위에서는 두 값이 똑같은데요... 만일 첫값이 2.1이라거나 2 보다 크게되면, 참(True)가 되는 것입니다... (기본값은 여기서는 2로 했는데요... 기본값으로서 다리길이값을 second term 에 넣으면 됩니다)
아래 보면, True 와 False가 있죠...
각각은 True일 때 output 하는 값과 false일 때 output 하는 값입니다.

저는 first term 에 거리값을 연결했습니다... 그러면 ik 핸들이 다리길이 보다더 멀게 위치되었을 때 Color if true가 실행될 것이고, 짧거나 같은 경우는 Color if False를 실행하겠죠...
짧거나 같은 경우(일반적인 애니메이션을 만들면 이런 경우가 대부분이죠)는 bone의 값이 원래 사이즈인 1이되는 것입니다...(Color if False가 Output으로서 실행될 것이니까요)

(Condition node 의 output x,y,z 를 해당 bone 의 x,y,z 사이즈에 연결했을 경우입니다.)
큰 경우면 bone의 size는 Color if True 의 값을 따르게 될텐데, Stretch가 일어나도록 하기 위해서 앞서 했던 것과 같은 방법으로 만들어진 다리용 multiplydivide node의 output x,y,z 세 값을 여기에 연결했습니다...
그러면 거리값이 다리길이(second term) 보다크면 stretch&squash가 일어나고 작거나 같으면, 그냥 size 1의 값을 유지하므로 일반적인 rig가 되고요...

예제는 다리 컨트롤러 속성값을 하나 둬서 stretch&squash 가 먹히고 안먹히고 하게 하려고 또다른 condition node를 하나 더 두었습니다...
그것은 위 원리를 이해하시고 살펴보시면 되겠네요...

제가 Character rigging 을 하지 않고 해당부분에 대한 원리만을 설명드렸습니다...
이를 이용해서 각자 맞는 발전된 Rig를 만드셔서 사용하셨으면 좋겠습니다...
더불어 Utility 에 많은 기능을 가진 것들이 많으니까요... 이것들도 잘 활용하면 더 편리한 것들 많이 만드실 수 있을 거에요...
Rig뿐만 아니라 마야 전반에 걸쳐 활용하기에 유용합니다...

餘白之美@SE-Arts

댓글 없음:

댓글 쓰기