Advertisement
Swiftkill

Untitled

Sep 24th, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. /// В действительно этот код дает инвертированный кватернион (-x, -y, -z, w),
  2. /// т.к. наши матрицы хранятся транспонироваными
  3. /// CQuaternion::getMatrix3 работает  аналогично, так что все в порядке
  4. CQuaternion CMatrix4::quaternion() const
  5. {
  6.     CQuaternion quat;
  7.     F32     tr, s, q[4];
  8.     U32     i, j, k;
  9.     U32     nxt[3] = {1, 2, 0};
  10.  
  11.     // след матрицы
  12.     tr = mMatrix[0][0] + mMatrix[1][1] + mMatrix[2][2];
  13.  
  14.     if (tr > 0.f)
  15.     {
  16.         s = (F32)sqrt (tr + 1.f);
  17.         quat.mQ[VS] = s / 2.f;
  18.         s = 0.5f / s;
  19.         quat.mQ[VX] = (mMatrix[1][2] - mMatrix[2][1]) * s;
  20.         quat.mQ[VY] = (mMatrix[2][0] - mMatrix[0][2]) * s;
  21.         quat.mQ[VZ] = (mMatrix[0][1] - mMatrix[1][0]) * s;
  22.     }
  23.     else
  24.     {      
  25.         i = 0;
  26.         if (mMatrix[1][1] > mMatrix[0][0])
  27.             i = 1;
  28.         if (mMatrix[2][2] > mMatrix[i][i])
  29.             i = 2;
  30.  
  31.         j = nxt[i];
  32.         k = nxt[j];
  33.  
  34.  
  35.         s = (F32)sqrt ((mMatrix[i][i] - (mMatrix[j][j] + mMatrix[k][k])) + 1.f);
  36.  
  37.         q[i] = s * 0.5f;
  38.  
  39.         if (s != 0.f)
  40.             s = 0.5f / s;
  41.  
  42.         q[VS] = (mMatrix[j][k] - mMatrix[k][j]) * s;
  43.         q[j] = (mMatrix[i][j] + mMatrix[j][i]) * s;
  44.         q[k] = (mMatrix[i][k] + mMatrix[k][i]) * s;
  45.  
  46.         quat.set(q);
  47.     }
  48.     return quat;
  49. }
  50.  
  51.  
  52. //....
  53. CMatrix4    CQuaternion::getMatrix4(void) const
  54. {
  55.     CMatrix4    mat;
  56.     F32     xx, xy, xz, xw, yy, yz, yw, zz, zw;
  57.  
  58.     xx      = mQ[VX] * mQ[VX];
  59.     xy      = mQ[VX] * mQ[VY];
  60.     xz      = mQ[VX] * mQ[VZ];
  61.     xw      = mQ[VX] * mQ[VW];
  62.  
  63.     yy      = mQ[VY] * mQ[VY];
  64.     yz      = mQ[VY] * mQ[VZ];
  65.     yw      = mQ[VY] * mQ[VW];
  66.  
  67.     zz      = mQ[VZ] * mQ[VZ];
  68.     zw      = mQ[VZ] * mQ[VW];
  69.  
  70.     mat.mMatrix[0][0]  = 1.f - 2.f * ( yy + zz );
  71.     mat.mMatrix[0][1]  =       2.f * ( xy + zw );
  72.     mat.mMatrix[0][2]  =       2.f * ( xz - yw );
  73.  
  74.     mat.mMatrix[1][0]  =       2.f * ( xy - zw );
  75.     mat.mMatrix[1][1]  = 1.f - 2.f * ( xx + zz );
  76.     mat.mMatrix[1][2]  =       2.f * ( yz + xw );
  77.  
  78.     mat.mMatrix[2][0]  =       2.f * ( xz + yw );
  79.     mat.mMatrix[2][1]  =       2.f * ( yz - xw );
  80.     mat.mMatrix[2][2]  = 1.f - 2.f * ( xx + yy );
  81.  
  82.     // TODO -- should we set the translation portion to zero?
  83.  
  84.     return mat;
  85. }
  86.  
  87. // очень простая интерполяция, t = 0...1.f
  88. CQuaternion lerp(F32 t, const CQuaternion &p, const CQuaternion &q)
  89. {
  90.     CQuaternion r;
  91.     F32 inv_t;
  92.  
  93.     inv_t = 1.f - t;
  94.  
  95.     r.mQ[VX] = t * q.mQ[VX] + (inv_t * p.mQ[VX]);
  96.     r.mQ[VY] = t * q.mQ[VY] + (inv_t * p.mQ[VY]);
  97.     r.mQ[VZ] = t * q.mQ[VZ] + (inv_t * p.mQ[VZ]);
  98.     r.mQ[VW] = t * q.mQ[VW] + (inv_t * p.mQ[VW]);
  99.     r.normalize();
  100.     return r;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement