2012-06-06 134 views
-2
void inverse44(
double *inverse, 
double *matrix 
) 
{ 
double trans[3], trans_xf[3]; 
MTX3_t matrix3; 

inverse[0] = matrix[0]; 
inverse[1] = matrix[4]; 
inverse[2] = matrix[8]; 
inverse[4] = matrix[1]; 
inverse[5] = matrix[5]; 
inverse[6] = matrix[9]; 
inverse[8] = matrix[2]; 
inverse[9] = matrix[6]; 
inverse[10] = matrix[10]; 
inverse[15] = 1.0; 
inverse[12] = inverse[13] = inverse[14] = 0.0; 

trans[0] = matrix[3]; 
trans[1] = matrix[7]; 
trans[2] = matrix[11]; 

MTX4_mtx3(MTX4_cast_pc(matrix),&matrix3); 
MTX3_vec_multiply_t(VEC3_cast_pc(trans),&matrix3,VEC3_cast(trans_xf)); 
inverse[3] = -trans_xf[0]; 
inverse[7] = -trans_xf[1]; 
inverse[11] = -trans_xf[2]; 
} 

這是什麼功能呢?它是否真的逆轉換矩陣?

MTX3_t是3×3矩陣的定義。 MTX4_mtx3獲取子矩陣。 MTX3_vec_multiply_t乘以一個向量和一個矩陣。

+4

你知道你可以自己檢查這個,對嗎? – Bart

+0

沒有一些數學背景我不認爲它是非常很容易檢查這個,我的意思是你可以看到它是否適用於單個案例,或者甚至是很多,但這並不能證明這是一個有效的方法.. – jcoder

回答

2

是。請參閱this link來計算變換矩陣的逆。其基本思想是變換矩陣(第一個3x3子矩陣)的縮放/旋轉組合是一個正交矩陣,而正交矩陣的逆矩陣等於轉置矩陣。所以,第一部分是轉置計算。第二部分(從行trans [0] = matrix [3]開始)是翻譯部分(矩陣的最後一列)的逆的計算

+0

非常感謝,我將花更多的時間來研究它 – JeromeCui

0

這將倒置變換矩陣只有是旋轉和平移的組合,如果變換矩陣還包含縮放或透視投影,它將無法正常工作。

+0

一想的情況下,第一個3×3子矩陣不應該是一個正交矩陣。所以肯定這是錯誤的。 – JeromeCui

+0

*只有* 3x3子矩陣爲正交矩陣且其第四行爲[[0 0 0 1]'的變換矩陣將被您的函數正確反轉 - 其他變換矩陣不會。 – comingstorm