헤더파일

스킨 애니메이션 - 클립 본문

게임엔진아키텍처

스킨 애니메이션 - 클립

헤더파일 2018. 1. 28. 23:15

게임은 본질적으로 상호작용이기 때문에 미리 캐릭터가 어떻게 움직이고 행동할지 예측할 수 없습니다. 그렇기 때문에 게임 에니메이션은 영화처럼 프레임이 길게 이어지게 만들지 않고 대신 게임 캐릭터의 움직임을 세세한 동작 단위로 끊어서 만든다. 이 개별적인 움직임들을 애니메이션 클립이라 한다.


1.타임라인

모든 애니메이션 클립은 로컬 타임을 갖고 있다. 클립의 시작점에서 t = 0이고 끝에서 t = T인데 여기서 T는 클립의 전체 재생 시간이다. 하지만 게임에서 화면이 갱신되는 시간은 항상 정수일 수 없고 컴퓨터 사양에 따라서도 상대적이다. 이렇기 때문에 애니메이터는 재생중 특정시각에 키 포즈 나 키 프레임이라 불리는 주요한 포즈들만 잡고 컴퓨터가 선형 보간 등의 방법을 사용해 그 사이를 채운다. 

프레임 - 1/30초 처럼 시간 간격을 나타낼 때 사용

샘플 - 어떤 시점의 시각

총 재생시간이 1초이고 초당 30프레임인 애니메이션의 길이는 30프레임이고 모두 31개의 샘플이 있다.

루핑클립(반복되는 애니메이션)이 아닌 경우 N프레임이면 N+1개의 고유한 샘플이 있다.

루핑클립인 경우 마지막 샘플은 중복되므로 N프레임이면 N개의 고유한 샘플이 있다.


총 시간인 T가 얼마건 시작과 끝을 0~1 사이로 정규화하면 편리한 경우가 있다. 이런 정규화된 시간을 애니메이션의 위상이라고 부르기도 하는데, 이것은 애니메이션이 반복될 때 u가 사인 곡선의 위상 역할을 하기 때문이다.


Struct JointPose{...}

Struct AnimationSample

{

JointPose* m_aJointPose;

}

sturct AnimationClip

{

Skeleton* m_pSkeleton;

F32 m_framesPerSecond;

U32 m_frameCount;


AnimationSample* m_aSamples;


bool m_isLooping;

}


뼈대가 다르면 애니메이션을 할 수 없기 때문에 뼈대에 대한 포인터를 갖는다. 좀 더 성능상의 이점을 얻고 싶다면 뼈대 고유 id로 접근하는 것도 좋다.

각 샘플은 모든 관절에 대한 SQT변환행렬들의 배열인 m_aSamples을 갖는다. 이 배열이 갖는 샘플 수는 루핑 애니메이션인 경우 frameCount와 같고 아닌 경우 frameCount+1이다.


'게임엔진아키텍처' 카테고리의 다른 글

스킨 애니메이션-뼈대, 포즈  (0) 2018.01.28
Comments