2012-10-03 43 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! –