void TFbxLoader::LoadAnimation(TFbxObject* pObj)
{
FbxNode* pNode = pObj->m_pFbxNode;
// Animation Layer의 집합이라는걸 보니 다양한 Animation 정보도 저장할 수 있는 듯
FbxAnimStack* stackAnim = m_pFbxScene->GetSrcObject<FbxAnimStack>(0);
FbxLongLong s = 0;
FbxLongLong n = 0;
FbxTime::EMode TimeMode;
if (stackAnim)
{
FbxString takeName = stackAnim->GetName();
FbxTakeInfo* take = m_pFbxScene->GetTakeInfo(takeName);
// 1초당 30 frame으로 설정
FbxTime::SetGlobalTimeMode(FbxTime::eFrames30);
// frame간의 interval 정보
FbxTimeSpan localTimeSpan = take->mLocalTimeSpan;
FbxTime start = localTimeSpan.GetStart();
FbxTime end = localTimeSpan.GetStop();
FbxTime Duration = localTimeSpan.GetDirection();
TimeMode = FbxTime::GetGlobalTimeMode();
s = start.GetFrameCount(TimeMode);
n = end.GetFrameCount(TimeMode);
}
FbxTime time;
for (FbxLongLong t = s; t <= n; t++)
{
time.SetFrame(t, TimeMode);
TAnimTrack track;
track.iFrame = t;
// 특정 시간대에 node의 World좌표 반환
FbxAMatrix fbxMatrix = pNode->EvaluateGlobalTransform(time);
//track.fbxMatrix = fbxMatrix;
track.matAnim = DxConvertMatrix(fbxMatrix);
pObj->m_AnimTracks.push_back(track);
}
}
위 방식은 특정 Frame대에 Vertex의 World 위치를 저장하는 방식인 Sampling방식을 구현
이 방식은 Sprite Animation과 근본적으로 동일하다
이러한 Sampling방식은 Frame이 충분하다면 충분히 부드러운 움직임을 보일 수 있음
단, Animation의 Frame이 부족하다면 Action 사이에 끊기는 이미지를 볼 수 있음