如何创建反向变换矩阵

4
我正在Java中开发一个OpenGL项目,现在我想在自己的代码中创建变换矩阵,以便进行世界到屏幕点的转换和反向转换。我已经创建了一个支持变换的Matrix类,并且它工作得非常好。但是,我在实际确定如何创建逆变换时遇到了问题。
所以我的问题是:
给定任意仿射(4x4)变换矩阵,如何创建逆变换矩阵?有些矩阵无法求逆吗?求逆变换矩阵的限制和注意事项是什么?
从我的研究中,我听说过各种方法,其中最简单的方法是转置然后取反矩阵。然而,这似乎并没有实际起作用。我听说这种方法对某些矩阵不起作用,甚至有些矩阵是无法求逆的。
我需要的不仅仅是“插入这个方程”的答案,因为我实际上想理解矩阵求逆时发生了什么。这也排除了“只使用这个库”的答案。将来我可能会使用矩阵库,但现在我想自己创建它。

编辑:在有人问之前,这不是作业。这是一个个人项目。

编辑:显然有一整个策略列表用于计算逆矩阵,链接在此处:http://en.wikipedia.org/wiki/Invertible_matrix


2
你是否正在尝试将其分解为比例、旋转和平移组件?我认为并没有数学上完美的方法来做到这一点,但是有技巧可以提取出“有意义”的组件。 - nielsbot
1
不,据我所知,一个变换矩阵的逆矩阵是“反转”其操作的矩阵。因此,如果我有一个矩阵是“translate(1, 2, 3), rotate(45deg)”,将其应用于一个点会应用这些操作,而应用它的逆矩阵将“撤销”或“反转”这些操作。 - jpfx1342
1个回答

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;

}


好的,正如我所说,我希望这是一次学习经历。 - jpfx1342
这非常有用。我简直不敢相信我以前从未发现过它。我在维基百科和谷歌上搜了几个小时,也没有找到它。我还听说变换矩阵很少是奇异的,所以这应该很好用。我仍然会包括一个行列式检查来确保鲁棒性,但我很感激这个。 - jpfx1342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接