2012-10-03 44 views
4

我正在研究Java中的OpenGL项目,它已经到了我想在自己的代码中创建转换矩阵的位置,所以我可以使用它们来做世界屏幕点转换,反之亦然。我创建了一个支持转换的Matrix类,这一切都非常好。但是,我实际上很难找出如何创建逆变换。如何创建逆转换矩阵

所以我的问题是这样的:

  • 给定任意仿射(4×4)变换矩阵,你如何创建逆变换矩阵?有些矩阵是不可逆的?颠倒变换矩阵有什么限制和注意事项?

从我的研究中,我已经听说过这样做的各种方法,最简单的是转置然后否定矩阵。但是,这似乎并不实际。我听说这种方法在某些矩阵上不起作用,甚至有些矩阵是不可逆的。

我在寻找的不仅仅是一个“插入这个方程式”的答案,因为我实际上想知道当我倒置一个矩阵时发生了什么。这也不包括“只使用这个库”的答案。我将来可能会转向矩阵库,但现在我想自己创建它。

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

编辑:显然有用于计算逆策略整个列表矩阵这里:http://en.wikipedia.org/wiki/Invertible_matrix

+2

你是不是想打破它回落到缩放,旋转,平移组件?我不认为有这样一个数学上完美的方法,但有技术拉出“合理”的组件 – nielsbot

+1

不,据我了解,转换矩阵的逆矩阵是“反转”它的矩阵操作。所以如果我有一个矩阵是“平移(1,2,3),旋转(45度)”,将它应用到一个点将会应用这些操作,而应用它的逆会“撤消”或“反向”这些操作。 – jpfx1342

回答

2

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

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; 

}

+0

没问题,就像我说的,我希望这是一次学习体验。 – jpfx1342

+0

这非常有用。我无法相信我从未发现过这一点。我在维基百科和谷歌上搜寻了几个小时,却从未发现它。我也听说过转换矩阵很少单一,所以这应该很好地工作。我仍然会包含一个稳健性的行列式检查,但我很欣赏这一点。 – jpfx1342

+0

不错的答案Apurv! –