Beispiel #1
0
        public TMat4x4 FindInverseMat()
        {
            float Det;

            float[,] C = new float[4, 4];

            C[0, 0] = m11 * (m22 * m33 - m23 * m32) -
                      m12 * (m21 * m33 - m23 * m31) +
                      m13 * (m21 * m32 - m22 * m31);

            C[0, 1] = -(m10 * (m22 * m33 - m23 * m32) -
                        m12 * (m20 * m33 - m23 * m30) +
                        m13 * (m20 * m32 - m22 * m30));

            C[0, 2] = m10 * (m21 * m33 - m23 * m31) -
                      m11 * (m20 * m33 - m23 * m30) +
                      m13 * (m20 * m31 - m21 * m30);

            C[0, 3] = 0;
            C[1, 0] = -(m01 * (m22 * m33 - m23 * m32) -
                        m02 * (m21 * m33 - m23 * m31) +
                        m03 * (m21 * m32 - m22 * m31));

            C[1, 1] = m00 * (m22 * m33 - m23 * m32) -
                      m02 * (m20 * m33 - m23 * m30) +
                      m03 * (m20 * m32 - m22 * m30);

            C[1, 2] = -(m00 * (m21 * m33 - m23 * m31) -
                        m01 * (m20 * m33 - m23 * m30) +
                        m03 * (m20 * m31 - m21 * m30));

            C[1, 3] = 0;
            C[2, 0] = m01 * (m12 * m33 - m13 * m32) -
                      m02 * (m11 * m33 - m13 * m31) +
                      m03 * (m11 * m32 - m12 * m31);

            C[2, 1] = -(m00 * (m12 * m33 - m13 * m32) -
                        m02 * (m10 * m33 - m13 * m30) +
                        m03 * (m10 * m32 - m12 * m30));

            C[2, 2] = m00 * (m11 * m33 - m13 * m31) -
                      m01 * (m10 * m33 - m13 * m30) +
                      m03 * (m10 * m31 - m11 * m30);

            C[2, 3] = 0;
            C[3, 0] = -(m01 * (m12 * m23 - m13 * m22) -
                        m02 * (m11 * m23 - m13 * m21) +
                        m03 * (m11 * m22 - m12 * m21));

            C[3, 1] = m00 * (m12 * m23 - m13 * m22) -
                      m02 * (m10 * m23 - m13 * m20) +
                      m03 * (m10 * m22 - m12 * m20);

            C[3, 2] = -(m00 * (m11 * m23 - m13 * m21) -
                        m01 * (m10 * m23 - m13 * m20) +
                        m03 * (m10 * m21 - m11 * m20));

            C[3, 3] = m00 * (m11 * m22 - m12 * m21) -
                      m01 * (m10 * m22 - m12 * m20) +
                      m02 * (m10 * m21 - m11 * m20);

            Det = 0;

            // Create a temporary array in order to ease calculations
            float[,] TmpM = ConvertToArray();

            for (int i = 0; i < 4; i++)
            {
                Det += TmpM[0, i] * C[0, i];
            }

            float[,] Result = new float[4, 4];

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    Result[i, j] = C[j, i] / Det;
                }
            }

            Result[3, 3] = 1;

            for (int i = 0; i < 4; i++)
            {
                Result[i, 3] = 0;
                Result[3, i] = 0;

                for (int j = 0; j < 4; j++)
                {
                    Result[3, i] = Result[3, i] + TmpM[3, j] * Result[j, i];
                }

                Result[3, i] = -Result[3, i];
            }

            TMat4x4 InverseMat = ZeroMat();

            InverseMat.ConvertFromArray(Result);

            return(InverseMat);
        }