public void Caculate1()
    {
        Debug.Log(leftCamera.name + ":\n" + leftCamera.worldToCameraMatrix);
        Debug.Log(rightCamera.name + ":\n" + rightCamera.worldToCameraMatrix);

        Vector3[]   points     = GetFeaturePoints();
        PointData[] pointDatas = PreparePointData(points);

        Matrix4x4 ML = Matrix4x4.zero;
        Matrix4x4 MR = Matrix4x4.zero;
        int       m, n; float[] M, N, X;

        /*prepare data for N = [lm00 lm01 lm02 lm03
         *              lm10 lm11 lm12 lm13
         *              rm00 rm01 rm02 rm03
         *              rm10 rm11 rm12 rm13] */
        PrepareData0(out m, out n, out M, out N, out X, pointDatas, 0.5f);
        EigenSharp.cal_line_equation(ref X, m, n, M, N);
        ML[0, 0] = X[0]; ML[0, 1] = X[1]; ML[0, 2] = X[2]; ML[0, 3] = X[3];
        MR[0, 0] = X[8]; MR[0, 1] = X[9]; MR[0, 2] = X[10]; MR[0, 3] = X[11];

        PrepareData1(out m, out n, out M, out N, out X, pointDatas, ML, MR);
        EigenSharp.cal_line_equation(ref X, m, n, M, N);
        ML[2, 0] = X[0]; ML[2, 1] = X[1]; ML[2, 2] = X[2]; ML[2, 3] = X[3];
        MR[2, 0] = X[4]; MR[2, 1] = X[5]; MR[2, 2] = X[6]; MR[2, 3] = X[7];

        Debug.Log("ML:\n" + ML);
        Debug.Log("MR:\n" + MR);
    }
    public void Caculate()
    {
        Debug.Log(leftCamera.name + ":\n" + leftCamera.worldToCameraMatrix);
        Debug.Log(rightCamera.name + ":\n" + rightCamera.worldToCameraMatrix);

        Vector3[] points = new Vector3[features.childCount];
        for (int i = 0; i < features.childCount; i++)
        {
            points[i] = features.GetChild(i).position;
        }

        int m, n; float[] M, N, X;

        PrepareData(out m, out n, out M, out N, out X, points);
        EigenSharp.cal_line_equation(ref X, m, n, M, N);


        Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", X[0], X[1], X[2], X[3]));
        Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", X[4], X[5], X[6], X[7]));
        Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", X[8], X[9], X[10], X[11]));
        Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", X[12], X[13], X[14], X[15]));
        //   Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", x[16], x[17], x[18], x[19]));
//        Debug.Log(string.Format("{0:F5}:{1:F5}:{2:F5}:{3:F5}:", x[20], x[21], x[22], x[23]));

        Vector3 RL0 = new Vector3(X[0], X[1], X[2]);
        Vector3 RL1 = new Vector3(X[4], X[5], X[6]);
        Vector3 RL2 = -Vector3.Cross(RL0, RL1);

        Vector3 RR0 = new Vector3(X[8], X[9], X[10]);
        Vector3 RR1 = new Vector3(X[12], X[13], X[14]);
        Vector3 RR2 = -Vector3.Cross(RR0, RR1);

        Matrix4x4 ML = Matrix4x4.zero;

        ML[0, 0] = RL0.x; ML[0, 1] = RL0.y; ML[0, 2] = RL0.z; ML[0, 3] = X[3];
        ML[1, 0] = RL1.x; ML[1, 1] = RL1.y; ML[1, 2] = RL1.z; ML[1, 3] = X[7];
        ML[2, 0] = RL2.x; ML[2, 1] = RL2.y; ML[2, 2] = RL2.z; ML[2, 3] = 0;
        ML[3, 0] = 0;     ML[3, 1] = 0;     ML[3, 2] = 0;     ML[3, 3] = 1;

        Matrix4x4 MR = Matrix4x4.zero;

        MR[0, 0] = RR0.x; MR[0, 1] = RR0.y; MR[0, 2] = RR0.z; MR[0, 3] = X[11];
        MR[1, 0] = RR1.x; MR[1, 1] = RR1.y; MR[1, 2] = RR1.z; MR[1, 3] = X[15];
        MR[2, 0] = RR2.x; MR[2, 1] = RR2.y; MR[2, 2] = RR2.z; MR[2, 3] = 0;
        MR[3, 0] = 0;     MR[3, 1] = 0;     MR[3, 2] = 0;     MR[3, 3] = 1;



        Vector3 pw  = points[9];
        float   xxl = ML[0, 0] * pw.x + ML[0, 1] * pw.y + ML[0, 2] * pw.z + ML[0, 3];
        //Debug.Log(string.Format("x':{0:F5}", xxl));
        float xxxl = Mathf.Tan(30 * Mathf.Deg2Rad) * WorldToClip(pw, leftCamera).x;
        //Debug.Log(string.Format("x'':{0:F5}", xxxl));
        float tmp = ML[2, 0] * pw.x + ML[2, 1] * pw.y + ML[2, 2] * pw.z;
        //Debug.Log(string.Format("tmp'':{0:F5}", tmp));
        float ml23 = -xxl / xxxl - tmp;



        float xxr  = MR[0, 0] * pw.x + MR[0, 1] * pw.y + MR[0, 2] * pw.z + MR[0, 3];
        float xxxr = Mathf.Tan(30 * Mathf.Deg2Rad) * WorldToClip(pw, rightCamera).x;
        float mr23 = -xxr / xxxr - (MR[2, 0] * pw.x + MR[2, 1] * pw.y + MR[2, 2] * pw.z);

        ML[2, 3] = ml23;
        MR[2, 3] = mr23;



        Debug.Log("ML:\n" + ML);
        Debug.Log("MR:\n" + MR);
    }