如何创建逆变换矩阵

时间:2012-10-03 19:27:22

标签: java math matrix transformation inverse

我正在使用Java开发一个OpenGL项目,并且我已经想到了在我自己的代码中创建转换矩阵的地方,所以我可以使用它们来进行世界到屏幕的点转换,反之亦然。我已经创建了一个支持转换的Matrix类,这一切都很好用。但是,我实际上无法弄清楚如何创建逆变换。

所以我的问题是:

  • 给定一个任意仿射(4x4)变换矩阵,如何创建逆变换矩阵?一些矩阵是不可逆转的吗?反转变换矩阵有哪些限制和注意事项?

从我的研究中,我听说过各种方法,最简单的方法是转置,然后否定矩阵。但是,这似乎并没有真正起作用。我听说这种方法对某些矩阵不起作用,甚至一些矩阵都是不可逆转的。

我正在寻找的不只是“插入这个等式”的答案,因为我实际上想要了解当我反转矩阵时发生了什么。这也排除了“只使用这个库”的答案。我将来可能会转移到矩阵库,但是现在我想自己创建它。

编辑:在有人要求之前,这是 NOT 作业。这是一个个人项目。

编辑:显然,这里有一整套计算逆矩阵的策略:http://en.wikipedia.org/wiki/Invertible_matrix

1 个答案:

答案 0 :(得分:2)

这是我在计算机图形学课程中使用的一些代码,基本上我使用Gauss Jordan消除来计算矩阵的逆。对于可逆的矩阵,其行列式值必须不等于零。我没有在我的代码中处理过这种情况,但我不打算为你做这一切。

Matrix4* Matrix4::FindInverse(Matrix4 &a){

int n = R;
int i = 0;
int j = 0;
float pivot = 0;
Matrix4* invA = NULL;
//TODO: Check whether the matrix is invertible.Else Return
invA = new Matrix4();
invA->SetMatrix4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);


for(i = 0; i < n; i++){
    pivot = a.v[i][i];

    if(pivot != 1.0 and pivot != 0){
        for(int t = i; t < n; t++){
            a.v[i][t] = a.v[i][t]/pivot;
            invA->v[i][t] = invA->v[i][t]/pivot;
        }
    }

    //Update to the new pivot which must be 1.0
    pivot = a.v[i][i];

    for(j = 0; j < n; j++){
        if( j==i ){
            continue;

        }
        else{
            float l = a.v[j][i]/pivot;
            for(int m = 0; m < n; m++){
                a.v[j][m] = a.v[j][m] - l * a.v[i][m];
                invA->v[j][m] = invA->v[j][m] - (l * invA->v[i][m]);
            }
        }
    }
}
return invA;

}