11.04

신승빈·2022년 11월 4일
0

KGCA 수업

목록 보기
64/128

FBX의 Animation

ChildWorldMatrix=ChildLocalMatrix×ParentWorldMatrixChildWorldMatrix = ChildLocalMatrix \times ParentWorldMatrix

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 사이에 끊기는 이미지를 볼 수 있음

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글