Advertisement
xerpi

Matrix and Vector functions

Jul 12th, 2013
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.70 KB | None | 0 0
  1. void IdentityMatrix(float *m)
  2. {
  3.     m[0] = 1.0f; m[4] = 0.0f; m[8] =  0.0f; m[12] =  0.0f;
  4.     m[1] = 0.0f; m[5] = 1.0f; m[9] =  0.0f; m[13] =  0.0f;
  5.     m[2] = 0.0f; m[6] = 0.0f; m[10] = 1.0f; m[14] =  0.0f;
  6.     m[3] = 0.0f; m[7] = 0.0f; m[11] = 0.0f; m[15] =  1.0f;
  7. }
  8.  
  9. void TranslationMatrix(float *m, float x, float y, float z)
  10. {
  11.     m[0] = 1.0f; m[4] = 0.0f; m[8] =  0.0f;  m[12] =  x;
  12.     m[1] = 0.0f; m[5] = 1.0f; m[9] =  0.0f;  m[13] =  y;
  13.     m[2] = 0.0f; m[6] = 0.0f; m[10] =  1.0f; m[14] =  z;
  14.     m[3] = 0.0f; m[7] = 0.0f; m[11] =  0.0f; m[15] =  1.0f;
  15. }
  16.  
  17. void RotationMatrix_X(float *m, float r)
  18. {
  19.     float c = cosf(r);
  20.     float s = sinf(r);
  21.     m[0] = 1.0f; m[4] = 0.0f; m[8] =  0.0f;  m[12] =  0.0f;
  22.     m[1] = 0.0f; m[5] = c;    m[9] =  -s;    m[13] =  0.0f;
  23.     m[2] = 0.0f; m[6] = s;    m[10] =  c;    m[14] =  0.0f;
  24.     m[3] = 0.0f; m[7] = 0.0f; m[11] =  0.0f; m[15] =  1.0f;
  25. }
  26.  
  27. void RotationMatrix_Y(float *m, float r)
  28. {
  29.     float c = cosf(r);
  30.     float s = sinf(r);
  31.     m[0] = c;    m[4] = 0.0f; m[8] =  s;     m[12] =  0.0f;
  32.     m[1] = 0.0f; m[5] = 1.0f; m[9] =  0.0f;  m[13] =  0.0f;
  33.     m[2] = -s;   m[6] = 0.0f; m[10] =  c;    m[14] =  0.0f;
  34.     m[3] = 0.0f; m[7] = 0.0f; m[11] =  0.0f; m[15] =  1.0f;
  35. }
  36.  
  37. void RotationMatrix_Z(float *m, float r)
  38. {
  39.     float c = cosf(r);
  40.     float s = sinf(r);
  41.     m[0] = c;    m[4] = -s;   m[8] =  0.0f;  m[12] =  0.0f;
  42.     m[1] = s;    m[5] = c;    m[9] =  0.0f;  m[13] =  0.0f;
  43.     m[2] = 0.0f; m[6] = 0.0f; m[10] =  1.0f; m[14] =  0.0f;
  44.     m[3] = 0.0f; m[7] = 0.0f; m[11] =  0.0f; m[15] =  1.0f;
  45. }
  46.  
  47. void MultiplyMatrix(float *_dest, float *_m1, float *_m2)
  48. {
  49.     float (*dest)[4] = (float (*)[4])_dest;
  50.     float (*m1)[4]   = (float (*)[4])_m1;
  51.     float (*m2)[4]   = (float (*)[4])_m2;
  52.     dest[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0] + m1[0][2] * m2[2][0] + m1[0][3] * m2[3][0];
  53.     dest[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1] + m1[0][3] * m2[3][1];
  54.     dest[0][2] = m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2] + m1[0][3] * m2[3][2];
  55.     dest[0][3] = m1[0][0] * m2[0][3] + m1[0][1] * m2[1][3] + m1[0][2] * m2[2][3] + m1[0][3] * m2[3][3];
  56.  
  57.     dest[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0] + m1[1][3] * m2[3][0];
  58.     dest[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1] + m1[1][3] * m2[3][1];
  59.     dest[1][2] = m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2] + m1[1][3] * m2[3][2];
  60.     dest[1][3] = m1[1][0] * m2[0][3] + m1[1][1] * m2[1][3] + m1[1][2] * m2[2][3] + m1[1][3] * m2[3][3];
  61.  
  62.     dest[2][0] = m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0] + m1[2][3] * m2[3][0];
  63.     dest[2][1] = m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1] + m1[2][3] * m2[3][1];
  64.     dest[2][2] = m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2] + m1[2][3] * m2[3][2];
  65.     dest[2][3] = m1[2][0] * m2[0][3] + m1[2][1] * m2[1][3] + m1[2][2] * m2[2][3] + m1[2][3] * m2[3][3];
  66.  
  67.     dest[3][0] = m1[3][0] * m2[0][0] + m1[3][1] * m2[1][0] + m1[3][2] * m2[2][0] + m1[3][3] * m2[3][0];
  68.     dest[3][1] = m1[3][0] * m2[0][1] + m1[3][1] * m2[1][1] + m1[3][2] * m2[2][1] + m1[3][3] * m2[3][1];
  69.     dest[3][2] = m1[3][0] * m2[0][2] + m1[3][1] * m2[1][2] + m1[3][2] * m2[2][2] + m1[3][3] * m2[3][2];
  70.     dest[3][3] = m1[3][0] * m2[0][3] + m1[3][1] * m2[1][3] + m1[3][2] * m2[2][3] + m1[3][3] * m2[3][3];
  71.  
  72. }
  73.  
  74. void CopyMatrix(float *src, float *dst)
  75. {
  76.     memcpy(dst, src, sizeof(float) * 16);
  77. }
  78.  
  79. void CameraMatrix(float *m, float *right, float *up, float *forward)
  80. {
  81.     m[0] = right[0]; m[4] = up[0]; m[8] =  forward[0]; m[12] =  0.0f;
  82.     m[1] = right[1]; m[5] = up[1]; m[9] =  forward[1]; m[13] =  0.0f;
  83.     m[2] = right[2]; m[6] = up[2]; m[10] = forward[2]; m[14] =  0.0f;
  84.     m[3] = 0.0f;     m[7] = 0.0f;  m[11] = 0.0f;       m[15] =  1.0f;
  85. }
  86.  
  87. void LookUpMatrix(float *m, float *eye, float *center, float *up)
  88. {
  89.     float forward[3] = {center[0] - eye[0], center[1] - eye[1], center[2] - eye[2]};
  90.     float right[3];
  91.     CrossProductVector(right, up, forward);
  92.     CameraMatrix(m, right, up, forward);
  93. }
  94.  
  95. void CrossProductVector(float *dest, float *v1, float *v2)
  96. {
  97.     dest[0] = v1[1] * v2[2] - v1[2] * v2[1];
  98.     dest[1] = v1[2] * v2[0] - v1[0] * v2[2];
  99.     dest[2] = v1[0] * v2[1] - v1[1] * v2[0];
  100. }
  101.  
  102. float DotProductVector(float *v1, float *v2)
  103. {
  104.     return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
  105. }
  106.  
  107. float LengthVector(float *v)
  108. {
  109.     return sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
  110. }
  111.  
  112. void NormalizeVector(float *src, float *dst)
  113. {
  114.     float length = LengthVector(src);
  115.     dst[0] = dst[0]/length;
  116.     dst[1] = dst[1]/length;
  117.     dst[2] = dst[2]/length;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement