- inline FLP32 Determinante2x2( FLP32 a1, FLP32 a2, FLP32 b1, FLP32 b2 )
- {
- return a1 * b2 - b1 * a2;
- }
- inline FLP32 Determinante3x3( FLP32 a1, FLP32 a2, FLP32 a3,
- FLP32 b1, FLP32 b2, FLP32 b3,
- FLP32 c1, FLP32 c2, FLP32 c3 )
- {
- return a1 * Determinante2x2( b2, b3, c2, c3 ) - b1 * Determinante2x2( a2, a3, c2, c3 ) + c1 * Determinante2x2( a2, a3, b2, b3 );
- }
- void Matrix4::Inverse()
- {
- Matrix4 L_Result;
- FLP32 L_Det;
- L_Result.xx = Determinante3x3( yy, zy, wy, yz, zz, wz, yw, zw, ww );
- L_Result.yx = -Determinante3x3( yx, zx, wx, yz, zz, wz, yw, zw, ww );
- L_Result.zx = Determinante3x3( yx, zx, wx, yy, zy, wy, yw, zw, ww );
- L_Result.wx = -Determinante3x3( yx, zx, wx, yy, zy, wy, yz, zz, wz );
- L_Result.xy = -Determinante3x3( xy, zy, wy, xz, zz, wz, xw, zw, ww );
- L_Result.yy = Determinante3x3( xx, zx, wx, xz, zz, wz, xw, zw, ww );
- L_Result.zy = -Determinante3x3( xx, zx, wx, xy, zy, wy, xw, zw, ww );
- L_Result.wy = Determinante3x3( xx, zx, wx, xy, zy, wy, xz, zz, wz );
- L_Result.xz = Determinante3x3( xy, yy, wy, xz, yz, wz, xw, yw, ww );
- L_Result.yz = -Determinante3x3( xx, yx, wx, xz, yz, wz, xw, yw, ww );
- L_Result.zz = Determinante3x3( xx, yx, wx, xy, yy, wy, xw, yw, ww );
- L_Result.wz = -Determinante3x3( xx, yx, wx, xy, yy, wy, xz, yz, wz );
- L_Result.xw = -Determinante3x3( xy, yy, zy, xz, yz, zz, xw, yw, zw );
- L_Result.yw = Determinante3x3( xx, yx, zx, xz, yz, zz, xw, yw, zw );
- L_Result.zw = -Determinante3x3( xx, yx, zx, xy, yy, zy, xw, yw, zw );
- L_Result.ww = Determinante3x3( xx, yx, zx, xy, yy, zy, xz, yz, zz );
- L_Det = ( xx * L_Result.xx ) + ( xy * L_Result.yx ) + (xz * L_Result.zx ) + ( xw * L_Result.wx );
- // Hier evntl. L_Det auf 0 prüfen, in diesem Fall ist die Matrix singular und kann nicht invertiert werden.
- L_Det = 1.0f / L_Det;
- *this = L_Result;
- xx *= L_Det;
- yx *= L_Det;
- zx *= L_Det;
- wx *= L_Det;
- xy *= L_Det;
- yy *= L_Det;
- zy *= L_Det;
- wy *= L_Det;
- xz *= L_Det;
- yz *= L_Det;
- zz *= L_Det;
- wz *= L_Det;
- xw *= L_Det;
- yw *= L_Det;
- zw *= L_Det;
- ww *= L_Det;
- }