XML Exporter: ¾Ö´Ï¸ÞÀÌ¼Ç º¸°£

¾Ö´Ï¸ÞÀÌ¼Ç  ÇÁ·¹ÀÓÀÌ ¸¹À»¼ö·Ï ÀúÀå ¿ë·®°ú ¸Þ¸ð¸® ¿ë·®ÀÌ ´Ã¾î³­´Ù.
¾Ö´Ï¸ÞÀÌ¼Ç ÇÁ·¹ÀÓ »çÀÌÀÇ ¾Ö´Ï¸ÞÀ̼ÇÀ» ¼±Çü º¸°£ ÇÏ¿© ¾Ö´Ï¸ÞÀ̼ÇÀÌ ºÎµå·´°Ô º¸À̵µ·Ï ÇÑ´Ù.

À§Ä¡´Â ¼±Çü º¸°£ÇÏ°í ȸÀüÀº Çà·ÄÀ» ÄõÆ®´Ï¾ðÀ¸·Î º¯È¯ --> ÄõÆ®´Ï¾ð ¼±Çü º¸°£ --> ÄõÆ®´Ï¾ðÀ» Çà·Ä·Î º¯È­ÇÑ´Ù.

< ¼±Çü º¸°£ >
Çà·Ä¿¡¼­ _41, _42, _43ÀÇ °ªÀº À§Ä¡¸¦ ³ªÅ¸³½´Ù.
¼±Çü º¸°£ °ø½Ä: v' = (1 - t) * v1 + t * v2

< ȸÀü ¼±Çü º¸°£ >
D3DXQuaternionSlerp¸¦ ÀÌ¿ëÇÑ´Ù.D3DXQuaternionSlerp  : ±¸¸é¼±Çü º¸°£À» »ç¿ëÇØ, 2 °³ÀÇ ÄõÅʹϿ°£À» º¸°£ ÇÑ´Ù.

D3DXQuaternionRotationMatrix : ȸÀü Çà·Ä·ÎºÎÅÍ ÄõÅÍ´Ï¿ÂÀ» »ý¼º ÇÑ´Ù.
Çà·ÄÀ» º¸°£ÇÏ´Â ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.

void MatrixLerp(D3DXMATRIX* pOut, const D3DXMATRIX* m1, const D3DXMATRIX* m2, float t)

{

#if  0
    //¾Ö´Ï¸ÞÀÌ¼Ç °£°ÝÀÌ Á¼À» ¶§

    *pOut = (1 - t) * (*m1) + t * (*m2);

#else

    //¾Ö´Ï¸ÞÀÌ¼Ç °£°ÝÀÌ ³ÐÀ» ¶§

    D3DXQUATERNION    q, q1, q2;

    D3DXVECTOR3    v, v1, v2;

 

    D3DXQuaternionRotationMatrix(&q1, m1);

    D3DXQuaternionRotationMatrix(&q2, m2);

 

    v1 = D3DXVECTOR3(m1->_41, m1->_42, m1->_43);

    v2 = D3DXVECTOR3(m2->_41, m2->_42, m2->_43);

 

    // À§Ä¡¿¡ ´ëÇÑ ¼±Çü º¸°£

    v = (1 - t) * v1 + t * v2;

 

    // ȸÀüÀÇ ¼±Çü º¸°£

    D3DXQuaternionSlerp(&q, &q1, &q2, t);

 

    // ȸÀüÀ» Çà·Ä·Î Àüȯ

    D3DXMatrixRotationQuaternion(pOut, &q);

 

    // À§Ä¡ Àû¿ë

    pOut->_41 = v.x;

    pOut->_42 = v.y;

    pOut->_43 = v.z;

#endif

}

¾Ö´Ï¸ÞÀÌ¼Ç °£°Ý ÀÌ Á¼Àº °æ¿ì´Â *pOut = (1 - t) * (*m1) + t * (*m2)  Çà·Ä ÀÚüÀÇ ¼±Çü º¸°£À¸·Îµµ °¡´ÉÇÏ´Ù.

ÀÌÀ¯:
ȸÀüÇÏ´Â µÎ»ç¿ø¼öÀÇ °¢µµ°¡ ÀÛÀ¸¸é sin¥èÀÇ °ªÀº ¥èÀÇ °ª°ú ºñ½ÁÇØÁ®¼­ ȸÀü »ç¿ø¼öÀÇ º¸°£À» °£´ÜÇÏ°Ô ÇÏ¸é ´ÙÀ½°ú °°´Ù.
 
Result = 1/sin¥è( sin¥è( 1 - t )qi + sin(¥èt)qf

        = 1/¥è ( ¥è( 1 - t )qi + (¥èt)qf

        = (1-t)qi + tqf

< º¸°£ °ª ¼ÂÆà >

ÇÁ·¹ÀÓ°ú ÇÁ·¹ÀÓ »çÀÌÀÇ °¡ÁßÄ¡¸¦ ±¸Çϱâ À§ÇØ float°ªÀÇ ÇÁ·¹ÀÓ¿¡¼­ Á¤¼öÇüÀÇ ÇÁ·¹ÀÓÀ» ±¸ÇÑ´Ù.

float GameTime::GetWeightTime()

{

    return var.fWeight;

}

 

void GameTime::Update()

{

    var.elapsedTick = GetTickCount() - var.startTick;

    var.time = (float)var.elapsedTick / 1000;   

 

    int stride = 1000 / var.fps;

    var.nFrame = var.elapsedTick / stride;

    var.fWeight = (float)var.elapsedTick / (float)stride - var.nFrame;

    var.nFrame %= var.endFrame;

}

Çà·Ä ÆÈ·¹Æ®¿¡ ³Ö±â Àü¿¡ Çà·ÄÀ» º¸°£ÇÑ´Ù. EShaderBone::OnFrameMove()¿¡µµ º¸°£ÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù.

void EShaderBoneMesh::OnFrameMove()

{

    if( this->m_nAniSize > 0 )

    {

        int nFrame = GameTime::GetFrame();   

        float fWt = GameTime::GetWeightTime();

        D3DXMatrixIdentity( &m_matWorld );

        MatrixLerp(&m_matWorld, &m_aniArray[nFrame], &m_aniArray[nFrame + 1 ], fWt );

    }

    else

        D3DXMatrixIdentity(&m_matWorld);

 

    if( m_id >= 0 )

        m_matBlend[m_id] = m_matWorld;

}

ÇÁ·ÎÁ§Æ®: viewer_interpolation.zip