»ç¿ø¼ö(quaternian)

 

ÄõÅʹϾðÀº º¹¼Ò¼öÀÇ È®ÀåÀ¸·Î i, j, k 3°³ÀÇ Çã¼ö¿Í w, x, y, z 4°³ÀÇ ½Ç¼öºÎ·Î ÀÌ·ç¾îÁ® ÀÖ´Ù.

Áï ÇϳªÀÇ ½ºÄ®¶ó¿Í 3°³ÀÇ º¤ÅÍ ==> 4°³ÀÇ ±¸¼º ¿ä¼Ò·Î ÀÌ·ç¾îÁø º¹¼Ò¼ö¸¦ ¸»ÇÑ´Ù.

Çã¼ö i, j, k´Â i * i = -1ÀÇ ¼ºÁúÀ» °¡Áø´Ù.

 = w + xi + yj + zk
 

= sq + vq

 

 = (sq , vq)

 

 = [ w , (x, y, z) ]

¿©±â¼­ w´Â ½ºÄ®¶ó v = (x, y, z)´Â º¤ÅÍÀÌ´Ù.

ÄõÅʹϾð Å©±â  ||q|| = Norm(q) = sqrt(w2 + x2 + y2 + z2)

´ÜÀ§ ÄõÅʹϾ𠼺Áú  w2 + x2 + y2 + z2 = 1

´ÜÀ§ ÄõÅʹϾðÀº (x, y, z)¿ä¼Ò¸¦ ÀÓÀÇÀÇ Ãà, w¿ä¼Ò¸¦ ȸÀü °¢µµ·Î ÇÏ¿© 4Â÷¿ø °ø°£¿¡ Ç¥Çö ÇÒ ¼ö ÀÖ´Ù.

±×¸²À¸·Î °£´ÜÇÏ°Ô Ç¥Çö ÇÏ¸é º¤ÅÍ Ãà A¸¦ Áß½ÉÀ¸·Î ȸÀüÇÏ´Â ¥è´Â

 

»ç¿ø¼ö¸¦ ÀÌ¿ëÇÑ º¤ÅÍ È¸Àü º¯È¯

º¤ÅÍ p¸¦ »ç¿ø¼ö q·Î ȸÀüÇÒ ¶§ °ø½Ä°ú Çà·Ä¿¡ ´ëÇÑ º¯È¯Àº ´ÙÀ½°ú °°´Ù.(Áõ¸íÀº... ¾î·Á¿ö »ý·«)

 

 =

|
|
|
|
|
|

1 - 2Y2 - 2Z2

2XY + 2ZW

2XZ - 2YW

2XY - 2ZW

1 - 2X2 - 2Z2

2YZ + 2XW

2XZ + 2YW

2YZ - 2XW

1 - 2X2 - 2Y2

|
|
|
|
|
|

 

ÄõÆ®´Ï¾ðÀ» Çà·Ä º¯È¯ÇÏ´Â ÇÔ¼ö

//-----------------------------------------------------------------------------

//¿¹Àü ´ÙÀÌ·ºÆ®X ¹öÀü¿¡ d3dmath.cpp ÆÄÀÏ¿¡ ÀÖ´Â ¼Ò½ºÀÌ´Ù.

//-----------------------------------------------------------------------------

VOID D3DMath_MatrixFromQuaternion( D3DMATRIX& mat, FLOAT x, FLOAT y, FLOAT z, FLOAT w )

{

    FLOAT xx = x*x; FLOAT yy = y*y; FLOAT zz = z*z;

    FLOAT xy = x*y; FLOAT xz = x*z; FLOAT yz = y*z;

    FLOAT wx = w*x; FLOAT wy = w*y; FLOAT wz = w*z;

 

    mat._11 = 1 - 2 * ( yy + zz );

    mat._12 =    2 * ( xy - wz );

    mat._13 =    2 * ( xz + wy );

 

    mat._21 =    2 * ( xy + wz );

    mat._22 = 1 - 2 * ( xx + zz );

    mat._23 =    2 * ( yz - wx );

 

    mat._31 =    2 * ( xz - wy );

    mat._32 =    2 * ( yz + wx );

    mat._33 = 1 - 2 * ( xx + yy );

 

    mat._14 = mat._24 = mat._34 = 0.0f;

    mat._41 = mat._42 = mat._43 = 0.0f;

    mat._44 = 1.0f;

}

 

Çà¿­À» ÄõÆ®´Ï¾ðÀ¸·Î º¯È¯ÇÏ´Â ÇÔ¼ö

VOID D3DMath_QuaternionFromMatrix( FLOAT& x, FLOAT& y, FLOAT& z, FLOAT& w, D3DMATRIX& mat )

{

    if( mat._11 + mat._22 + mat._33 > 0.0f )

    {

        FLOAT s = (FLOAT)sqrt( mat._11 + mat._22 + mat._33 + mat._44 );

 

        x = (mat._23-mat._32) / (2*s);

        y = (mat._31-mat._13) / (2*s);

        z = (mat._12-mat._21) / (2*s);

        w = 0.5f * s;

    }

    else

    {

 

 

    }

    FLOAT xx = x*x; FLOAT yy = y*y; FLOAT zz = z*z;

    FLOAT xy = x*y; FLOAT xz = x*z; FLOAT yz = y*z;

    FLOAT wx = w*x; FLOAT wy = w*y; FLOAT wz = w*z;

 

    mat._11 = 1 - 2 * ( yy + zz );

    mat._12 =    2 * ( xy - wz );

    mat._13 =    2 * ( xz + wy );

 

    mat._21 =    2 * ( xy + wz );

    mat._22 = 1 - 2 * ( xx + zz );

    mat._23 =    2 * ( yz - wx );

 

    mat._31 =    2 * ( xz - wy );

    mat._32 =    2 * ( yz + wx );

    mat._33 = 1 - 2 * ( xx + yy );

 

    mat._14 = mat._24 = mat._34 = 0.0f;

    mat._41 = mat._42 = mat._43 = 0.0f;

    mat._44 = 1.0f;

}

 

 

 

[Æß]»ç¿ø¼ö ÀÌÇØÇϱâ