2014-04-20 30 views
0

我通過將它與模型視圖矩陣相乘來轉換矢量。如何得到modelview矩陣的逆矩陣?

glGetDoublev(GL_MODELVIEW_MATRIX, cam); 
newX=cam[0]*tx+cam[1]*ty+cam[2]*tz+cam[3]; 
newY=cam[4]*tx+cam[5]*ty+cam[6]*tz+cam[7]; 
newZ=cam[8]*tx+cam[9]*ty+cam[10]*tz+cam[11]; 

如何獲取逆向變換的模型視圖矩陣的逆?

回答

1

好吧,呃,通過反轉矩陣。這是一個標準的數學過程,你可以在字面上找到關於線性代數的每本教科書。所有的矩陣數學庫都有一個反轉矩陣的函數。 OpenGL不是矩陣數學庫,所以它沒有這個功能。看看像GLM,Eigen或linmath.h的圖書館

+0

我這樣做,但沒有奏效。 :( –

+0

從某種意義上說,你沒有得到正確的倒置矩陣,或者你在使用它的時候沒有得到想要的結果?如果你寫了一個反演算法,或者從某個地方得到了一個,我會一直測試它,並給它一些示例矩陣,並通過檢查單位矩陣中兩個結果的乘積來驗證它是否產生了正確的逆矩陣 –

+0

@ShashiMishra:您可能會被OpenGL(和大多數其他圖形庫)排序他們的矩陣:它們通常按列的主要順序排列,即首先是第一列的元素,然後是第二列的元素,然後大多數人天真地假定行的主要順序,並反轉操作順序 – datenwolf

2

你在發佈的代碼中有什麼不是正確的應用MODELVIEW矩陣的方式。 OpenGL使用矩陣的列主要順序。您的計算需要是這樣的:

newX=cam[0]*tx+cam[4]*ty+cam[8]*tz+cam[12]; 
newY=cam[1]*tx+cam[5]*ty+cam[9]*tz+cam[13]; 
newZ=cam[2]*tx+cam[6]*ty+cam[10]*tz+cam[14]; 

對於逆矩陣,你可以只使用一個通用的矩陣求逆算法,如@datenwolf已經建議。如果您可以對矩陣做出某些假設,則有更簡單和更有效的方法。一個典型的例子是,你知道你的變換矩陣只包含旋轉,平移和縮放。在這種情況下,您可以將這些矩陣拆分爲這些分量,將每個矩陣反轉,然後將它們重新組合到倒置矩陣中。由於旋轉,平移和縮放都是微不足道的,所以可以用非常簡單的數學來完成。

+0

+1注意到,對於MV矩陣來說,逆矩陣的計算通常比一般情況下要簡單一個數量級。 – vaxquis