ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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);

    셋팅하면 ㅠ_ㅠ 애니메이션 동작 끝 ㅠㅠ





    댓글

Designed by Tistory.