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