Mat4.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #pragma once
  2. #include "Vec3.h"
  3. namespace Framework
  4. {
  5. template< typename T >
  6. // Eine 4x4 Matrix
  7. class Mat4
  8. {
  9. public:
  10. T elements[ 4 ][ 4 ]; // Die Elemente der Matrix
  11. // Kopiert alle Werte einer anderen Matrix
  12. // r: Die andere Matrix
  13. Mat4 &operator=( const Mat4 &r )
  14. {
  15. memcpy( elements, r.elements, sizeof( elements ) );
  16. return *this;
  17. }
  18. // Skalliert die Matrix
  19. // r: der Faktor
  20. Mat4 &operator*=( const T r )
  21. {
  22. for( T &e : elements )
  23. e *= r;
  24. return *this;
  25. }
  26. // Multipliziert die MAtrix mit einer anderen
  27. // r: Die andere Matrix
  28. Mat4 &operator*=( const Mat4 &r )
  29. {
  30. return *this = *this * r;
  31. }
  32. // Skalliert die Matrix ohne sie zu verändern
  33. // r: der Faktor
  34. Mat4 operator*( const T r ) const
  35. {
  36. Mat4 result = *this;
  37. return result *= r;
  38. }
  39. // Multipliziert zwei Matrizen
  40. // r: Die andere Matrix
  41. Mat4 operator*( const Mat4 &r ) const
  42. {
  43. Mat4 result;
  44. for( int j = 0; j < 4; j++ )
  45. {
  46. for( int k = 0; k < 4; k++ )
  47. {
  48. T sum = 0;
  49. for( int i = 0; i < 4; i++ )
  50. sum += elements[ j ][ i ] * r.elements[ i ][ k ];
  51. result.elements[ j ][ k ] = sum;
  52. }
  53. }
  54. return result;
  55. }
  56. // Multiplziert die Matrix mit einem Vektor
  57. // r: Der Vektor
  58. Vec3< T > operator*( const Vec3< T > &r ) const
  59. {
  60. Vec3< T > result;
  61. result.x = elements[ 0 ][ 0 ] * r.x + elements[ 0 ][ 1 ] * r.y + elements[ 0 ][ 2 ] * r.z + elements[ 0 ][ 3 ];
  62. result.y = elements[ 1 ][ 0 ] * r.x + elements[ 1 ][ 1 ] * r.y + elements[ 1 ][ 2 ] * r.z + elements[ 1 ][ 3 ];
  63. result.z = elements[ 2 ][ 0 ] * r.x + elements[ 2 ][ 1 ] * r.y + elements[ 2 ][ 2 ] * r.z + elements[ 2 ][ 3 ];
  64. return result;
  65. }
  66. // Erzeugt eine Matrix, die einen Vektor um die Z Achse dreht, wenn sie mit ihm multipliziert wird
  67. // radian: Der Winkel in Bogenmas
  68. static Mat4 rotationZ( T radian )
  69. {
  70. const T cosTheta = (T)cos( radian );
  71. const T sinTheta = (T)sin( radian );
  72. Mat4 r = { cosTheta, -sinTheta, 0, 0, sinTheta, cosTheta, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
  73. return r;
  74. }
  75. // Erzeugt eine Matrix, die einen Vektor um die X Achse dreht, wenn sie mit ihm multipliziert wird
  76. // radian: Der Winkel in Bogenmas
  77. static Mat4 rotationX( T radian )
  78. {
  79. const T cosTheta = (T)cos( radian );
  80. const T sinTheta = (T)sin( radian );
  81. Mat4 r = { 1, 0, 0, 0, 0, cosTheta, -sinTheta, 0, 0, sinTheta, cosTheta, 0, 0, 0, 0, 1 };
  82. return r;
  83. }
  84. // Erzeugt eine Matrix, die einen Vektor um die Y Achse dreht, wenn sie mit ihm multipliziert wird
  85. // radian: Der Winkel in Bogenmas
  86. static Mat4 rotationY( T radian )
  87. {
  88. const T cosTheta = (T)cos( radian );
  89. const T sinTheta = (T)sin( radian );
  90. Mat4 r = { cosTheta, 0, sinTheta, 0, 0, 1, 0, 0, -sinTheta, 0, cosTheta, 0, 0, 0, 0, 1 };
  91. return r;
  92. }
  93. // Erzeugt eine Matrix, die einen Vektor Skalliert, wenn sie mit ihm multipliziert wird
  94. // faktor: Der Faktor
  95. static Mat4 scaling( T faktor )
  96. {
  97. Mat4 s = { faktor, 0, 0, 0, 0, faktor, 0, 0, 0, 0, faktor, 0, 0, 0, 1 };
  98. return s;
  99. }
  100. // Erzeugt eine Matrix, die einen Vektor Skalliert, wenn sie mit ihm multipliziert wird
  101. // faktorX: Der Faktor für die X Komponente des Vektors
  102. // faktorY: Der Faktor für die Y Komponente des Vektors
  103. // faktorZ: Der Faktor für die Z Komponente des Vektors
  104. static Mat4 scaling( T faktorX, T faktorY, T faktorZ )
  105. {
  106. Mat4 s = { faktorX, 0, 0, 0, 0, faktorY, 0, 0, 0, 0, faktorZ, 0, 0, 0, 1 };
  107. return s;
  108. }
  109. // Erzeugt eine Matrix, die einen Vektor verchiebt, wenn sie mit ihm multipliziert wird
  110. // offset: Die Koordinaten, um die der Vektor verschoben werden soll
  111. static Mat4 translation( const Vec3< T > offset )
  112. {
  113. Mat4 t = { 1, 0, 0, offset.x, 0, 1, 0, offset.y, 0, 0, 1, offset.z, 0, 0, 0, 1 };
  114. return t;
  115. }
  116. // Erzeugt eine Matrix, die einen Vektor auf den Bildschirm Projeziert
  117. // öffnungswinkel: Der Öffnungswinkel der Kamera im Bogenmas
  118. // bildschirmXY: Das Seitenverhältnis des Rechtecks auf dem Bildschirm, in dem gezeichnet werden soll. (Breite / Höhe)
  119. // minz: Der Mindestabstand zur Kamera, ab dem gezeichnet wird
  120. // maxZ: Der Maximalabstand zur Kamera, ab dem nicht mehr gezeichnet wird
  121. static Mat4 projektion( float öffnungswinkel, float bildschirmXY, float minZ, float maxZ )
  122. {
  123. Mat4 p = { (float)( 1 / tan( öffnungswinkel / 2 ) ) / bildschirmXY, 0, 0, 0,
  124. 0, (float)( 1 / tan( öffnungswinkel / 2 ) ), 0, 0,
  125. 0, 0, maxZ / ( maxZ - minZ ), -( minZ * maxZ ) / ( maxZ - minZ ),
  126. 0, 0, 1, 0 };
  127. return p;
  128. }
  129. // Erzeugt eine Matrix, die mit allem Multipliziert werden kann ohne es zu ändern
  130. static Mat4 identity()
  131. {
  132. Mat4 i = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
  133. return i;
  134. }
  135. };
  136. }