2014-03-01 115 views
0

我知道如何乘以矩陣,但我的麻煩是我不知道,是否需要乘以第四行和第四列,或者他們是非標準的。我的意思是,我只用一個矩陣乘3x3,然後添加第4行和第4列,因爲它會變成矩陣4x4。如何乘以一個矩陣?

如果我有一個矩陣:

float *mat = new float[16]; 
/* 
    0 1 2 3 
    4 5 6 7 
    8 9 10 11 
12 13 14 15 
*/ 

//standart 
mat[12] = mat[13] = mat[14] = mat[3] = mat[7] = mat[11] = 0.0f; 
mat[15] = 1.0f; 

但也有旋轉,縮放和平移的矩陣。它是如何工作的?請,有人能解釋我嗎?同樣,我們有一個正交或透視矩陣(投影矩陣)。 總:

  • 旋轉矩陣
  • 縮放矩陣
  • 平移矩陣
  • 投影矩陣

我們有一個點,例如p[x,y,z]。什麼發生進一步?

+0

如果你需要處理opengl的矩陣,爲什麼不使用[glm](http://glm.g-truc.net/0.9.5/index.html)? – Borgleader

+0

是的,你乘以第四行和第四列,取總和,總和成爲相應的佔位符。我不確定我瞭解其餘的。 –

+0

我使用「Eigen」,glm,但我想學習和自己做這個。 – Ivan

回答

0

您將4x4矩陣乘以矩陣。第四行和列允許齊次座標([x,y,z,w]對應於[x/w,y/w,z/w]),這允許平移表示爲線性變換。爲了將這個變換應用到一個點(x,y,z),用列向量[x,y,z,1]左乘該矩陣。

2

一會兒,我們可以從乘法矩陣退後一步,看看我們如何乘以向量。有兩種普遍適用的矢量產品:內部產品(也稱爲標量產品)和外部產品。 (然後是隻適用於某些向量的交叉產品)。

現在讓我們看看只有內部產品。讓的內積被定義爲第i列(_)與每個矢量的第i行(^)的總和,如果第一操作數是一個行向量

<a,b> = ∑ a_i b^i 

或I第一行,第i列,如果第一操作數是通過翻轉它們的順序

<a,b> = ∑ b_i a^i 

對於實數的順序相反的可能看起來任意的列矢量,但是如果從非看元素的向量-commutative組(和矩陣就是這樣)。

這當然要求一個向量具有與其他向量具有行數一樣多的列。因此,可以說,我們有兩個向量一個b

a = (a1, a2, …, an) 
b = (b1, b2, …, bn) 

顯然,我們不能繁殖那些在產品。但讓我們轉換其中之一,製作一個有效的列T(b)= b_。

<a,b_> = a1 b1 + a2 b2 + … + an bn 

到目前爲止好。

現在我們來看看矩陣乘法。如果你看一個矩陣,你可以看到它作爲一列行向量

(11, 12, …, 1n) 
(21, 22, …, 2n) 
(…1, …2, …, …n) 
(m1, m2, …, mn) 

但是,這只是一個行載體的列矢量!

/ (11, 12, …, 1n) \ 
| (21, 22, …, 2n) | 
| (…1, …2, …, …n) | 
\ (m1, m2, …, mn)/

,或者你可以把它看成列的行向量

/11\ /12\ /1…\ /1n\ 
|21| |22| |2…| |2n| 
|…1| |…2| |……| |…n| 
\m1/ \m2/ \m…/ \mn/ 

,當然這僅僅是列向量的行向量

/ /11\ /12\ /1…\ /1n\ \ 
| |21| |22| |2…| |2n| | 
| |…1| |…2| |……| |…n| | 
\ \m1/ \m2/ \m…/ \mn//

那麼你嘗試發生通過內部產品放置兩個mattes? <A,B> = ?。那麼事實證明,如果A的行數與B的列數一樣多,B的行數與A的列數一樣多,那麼如果將A看作行向量的列,將B看作一列列向量。然後你是如何取A的第i行,並將其內積與B的每個(第j)列相結合,將結果寫在結果矩陣的ij位置。

<A,B>_ij = <A^i,B_j>