[UE4] 절차적 애니메이션의 정체

절차적 애니메이션(Procedural Animation)의 정의를 보면, 미리 정해져 있는 애니메이션을 플레이하는 것이 아니라 다양한 상황에 맞게 실시간으로 애니메이션을 생성하는 데 사용하는 기법이라고 보통은 기술되어 있다.  미리 정해져 있지 않다는 의미는 분명 키 프레임으로 만들어지지 않았다는 의미일 것이다.  그렇다면 실시간으로 애니메이션을 생성한다는 것은 도대체 무슨 소리인가.  

절차적이란 용어는 지형 생성시에도 많이 쓴다.  오픈 월드 같은 커다란 지형을 생성할 때, 캐릭터의 위치를 기준으로 실시간으로 지형을 생성하여 전체를 로드하지 않도록 하여 부하를 줄여주기도 하고, 상황에 맞게 다이나믹한 지형을 생성할 수도 있다.  이러한 맥락에서는 절차적이라는 용어로서 얼핏 이해가 되긴 한다.  실시간이 핵심적 의미일까.

애니메이션에서 실시간 생성이란 의미는 어떻게 해석해야 할까.  3D제작 툴에서 주요 본(bone)들을 키 프레임으로 찍어서 하나의 애니메이션을 생성하는 데에는 적지 않은 노력이 필요하다.  그 세밀한 위치 조정과 표현을 어떻게 실시간으로 생성한다는 말인지 잘 이해가 되지 않았다.

GDC에서 ‘Animation Bootcamp: An Indie Approach to Procedural Animation’라는 주제로 발표한 영상이 있는데, 절차적 애니메이션으로 할 수 있는 것들을 보여준다.

Animation Bootcamp: An Indie Approach to Procedural Animation

이 영상에서는 절차적 애니메이션의 가능성을 엿볼 수는 있다는 점이 좋았지만, 사용 툴이나 코드같은 구체적인 방법들이 소개되지는 않아 조금 아쉬웠다.  

일단 실시간으로 애니메이션을 만들려면, 본을 움직여야 하는데, 모든 본을 움직인다는 것은 지금 시점에서는 좀 어려워 보였다.  하지만, IK본을 이용하여 양쪽 팔과 다리를 세팅하면, 4개의 본을 콘트롤 하는 것으로서 움직임을 생성할 수 있어 보였다.

언리얼에서 IK를 검색하면, Two Bone IK, FABRIK, CCDIK정도가 검색이 된다.  FABRIK과 CCDIK는 joint를 세팅하지 못하기 때문에, 지금 시점에서는 Two Bone IK가 적당한 것으로 보였다.  (내가 잘못 알고 있는 것일 수 있다.)

Two Bone IK를 이용하여 양쪽 다리를 세팅하였다.

언리얼 마네퀸 스켈리톤의 발목 본을 IK본으로 세팅해보자. 

왼쪽 다리일 경우 thigh_l — calf_l — foot_l 로 이어지는 3-joint에 foot_l을 IK본으로 세팅하고, Joint Target은 무릎이 향할 수 있는 지점에 지정하자.  블랜더에서 Pole Vector를 지정하는 것과 같다.  너무 낮거나 무릎에 가깝게 지정되면 움직일 때 무릎 꺾임이 심하게 일어날 수 있다.

Joint Target

Effector는 실제로 움직임을 주는 부분으로 TbEff라는 변수 값에 따르도록 분리하였다.  그럼 TbEff값이 실시간으로 변형된다면, 다리의 움직임을 생성할 수 있지 않을까. 아래와 같이 foot_l의 위치 4개의 값을 Array에 저장하여 놓고, Update시에 TbEff 변수를 각 Array값에서 가져와서 세팅하도록 하였다.  그러면 걷기 애니메이션을 어느정도 흉내낼 수 있어 보였다.  

1,2,3,4 번의 좌표

Event Graph로 이동해서, Blueprint Update Animation 노드를 연결하여, TbEff를 세팅해보자.  부드러운 애니메이션이 되려고 하면 Interpolation이 필수일 것이다.  VInterp To 노드를 이용하여 TbEff의 x, y, z을 세팅해보았다. 

현재 foot_l 위치에서 부터 타겟으로 interpolation

참고로, GetFootLoc 노드는 현재의 foot_l 위치를 가져오는 함수 노드이다. 여기서 추가적으로 해야하는 것은 현재 foot_l의 위치가 Target에 도착했는지 판단 후, 다음 Target으로 값을 변경해 주는 일이다. 

현재 foot_l이 타겟에 도착했는지 판단 후 다음 타겟으로 변경하는 작업

foot_r의 경우, 타겟 array의 인덱스 차이로 인해 다리가 서로 교차하도록 만들었다. (foot_l의 타겟 인덱스가 0일 경우, foot_r의 타겟 인덱스는 2가 되도록 함)

수학적인 계산과 foot_r까지 세팅하게 되니 블루프린트가 꽤 복잡해져 버렸다.

어쨌든, 핵심은 4개의 지정된 위치로 foot_l과 foot_r을 이동시키는 것이다.  플레이를 해보자.

짜잔.  로봇같은 느낌이지만, 어쨌든 애니메이션을 만들어 내긴 했다.  🙂

지정된 데이터로 IK본을 움직여서 애니메이션을 만들어 보았는데, 이것이 절차적 애니메이션이라고 말할 수 있을지는 잘 모르겠다.  첫 술에 배부를 순 없으니 계속 나아가야 하겠다.

후속 글: 절차적 애니메이션으로 – 잽(Jab) 날리기

#Try walking in procedural animation


Leave a Reply

Your email address will not be published. Required fields are marked *