-
ASE Animation [ *TM_ANIMATION FINAL ]GamePrograming/Direct3D 2009. 3. 26. 15:01
드디어 FINAL이다, 값들을 가져왔으면 이제부터 애니메이션을 돌려보자!!
케릭터의 변환 순서는 스케일, 로테이션, 이동 순서로 이루어진다.(이유는 책을 찾아 보시오 -_-)
먼저 로테이션 부터 살펴보겠다. (스케일은 제외)
1. 처음으로 로테이션의 키값이 있는지 없는지를 판별한다.
------------------------------------------------------------------------
2-1. 키값이 없을 경우
2-1-1 키값이 없는데 부모가 있을 경우
TM_ROT = Mesh[i]->node.TM_Local;
TM_ROT._41 = 0;
TM_ROT._42 = 0;
TM_ROT._43 = 0;
TM_ROT._44 = 1.0f;
부모와 자기 NodeTM이 곱해진, Local TM을 넣고, Position값을 초기화,
2-1-2 키값도 없고 부모도 없을 경우
TM_ROT = Mesh[i]->node.TM_Node;
TM_ROT._41 = 0;
TM_ROT._42 = 0;
TM_ROT._43 = 0;
TM_ROT._44 = 1.0f;
자신의 NodeTM에 position값 초기화,
------------------------------------------------------------------------
2-2 키값이 있을 경우
2-2-1 지금 프레임 TICK(시간) 수가 ASE받아온 TICK(시간)와 같을 때
D3DXQUATERNION Out;
Out = R0T.Quater; 그값 그대로 넣어주면 된다.
2-2-2 지금 프레임 TICK(시간) 같은값이 없다면, 앞뒤값으로 보간을 해줘야한다.
보간 타임 구하는 함수
t = ( 지금프레임 - 전TICK값 ) / (앞TICK 값 - 전TICK 값 );
D3DXQuaternionSlerp(&Out, &R0T[j-1].Quater, &R0T[j].Quater, t);
이런식으로 하면 Out의 보간된 값이 들어간다.
2-2-3 지금 프레임 TICK값이 최종 TICK 값보다 클경우,
마지막 값의 쿼터니움을 가지고 있으면 된다.
Out = Ani.R0T[ Final Size ].Quater;
-----------------------------------------------------------------------
3. 쿼터니움을 메트릭스로 전환해준다!!
D3DXMatrixRotationQuaternion(&TM_ROT, &Out);
ROTAITION 끝!!!!!!!!!
---------------------------------------------------------------------- 포지션 시작!!
포지션도 로테이션과 별반 다를게 없다.
3-1. 키값이 없을 경우
3-1-1 키값이 없는데 부모가 있을 경우
TM_POS = Mesh[i]->node.TM_Local;
Out.x = TM_POS._41;
Out.y = TM_POS._42;
Out.z = TM_POS._43;
부모와 자기 NodeTM이 곱해진, Local TM을 넣고, Position 자리에 쎗팅
3-1-2 키값도 없고 부모도 없을 경우
TM_POS = Mesh[i]->node.TM_Node;
Out.x = TM_POS._41;
Out.y = TM_POS._42;
Out.z = TM_POS._43;
자신의 NodeTM에 Position 자리에 쎗팅
------------------------------------------------------------------------
3-2 키값이 있을 경우
3-2-1 지금 프레임 TICK(시간) 수가 ASE받아온 TICK(시간)와 같을 때
D3DXVECTOR3 Out;
Out = POS.pos;그값 그대로 넣어주면 된다.
3-2-2 지금 프레임 TICK(시간) 같은값이 없다면, 앞뒤값으로 보간을 해줘야한다.
보간 타임 구하는 함수
t = ( 지금프레임 - 전TICK값 ) / (앞TICK 값 - 전TICK 값 );
D3DXVec3Lerp(&Out, &POS[j-1].pos, &POS[j].pos, t);
이런식으로 하면 Out의 보간된 값이 들어간다.
2-2-3 지금 프레임 TICK값이 최종 TICK 값보다 클경우,
마지막 값의 포지션을 가지고 있으면 된다.
Out = POS[ Final Size ].pos;
-----------------------------------------------------------------------
4. 벡터값을 셋팅!!!
AniTM = Pos(out) * Rot(out);
AniTM 탄생!! ㅋㅋ
이제 AniTM을 구했으니!! 마지막으로!! 부모를 검색하여 부모가 있으면
자기 AniTM * 부모 AniTM 완벽한 값을 얻어서,
g_pd3dDevice->SetTransform(D3DTS_WORLD, &Mesh[i]->node.ani.TM_Ani);
셋팅하면 ㅠ_ㅠ 애니메이션 동작 끝 ㅠㅠ