VRChat/VRChat 아바타 강좌

9. 애니메이션 고급편

FakeZero 2024. 3. 6. 20:29

9. 애니메이션 고급편


  애니메이션 기능은 VRChat 아바타의 알파이자 오메가인 기능이다. 따라서 애니메이션을 얼마나 잘 활용할 수 있는 가가 아바타의 성능을 결정하기도 하며 복잡한 애니메이션을 사용하는 경우 최적화의 여부에 따라 아바타 자체의 용량이 갈리기도 한다.

  아마도 이번 편이 가장 길 것이므로 힘내서 가보도록 하자.

 

+animation탭 Preview의 함정. Preview 상태를 종료하고 아바타를 업로드 할 것

  설명을 시작하기 전에 이전에 설명하지 않은 것을 설명하려 한다.

  Preview 기능은 7장에서 한 번 설명했을 것이다. 7장에서는 설명하지 않았지만 본격적으로 아바타를 수정하는 이번 장부터는 Preview 기능의 함정을 소개해야만 한다.

  애니메이션의 미리보기 기능을 사용하면 이런식으로 아바타가 갑자기 공중에 떠 있는 모션을 취한다. 이는 아바타의 기본 모션으로 이 모션 자체가 애니메이션에 영향을 주지는 않는다. 다만...

Preview 기능을 킨 상태로 업로드를 해 보았다.

  Animation탭의 Preview 기능을 킨 상태로 업로드를 하면 이렇게 시점은 원래 머리에 있던 곳에 고정되어 있으면서도 몸은 바닥에 박혀버리며 Preview 상태의 자세를 유지하고 있는 아바타를 볼 수 있다.

 

  다시 한 번 말한다. 아바타 업로드 시에는 반드시 Preview 기능을 끄고 업로드해야 한다.

  물론 실수로 Preview를 킨 상태에서 업로드 했다고 하더라도 다시 끄고 업로드하면 정상적으로 돌아오므로 걱정하지 않아도 된다.


-트랜지션(Transition) 세부설정

  트랜지션(Transition)이 무엇인지에 대해서는 7장에서 설명한 바가 있다.

 

  다시 한 번 설명하면

  노드와 노드를 잇는 주황색, 흰색 선을 트랜지션이라 하고 이 트랜지션은 알고리즘을 구성하는 역할을 한다.

 

  이 트랜지션을 클릭하면 파란선으로 바뀌며 해당 트렌지션을 선택할 수 있다. 트랜지션을 선택하면 Inspector탭에 다음과 같은 항목들이 나온다.

  위의 설정에 대해서 각각 설명하겠다.

 

  • Has Exit Time : 체크를 할 경우 반드시 해당 이전 애니메이션이 종료되어야 다음 애니메이션을 실행한다. 체크가 해제되어 있을 경우는 Conditions의 조건을 만족할 경우 바로 다음 애니메이션을 실행한다.
  • Fixed Duration : Transition Duration의 단위를 초로 할 지, 비율로 할 지 정한다. 비율(체크X)은 1이 100%를 의미한다.
  • Transition Duration : 다음 애니메이션이 조건을 충족하고 얼마 뒤에 실행될 지 결정한다. Conditions 조건이 존재할 경우 조건을 만족한 상태로 시간이 지나야 하며 조건이 중간에 불충족 상태가 될 경우 시간이 초기화된다. 1 이상의 수로 설정하는 것도 가능하다.
  • Transition Offset : 다음 애니메이션이 이전 애니메이션의 어느 시점에서 재생되기 시작할지 설정한다. 음수로는 설정할 수 없다.
  • Interruption Source, Ordered Interruption : 애니메이션의 재생 대기열을 제어하는 설정인데 이 설정에 관해서는 다룰일이 그다지 없고 너무 자세한 부분까지 들어가기 때문에 넘어가겠다.

 

  글로만 설명해도 이해를 하기 힘드니 간단한 실험과 함께 영상과 함께 이해해보겠다.


  Has Exit Time, Exit Time :

  Has Exit Time, Exit Time설정은 애니메이션의 시작과 관련된 설정이다.

큐브 1개, 애니메이션 파일 2개, 애니메이터 파일 1개, 그리고 만든 큐브에 애니메이션 컴포넌트를 생성해 애니메이터 파일을 적용한다.
애니메이션 파일 D : 큐브가 흰색
애니메이션 파일 R : 큐브가 빨간색

준비 과정 영상

  일단 애니메이션을 위한 기본 준비로 위와 같은 준비를 해 보았다. 참고로 애니메이션 파일에 키 프레임 정보가 하나만 들어있다면 애니메이션은 그 1프레임을 기본적으로 30프레임으로 1초간 유지하도록 시간이 자동으로 세팅된다.

  일단 알고리즘은 위와 같이 설정해놓고 아래와 같은 조건을 실험해 볼 것이다.

 

  D->R 트랜지션은 다음과 같이 세팅한다.

 

  1. Has Exit Time : 체크O / Exit Time : 1

  2. Has Exit Time : 체크O / Exit Time : 0.5

  3. Has Exit Time : 체크X / Exit Time : 1

  4. Has Exit Time : 체크X / Exit Time : 0.5

 

  나머지 조건은 전부 0으로 하고 Interruption Source는 None으로 지정하겠다. R이라는 Bool 변수를 설정해 놓고 트랜지션의 Conditions는 (R, true)로 해당 트랜지션은 R 변수가 True가 될 때에 발동하도록 했다.

 

  R->D는 트랜지션은  Has Exit Time : 체크O 나머지는 모두 0, Interruption Source는 None으로 지정하고 Condition은 비워두워서 R 애니메이션이 종료되면 바로 D로 돌아갈 수 있도록 세팅했다.

 

  다음 동영상에 세팅 영상과 실험영상이 모두 있으므로 참고하도록 하자.

  자, 실험 결과를 분석하도록 하자.

 

  1. Has Exit Time : 체크O / Exit Time : 1

  R 변수가 true 상태가 되었을 때, D 애니메이션이 모두 실행된 후에 R 애니메이션이 실행된다.

  2. Has Exit Time : 체크O / Exit Time : 0.5

  R 변수가 true 상태가 되었을 때, D 애니메이션이 반 만 실행된 후에 R 애니메이션이 실행된다. 이는 Exit time을 0.5로 설정했기 때문이다.

  3. Has Exit Time : 체크X / Exit Time : 1 , 4. Has Exit Time : 체크X / Exit Time : 0.5

  R 변수가 true 상태가 되었을 때, D의 상태에 관계없이 바로 R 애니메이션을 실행한다. 이는 Has Exit Time을 비활성화하면 Exit Time에 관계없이 조건이 충족되는 대로 바로 다음 애니메이션을 실행함을 의미한다. 참고로 영상은 마치 R 애니메이션만을 계속 반복하고 있는 것으로 보이지만 자세히 보면 한 번 D애니메이션을 실행했다가 다시 R 애니메이션을 실행하고 있다.

  조건이 충족되는 대로 바로 다음 애니메이션을 실행하기 때문에 Exit Time 값의 존재는 의미가 없는 것이며 따라서 Has Exit Time을 비활성화하는 경우 Exit Time 설정칸이 비활성화하는 것이다.

 

  위 실험을 통해 Has Exit Time과 Exit Time이 어떤 기믹을 가지고 있는지 알 수 있게되었다.

  정리하면

  Has Exit Time은 다음 애니메이션의 즉시 재생 여부를 결정하고

  Exit Time은 즉시 재생하는 경우 이전 애니메이션의 어느 시점에서 재생할 지 설정한다.

 

  또한 위 결론을 통해 R -> D의 트랜지션은 'R 애니메이션이 끝나는 대로 D 애니메이션을 실행하라'라는 의미임을 알 수 있었다.


  Transition Duration :

  Transition Duration은 동영상에서 말하는 페이드 인, 페이드 아웃기능과 비슷하다고 할 수 있다.

 

  알고리즘은 똑같이 설정해놓고 아래와 같은 조건을 실험해 볼 것이다.

 

  D->R 트랜지션을 다음과 같이 세팅한다.

 

  1. Has Exit Time : 체크O / Exit Time : 1 / Transition Duration : 0.5

  2. Has Exit Time : 체크O / Exit Time : 1 / Transition Duration : 1

  3. Has Exit Time : 체크O / Exit Time : 0.5 / Transition Duration : 0.5

  4. Has Exit Time : 체크O / Exit Time : 0.5 / Transition Duration : 1

  5. Has Exit Time : 체크X / Transition Duration : 0.5

  6. Has Exit Time : 체크X / Transition Duration : 1

 

  Transition Duration이 0일 때는 위에서 시험해 봤으므로 스킵한다. Has Exit Time을 비활성화하면 Exit Time은 사용할 수 없으므로 고려하지 않는다.

  결과를 분석하자.

 

  1. Has Exit Time : 체크O / Exit Time : 1 / Transition Duration : 0.5

  Exit Time을 1로 설정했으므로 D 애니메이션이 끝나고 R 애니메이션이 실행된다. 다만 Transition Duration이 0일 때와는 크게 다른 점이 하나 있는데 바로 큐브의 색이 서서히 바뀐다는 것이다. 이는 만약 두 애니메이션이 같은 요소를 변화시킬 경우 서로 간섭을 일으키며 연속적인 변화를 일으킬 수 있다는 것을 의미한다.

  2. Has Exit Time : 체크O / Exit Time : 1 / Transition Duration : 1

  Transition Duration을 1로 설정했으므로 큐브가 흰색에서 붉은색으로 바뀌는데 걸리는 시간이 길어졌다. 따라서 Transition Duration은 이전 애니메이션에서 다음 애니메이션으로 전환되는데 걸리는 시간을 의미한다.

  3. Has Exit Time : 체크O / Exit Time : 0.5 / Transition Duration : 0.5

  대체로 1번과 같은 변화를 보이나 다른 점은 D 애니메이션 재생 도중, Exit Time을 0.5로 설정했기 때문에 재생 시간의 딱 절반이 지났을 때에 R 애니메이션이 재생되는 것을 알 수 있다.

  4 . Has Exit Time : 체크O / Exit Time : 0.5 / Transition Duration : 1

  마찬가지로 3번과 같은 변화이나 2번과 같이 큐브가 색이 변화하는 시간이 길어졌다.

  5. Has Exit Time : 체크X / Transition Duration : 0.5

  Has Exit Time이 비활성화 되어있을 경우 바로 다음 애니메이션이 재생되기 때문에 R 애니메이션 재생이 시작되지만 Transition Duration의 0.5만큼은 D 애니메이션도 재생되어야 하기 때문에 R 애니메이션 재생 시작과 동시에 D 애니메이션도 반만 재생된다.

  6. Has Exit Time : 체크X / Transition Duration : 1

  5번과 마찬가지 이유로 처음부터 끝까지 같이 재생된다.

 

  Transition Duration의 기능을 요약하면 이전 애니메이션에서 다음 애니메이션으로 넘어가는데 걸리는 시간을 설정하는 기능인 것이다.


  Transition Offset :

  Transition Offset은 애니메이션의 시작점을 옮기는 기능이다. 따라서 보여줄 것은 많지 않다.

  영상에서 보이는 것처럼 Transition Offset은 심플하게 설정한 수치의 시점에서 애니메이션을 재생한다. 즉, 애니메이션을 중간부터 재생하는 것이 가능하다.


-애니메이션 노드 설정

  트랜지션 설정을 배웠으므로 애니메이션 노드 자체의 설정을 살펴보자.

  • Motion : 해당 노드에 적용할 애니메이션 파일을 적용한다.
  • Speed : 애니메이션의 속도를 정한다. 음수로 지정해서 역으로 재생하는 것도 가능하다.
    • Multiplier : Speed에 Multiplier에 지정된 변수를 곱하는 것으로 속도를 조정하는 것이 가능하다 Parameter를 체크하면 변수를 지정할 수 있으며 Float 변수만 사용할 수 있다.
  • Motion Time : 적용한 Float 변수의 값에 따라 애니메이션을 재생한다. 
  • Mirror : 휴머노이드가 적용된 3D 모델에만 적용되는 설정으로 좌우 대칭 애니메이션을 만들 수 있다.
  • Cycle Offset : 적용한 애니메이션 파일이 반복하는 애니메이션일 경우(Loop) 그 시작을 어디서부터 할지 제어한다. Float 변수와 연결하는 것도 가능하다.
  • Foot IK : IK란 역운동학(Inverse Kinematics)의 약자로 쉽게 말하면 자연스러운 관절을 표현하는데 사용한다. 따라서 이 설정 또한 휴머노이드가 적용된 3D 모델에만 적용되는 설정이며 IK와 관련된 설정이 모델에 사전에 처리되어 있어야 한다.
  • Default Write : 활성화 시에 해당 애니메이션에서 다루지 않는 프로퍼티를 '기본값'으로 설정한다. 여기서 '기본값'이란 게임을 시작하기 전의 상태를 의미한다.
  • Transitions : 해당 애니메이션에 연결되어 있는 모든 트랜지션을 표시한다.
    • Solo : 해당 애니메이션에 연결되어 있는 트랜지션 중 Solo에 체크된 트랜지션만을 활성화한다.
    • Mute : 해당 설정이 활성화된 트랜지션은 활성화 할 수 없다.
    • Solo & Mute : 둘 다 활성화 할 경우 Mute로 설정된 것으로 한다.

  이 설정들도 몇 가지를 영상으로 실험해보겠다.


  Motion Time :

  위의 영상처럼 Motion Time은 지정한 변수의 값에 따라 애니메이션을 재생할 수 있게하는 설정이다. 아바타에 상당히 많이 사용하는 기믹이므로 잘 기억해두도록 하자.


  Write Default :

  Write Default 설정 설명의 '기본값'의 의미를 말로는 이해하기 어려우니 아래 영상을 통해 이해해보길 바란다.

  자 영상을 보고 왔는가? 도대체 저 영상의 어떤 포인트가 중요한지 설명하겠다.

 

  게임을 실행하기 전, 나는 Cube 오브젝트의 자식 오브젝트로서 Sphere 오브젝트를 생성했다. 그리고 기본적으로 오브젝트를 비활성화 해 안보이는 상태로 만들었다.

  그 후, R 애니메이션을 수정해서 R 애니메이션을 실행했을 때 Sphere 오브젝트가 나오게 만들었다.

  Animator 창에서는 D 애니메이션 노드에 Write Default 설정을 활성화하고 R 애니메이션 노드에서는 Write Default 설정을 비활성화 했다.

 

  다른 설정을 전부 배제하고 상식적인 선에서 D 애니메이션에서는 Sphere 오브젝트를 건드리지 않았기 때문에 원래라면 R 애니메이션이 실행된 이후, D 애니메이션이 다시 실행될 때에는 Sphere 오브젝트에 변화가 없어야 한다.

 

  그러나 막상 게임을 실행하면 분명 D 애니메이션에서는 Sphere 오브젝트를 건드리지 않았음에도 불구하고 변화가 일어나는 것이 관찰되었다. 그 변화를 잘 관찰해보면 틀림없이 게임을 실행하기 전, 미리 세팅해두었던 Sphere의 상태로 돌아갔음을 알 수 있다.

 

  즉, Write Default 설정은 애니메이터 파일이 적용된 오브젝트 내에 있는 프로퍼티 중, 해당 애니메이션 파일에서 사용되지 않는 프로퍼티를 어떻게 할 것인가에 대한 설정이다. 설정을 활성화하면 게임을 시작하기 전의 초기 상태의 '기본값'으로 되돌리고 설정을 비활성화하면 이전의 상태를 그대로 유지한다.

  다시 한 번 강조하지만 기억하라! <애니메이션 파일에서 다루지 않는 프로퍼티를 기본값으로 되돌리는 것>이다. 즉, 애니메이션이 재생되고 있는 프로퍼티는 기본값으로 돌아가지 않는다!


-레이어(Layer)

  여기까지 전부 이해했다면 당신은 대단한 사람이다! 사실 필자도 위의 몇몇 내용을 검증하기 위해 많은 시도를 했다. 그 끝에 결론내린 것이 위의 설명인데 부디 모두가 이해했기를 바란다.

 

  여기까지 했음에도 정말 미안하지만 아직 끝나지 않았다! 아직 우리가 애니메이션에서 유일하게 다뤄보지 않은 기능이 있다. 바로 레이어(Layer)이다.

  레이어는 포토샵이나 다른 편집 프로그램에 있는 레이어 시스템들과 같은 역할을 한다. 다만 다른 점은 다루는 것이 애니메이션일 뿐이다.

  레이어의 오른쪽에 있는 톱니바퀴 모양을 누르면 레이어를 설정할 수 있다.

  • Weight : 가중치. 해당 레이어에서 실행되는 애니메이션이 게임에 얼마나 영향을 미칠지 설정하는 것이다. Base Layer는 1로 고정되어 있다.
  • Mask : 애니메이터 파일이 적용된 오브젝트가 휴머노이드 오브젝트일 경우 해당 레이어가 영향을 줄 수 있는 부위를 설정할 수 있다. 
  • Blending : 다른 레이어와의 상호작용 관계를 설정한다.
    • Override : 각 레이어에서 사용하는 프로퍼티가 같더라도 나중에 실행되는 쪽의 값으로 완전히 치환한다. 이때 우선도는 아래에 있는 레이어일수록 높다.
    • Additive : 만약 각 레이어가 같은 프로퍼티를 사용하고 있을 경우 현재 오브젝트의 값에 각 애니메이션의 변화를 반영한다. 이 때 반영되는 값은 가중치에 의존한다.
  • Sync : 활성화하면 다른 레이어를 선택할 수 있는데 해당 레이어의 알고리즘을 복사하고 동기화한다. 단, 애니메이션 노드가 비워지기 때문에 다른 애니메이션을 집어 넣어야한다. 레이어의 구조는 같아야하는데 다른 애니메이션을 써야할 때에 사용한다.
  • Timing : 가중치에 따라 해당 레이어의 애니메이션 재생시간을 조절한다.
  • IK Pass : 해당 레이어에서 사용하는 모든 애니메이션에서 IK를 사용하게 한다.

  아바타를 만들 때에 보통 레이어를 만들면 Weight는 대부분 1로 설정해두고 사용한다. 또한 Blending 설정도 웬만해서는 Override를 사용하지만, 본 강좌는 세부적이게 알아보는 것이 목적이기 때문에 Weight를 이용해 Blending 설정의 차이를 확인해 볼 것이다.

 

  이번 실험은 다음과 같이 진행한다.

 

  2개의 레이어를 만들고 한 레이어는 왼쪽, 한 레이어는 오른쪽으로 움직이는 애니메이션을 넣고 Weight, Blending 설정에 따라 어떻게 변화하는지 확인한다.

 

  Weight와 Blending의 영향 관계를 알겠는가?

 

  Weight는 말 그대로 가중치다. Weight값을 변화시키자 오브젝트의 변화량이 줄어드는 것을 확인했을 것이다.

 

  Blending의 Override는 말하자면 덮어쓰기다. 오브젝트가 어떤 상태에 있던 덮어쓰기 해버린다. Additive는 더하기이다. 기존 상태에 애니메이션 만큼의 가산치를 더한다. 따라서 최종결과가 애니메이션의 결과와 같지 않다.

  결과적으로 말하면 Override는 보는 그대로 애니메이션이 실행되지만 Additive의 경우 보이는 그대로 애니메이션이 실행되지 않고 좀 더 수학적으로 접근해야한다.

 

  예를 들어 위 동영상에서는 큐브가 왼쪽으로 1만큼 가 있는 상황에서 오른쪽으로 1만큼 가는 애니메이션이 발동했기 때문에 결과적으로 큐브는 원래 자리로 돌아왔다는 계산이 된다.


-VRC전용 Parameter Driver 등등의 Behavior 기능

  애니메이션 노드를 클릭하고 Add Behaviour 버튼을 누르면 위와 같은 화면이 된다. VRC에서는 스크립트를 사용하지 못하게 하는 대신 애니메이션으로 여러가지 것이 가능할 수 있도록 여러 기능들을 만들어 두었는데 해당 기능들은 해당 애니메이션 노드가 실행되었을 때 즉각적으로 발동되므로 신중하게 사용하면 더욱 고급 기능을 만드는데 도움이 될 것이다.


VRC Animator Layer Control :

  레이어의 Weight를 설정할 수 있다.

  Playable : 아바타 오브젝트에 적용한 VRC Avatar Description 컴포넌트의 애니메이터 파일 중 원하는 것을 고른다.

  Layer : 선택한 애니메이터 파일의 몇 번째 레이어를 제어할 지 결정한다.

  Goal Weight : 설정할 가중치 값을 설정한다.

  Blend Duration : 설정한 값까지 가는데 걸리는 시간을 설정한다.

  Debug String : 해당 기능이 발동했을 때에 표시할 문자열을 설정한다.


VRC Playable Layer Control :

  기본적인 설정은 위의 Animator Layer Control 설정과 같다. 다른 점은 선택한 애니메이터 파일의 한 레이어가 아니라 전체 레이어를 제어한다는 것이 다르다.


VRC Animator Locomotion Control :

  플레이어가 컨트롤러를 통해 이동을 할 수 있게 할 지에 대한 설정이다.

  Disable로 설정되면 그 순간부터 컨트롤러를 통해 이동할 수 없게되며

  Enable로 설정되면 다시 이동할 수 있게된다.


VRC Animator Temporary Pose Space :

  이 기능은 별로 추천하는 기능이 아니므로 짧게 설명하고 넘어가겠다.

  이 기능은 VRC 플레이 중 불편한 자세에서 눈 위치를 조정하기 위해 만들어진 기능이나 이거에 관해서는 0강에서 설명했던 OVR Advanced Setting라는 더 좋은 서브 프로그램이 있으므로 사용할 이유가 그다지 없다.

  혹시 정확한 사용법을 알아내거나 생기면 이곳에 남기도록 하겠다.


VRC Animator Tracking Control :

  몸의 어느 부위를 트래커 또는 컨트롤러로 움직일지, 아니면 애니메이션으로 제어할지를 제어할 수 있다.

  Tracking을 선택하면 해당 부위를 추적하는 컨트롤러로 제어한다.

  Animation을 선택하면 해당 부위를 애니메이션을 통해 제어한다.

  No Change를 선택하면 현재 상황을 유지한다.


VRC Avatar Parameter Driver :

  사실상 이 기능을 알려주기 위해 9강을 쓴 것이라고 해도 무방하다. 이 기능을 이용하면 애니메이션을 재생하는 것을 통해 변수를 제어할 수 있다.

  • Type : 변수 제어 방법을 택한다.
    • Set : 선택한 변수를 원하는 값으로 바꾼다.
    • Add : 선택한 변수에 원하는 값만큼 더한다. 당연히 음수도 가능하다.
    • Random : 선택한 변수의 값을 지정한 범위 안의 수로 한다.
    • Copy : 선택한 변수에 다른 함수의 값을 복사한다.
  • Destination : 제어할 변수를 선택한다.
  • Value : 원하는 값
  • (Random)Min Value : 범위의 최솟값
  • (Random)Max Value : 범위의 최댓값
  • (Copy)Source : 복사할 변수
  • (Copy)Destination : 붙여넣을 변수
  • (Copy)Convert Range : Source 변수와 Destination 변수가 어느 범위 안에 있을 때만 복사할 수 있게 할 지 설정할 수 있다.

  다른 건 다 신경쓰지 않아도 되지만 Parameter Driver는 꼭 시험해 보길 바란다. 아바타 제작의 큰 전환점이 될 수 있을 것이다.


-특수 노드

  사진의 두 노드가 소개할 2개의 특수 노드가 된다. 둘 다 꽤 유용한 노드이므로 익혀두면 좋다.


Blend Tree

  Animator탭의 빈 공간에 우클릭을 하고 Create State -> From New Blend Tree를 선택하면

  위와 같이 Blend Tree라는 노드가 나온다. 아직까지는 평범한 애니메이션 노드 같지만 Blend Tree의 진수는 노드를 더블클릭하면 알 수 있다.

  Blend Tree 노드를 더블 클릭하면 이렇게 노드의 안쪽으로 들어올 수 있게 된다.

  가운데 노드를 클릭하면 Inspector 탭에 다음과 같은 항목들이 나온다.

  Parameter는 Float형 변수를 하나 지정할 수 있는데 이 변수가 Float 변수를 쓰는 데는 이유가 있다.

  +를 누르면 항목을 추가할 수 있는데 저기에 들어가는 것은 다름아닌 애니메이션 파일이다.

  혹시 이쯤에서 눈치를 챘을지도 모르겠지만 그렇다. Blend Tree 노드는 일반 애니메이션 노드의 Motion Time 설정을 시간 단위가 아니라 애니메이션 단위로 바꾼 것이다.

  이름 아래에는 Blend Type이라는 항목이 있는데 이를 변경하는 것으로

  위와 같이 1차원 뿐만 아니라 2차원을 이용해 2개의 파라미터로 제어하는 것도 가능하다. 또는

  각 애니메이션에 파라미터를 할당해서 재생시키는 것도 가능하다.

 

  위의 영상으로 Blend Tree가 어떤 기능을 가지고 있는지 충분히 이해가 됬으리라 생각한다.


Sub-State Machine

  Sub-State Machine은 노드가 6각형으로 되어있다. 이 노드 또한 더블 클릭이 가능한데

  더블 클릭해서 들어오면 초기의 레이어와 비슷한 장면이 나온다. 그렇다. Sub-State Machine은 말 그대로 폴더의 역할을 수행한다.

  따라서 모든 기능이 다른 것이 없지만 위 사진의 보이는 (Up)Base Layer이라는 노드만이 다른 점인데 이름에서도 알 수 있듯이 현재의 노드에서 나가서 다른 노드로 나가는 기능을 담당하고 있다. 들어온 폴더에서 나가게 해주는 노드라고 할 수 있다.


-그래프식 타임 라인

  우리가 쓰는 Animation탭의 타임 라인에는 2가지 종류가 있다. Dopesheet는 평소에 우리가 사용하는 키 프레임을 사용하는 타임라인이다. 이번에 다뤄볼 것은 Curves 타임라인이다.

  디자인이 조금 달라지긴 했지만 솔직히 무엇이 달라졌는지 지금은 알기 힘들다. 하지만 이것은 프로퍼티가 추가되지 않았기 때문이다.

  프로퍼티를 추가하니 갑자기 연속된 선이 하나 나왔다. 일단 보이는 점을 잡고 움직여 보면

  이제는 알기 싫어도 알 수 밖에 없을 것이다. 그렇다. 말 그대로 이 타임라인은 연속적인 움직임이 필요한 애니메이션에 특화된 타임라인이다. 한 번 이 상대로 재생을 해 보도록 하자.

 

  영상에서 볼 수 있듯이 각 선이 세로로 움직인 만큼 회전했다. 추가한 프로퍼티가 Rotate이니 당연한 것이다.

 

  이제 알겠는가? Curves 타임라인은 가로축이 시간, 세로축이 변위인 그래프이다!


※시간, 변위 그래프와 함수의 기본이론※

  또다시 피할 수 없는 수학시간이 오고야 말았다....정말 독자들에게는 할 말이 없다. 하지만 들어주기를 바란다. 그래프 타임라인을 다루기 위해서 함수는 알면 반드시 도움이 되는 지식이니 말이다.

  위는 누구나 알고 있는 흔히 말하는 '거속시' 공식을 식으로 표현한 것이다.

  위 그림은 누구나가 중학교 때 배우는 1차 함수의 기초를 표현한 것이다. 아마 고등교육을 마친 이들은 이미 내가 무엇을 말하려고 하는 것인지 알 것이다.

  그렇다. x축이 시간, y축이 변위인 그래프에서 그래프의 기울기란 속도를 의미하는 것이다!

  그렇다면 단순한 그래프부터 분석해보자.

  그래프가 이런 모양일 때 오브젝트의 속도는 당연히 일정하지 않다. 그래프에서 보이듯 기울기가 일정하지 않기 때문이다. 그렇다면 위의 그래프는 어떻게 움직이게 되는 것일까.

 

  0:00 시점에서는 빠르게 움직이다가 점점 느려지게 된다. 그래프가 아래로 볼록한 곳에서 그래프의 순간적인 기울기가 평평해지면서 기울기 값이 점점 줄어들게 되고(시간당 움직이는 변위가 점점 줄어들기 때문) 가장 볼록한 지점에서 속도가 0이 되는 지점이 생긴다.(이는 미적분을 통해 증명이 가능하지만 이 방법은 학교에서 배워보도록 하자! 지금은 그렇구나 하고 넘어가자.)

  그렇게 이번엔 처음 움직이는 방향의 반대방향으로 가속하다가 또 한번 볼록한 곳에서 느려지며 멈췄다가 다시 원래대로 움직이기 시작하며 애니메이션이 끝난다.

 

  이처럼 그래프를 읽을 수 있으면 오브젝트의 움직임을 정교하게 설계하고 예상하는 것이 가능하다.

  그래프 타임라인은 중간에 점을 찍는 것도 가능하기 때문에 이런 5차 그래프도, 원하면 더 많은 항의 그래프를 만드는 것도 가능하다.

 

  굳이 그래프를 계산해서 만들 것까지는 없지만 그래프를 읽고 오브젝트의 움직임을 예상하지 못하면 그래프 타임라인을 원할하게 활용하는 것은 불가능하다. 혹시 고등수학을 아직 배우지 않은 분들은 이걸 기회로 한 번 공부해보는 것도 나쁘지 않을 것이다.


  자, 그럼 여기서 질문이다.

  현재 큐브는 이런 모양의 그래프를 가지고 있어서 x축으로 일정한 속도를 가지고 회전하지 못한다. 그렇다면 어떻게 해야 일정한 속도로 회전하게 할 수 있을까? 밑의 동영상을 재생해보기 전에 잠시 스크롤을 멈추고 생각해보길 바란다.

  정답을 알았는가? 그렇다. 정답은 기울기를 일정하게 하면 큐브는 일정한 속도로 회전할 수 있게된다! 이처럼 적어도 그래프 타임라인을 사용하기 위해서는 그래프에 대한 기본적인 이해가 필요하니 만약 이 기능을 사용하고 싶다고 하면 반드시 수학공부를 열심히 하도록 하자.


-반복하는 애니메이션

  이때까지 애니메이션은 한 번 실행하면 끝나는 애니메이션들 뿐이었다. 하지만 사실 애니메이션 파일에는 반복을 제어하는 설정이 있다.

  애니메이션 파일의 Loop Time 설정을 활성화하면 애니메이션이 끝나도 자동으로 애니메이션을 다시 처음부터 재생한다.

 

  겸사겸사 일정한 속도로 돌아가는 무한회전 애니메이션을 만드는 법도 공개했다.


  정말 긴 강의 끝까지 봐주어서 정말 고맙다. 다만 글로 하는 강의에는 어디까지나 한계가 있을 수 밖에 없다. 애니메이션을 익숙하게 다룰 수 있는 방법은 언제나 연습과 연습, 그리고 또 연습밖에 없으니 많은 애니메이션을 만들어보고 익숙해지길 바란다.