Esempio n. 1
0
 protected Transform Multiply(Transform t1, Transform t2)
 {
     Matrix4x4 m1 = Multiply(t1.m, t2.m);
     Matrix4x4 m2 = Multiply(t1.mInv, t2.mInv);
     return new Transform(m1, m2);
 }
Esempio n. 2
0
     /// <summary>
     /// Transpose 值传递
     /// </summary>
     /// <param name="m"></param>
     /// <returns></returns>
     protected Matrix4x4 Transpose(Matrix4x4 m) {
             return new  Matrix4x4(m.m[0,0], m.m[1,0], m.m[2,0], m.m[3,0],
                 m.m[0,1], m.m[1,1], m.m[2,1], m.m[3,1],
                 m.m[0,2], m.m[1,2], m.m[2,2], m.m[3,2],
                 m.m[0,3], m.m[1,3], m.m[2,3], m.m[3,3]);
 }
Esempio n. 3
0
    /// <summary>
    /// Inverse
    /// </summary>
    /// <param name="m"></param>
    /// <returns></returns>
        protected Matrix4x4 Inverse( Matrix4x4 m) 
        { 

            int[] indxc = new int[4];
            int[] indxr = new int[4];
            int[] ipiv = new int[4];
            for (int i = 0; i < 4; i++)
                ipiv[i] = 0;

            float[,] minv = new float[4, 4];
            for (int i = 0; i < 4; i++)//使用值传递
                for (int j = 0; j < 4; j++)
                    minv[i, j] = m.m[i, j];

            for (int i = 0; i< 4; i++)
            {
                int irow = -1, icol = -1;
                float big = 0.0f;
        // Choose pivot
                for (int j = 0; j< 4; j++)
                {
                    if (ipiv[j] != 1)
                    {
                        for (int k = 0; k< 4; k++)
                        {
                            if (ipiv[k] == 0)
                            {
                                if ((float)Math.Abs(minv[j, k]) >= big)
                                {
                                    big = ((float)Math.Abs(minv[j, k]));
                                    irow = j;
                                    icol = k;
                                }
                            }
                            else if (ipiv[k] > 1)
                                return null;
                       // Error("Singular matrix in MatrixInvert");
                        }
                    }   
                }
                ++ipiv[icol];
                // Swap rows _irow_ and _icol_ for pivot
                if (irow != icol)
                {
                    for (int k = 0; k< 4; ++k)
                    Swap(minv[irow,k], minv[icol,k]);
                }   
                indxr[i] = irow;
                indxc[i] = icol;
                if (minv[icol, icol] == 0.0f)
                    return null;
                    //Error("Singular matrix in MatrixInvert");

                // Set $m[icol][icol]$ to one by scaling row _icol_ appropriately
                float pivinv = 1.0f / minv[icol,icol];
                minv[icol,icol] = 1.0f;
                for (int j = 0; j< 4; j++)
                    minv[icol,j] *= pivinv;

                // Subtract this row from others to zero out their columns
                for (int j = 0; j< 4; j++)
                {
                    if (j != icol)
                    {
                        float save = minv[j,icol];
                        minv[j,icol] = 0;
                        for (int k = 0; k< 4; k++)
                            minv[j,k] -= minv[icol,k]* save;
                    }
                }
            }
            // Swap columns to reflect permutation
            for (int j = 3; j >= 0; j--)
            {
                if (indxr[j] != indxc[j])
                {
                    for (int k = 0; k< 4; k++)
                        Swap(minv[k,indxr[j]], minv[k,indxc[j]]);
                }
            }
        return  new Matrix4x4(minv);
        }
Esempio n. 4
0
 protected Matrix4x4 Multiply(Matrix4x4 m1, Matrix4x4 m2,Matrix4x4 m3)
 {
     
     return Multiply(Multiply(m1,m2),m3);
 }