posted by cimple 2009. 11. 7. 06:58


squash&stretch 는 애니메이션 10대 법칙중 하나입니다. 디즈니의 카툰풍 애니메이션을 보면, 캐릭터들의 팔, 다리, 얼굴 등등이 무지막지하게 눌렸다가, 쭉쭉 늘어나는 것을 볼 수 있습니다. 캐릭터들의 동작을 더욱 역동적이어 보이게 하고, 오히려 더욱 실재감이 느껴지는 애니메이션을 위한 중요한 요소이지요. 
때문에, 3D 애니메이션에서도 이러한 squash&strech 를 구현할 수 있도록 해 주는 Stretch IK 는 셋업에 있어서 중요한 요소 중의 하나라고 할 수 있습니다.

팔 다리가 이렇게 쭉쭉 늘어나야 재미있겠죠?

그럼 마야에서 어떻게 하면 Strech IK 를 만들 수 있을 것인지, 알아보도록 하겠습니다.

stretch IK 를 위한 준비물들

stretch IK 를 만들기 위해서는 다음과 같은 준비물들이 필요합니다.

1. spline IK
2. arc length
3. multiply divide node

그럼 이러한 준비물들이 필요하다는 사실을 염두에 두고, stretch IK 를 만들어 보도록 하겠습니다.


1. 조인트를 그려줍니다.


일단 조인트를 바닥에 아무렇게나 그려 보도록 하겠습니다.


2. 조인트에 spline IK 를 설치합니다.




spline IK 는 IK 를 nurbs curve 로 contol 할 수 있도록 하여서, 척추 등의 부드러운 움직임을 표현하는 데 효과적으로 사용되는 IK 시스템입니다. spline IK 를 설치하면 그림과 같이 IK 와 함께 nurbs curve 가 생성되는데, 이 nurbs curve 의 control vertex 를 조작하면 조인트를 부드럽게 움직일 수 있습니다. spline IK 를 생성하는 옵션에서 span을 늘려 주면 CV 들이 늘어나면서 좀더 부드러운 curve 를 얻을 수 있는데, 3 정도로 준 후 조작을 간편하게 하기 위해서 CV 들을 2개씩 묶어서 클러스터를 설치하겠습니다.




3. Nurbs curve 의 arc length 를 구합니다.

Arc length 는 nurbs curve 의 길이입니다. 만약 유저가 spline IK 의 nurbs curve CV 를 조작한다면, curve 의 arc length 가 달라지게 될 것입니다. 원래 길이에서 달라진 길이의 변화량을 측정해서, 그 값을 조인트의 size 에 곱하면 조인트가 효율적으로 stretch 된다는 것이 stretch IK 의 기본 개념입니다.

마야 메뉴의 Creates > Measure Tools > Arc Length Tool 로 이 nurbs curve 의 arc length 를 구할 수 있습니다.




자, 저는 24.456062 라는 값이 나왔군요. 이 값은 꼭 필요한 값입니다.


4. multiply divide 노드를 만듭니다.

그럼 아까 설명했던 대로 nurbs curve 의 arc legnth를 가지고, (변화량/절대값) 을 구해야 할 것입니다. 이러한 나눗셈을 하기 위해 필요한 것이 multiply divde 노드입니다.

multiply divide 노드를 만드는 방법은 2가지가 있습니다. Maya>Hypershade 에서 multiply divide 노드를 찾아서 생성할 수 있습니다.




또는 간단하게 마야 커맨드 창에 다음과 같이 입력해도 multiply divide 노드를 생성할 수 있습니다. 물론 이렇게 하면 노드의 이름까지 정해주면서 만들 수 있겠지요.


이렇게 만들어진 multiply node 에, 이제 '변화량' 과 '절대값' 에 해당하는 값을 입력해 주어야 할 것입니다.

multiply divide 노드는 input 1X-input 2X 에 들어온 값을 계산해서 output X 로 내보내는 기능을 하고 있는 노드입니다. (물론 마찬가지로 input 1Y, input 2Y 를 계산해서 output Y 로 내보냅니다.) 나눗셈을 할 때에는 1X 를 2X 로 나누어서 몫을 출력합니다. 즉 변화량을 1X 에 입력하고, 절대값을 2X 에 입력하면 되는 것입니다.

먼저, multiply divide 노드를 attribute editor 로 열어서 계산을 divide 로 바꾸어줍니다. 그리고, input2X 에 아까 계산했던 arc length 의 길이. 24.456062 를 입력합니다.



그리고 난 후, outliner 와 connection editor 를 엽니다. outlinder 의 display 에서 DAG object only 를 해제하면 DAG object 들이 아닌 노드들도 확인할 수 있습니다. 그리고 Shapes 를 체크하면 감추어져있던 shape 노드들도 확인할 수 있습니다.

먼저 arc length 노드는 spline IK 를 만들면서 생성된 nurbs curve 의 shape 노드로 존재합니다. 찾아서, connection editor 의 Outputs(from) 위치에 둡니다.
다음 우리가 아까 만들었던 multiplyDivide 노드를 찾아서 connection editor 의 Inputs(to) 위치에 둡니다.



그리고 난 후, connection editor 에서 arcLength 와 inputX 를 연결시켜 줍니다.


이렇게 하면, 아마 channel box 에서 다음과 같이 바뀌어 있는 것을 볼 수 있을 것입니다. 이제 input1X 를 input2X 로 나누어준 계산값이 outputX 로 출력되게 됩니다.


5. 계산된 값을 각 조인트의 scale 에 연결시킵니다.

이제 계산된 값을 조인트의 scale 에 연결시켜서 쭉쭉 늘이는 일만 남았습니다.
connection editor 에서 이제 우리가 만든 multiply divide 노드를 Outputs(from) 위치에 불러들이고, 각각의 조인트들을 Inputs(to) 위치에 불러들입니다. 그리고, outputX 와 각각 조인트들의 scaleX 에 연결시켜줍니다.



이제 다 되었습니다. 결과물을 확인해봅시다.





이런 식으로 간단한 stretch IK 를 만들어 보았습니다. 물론 좀더 발전적인 방법이 있을 수 있습니다. 그래도 혹시라도 어떤 분들이 도움을 받을 수 있다면, 보람된 포스팅이 될 것입니다.

쭉죽 늘어나는 팔다리를 만들어 봅시다!

stretch 하면 빼놓을 수 없는 이분.


ThEnd.