2016-07-17 43 views
0

對於上下文,我一直在學習OpenGL,並進行了透視投影。花了一個小時試圖弄清楚爲什麼我的三角金字塔沒有顯示出來,直到我注意到我的一個矩陣乘法(用glm :: mat4中的operator *執行)給了我不正確的結果。試圖用相同的值乘以兩個矩陣,在這種情況之外,果然,結果仍然不正確。glm :: mat4 * glm :: mat4產生不正確的結果?

兩個矩陣我試圖乘爲:

glm::mat4 left, right; 
left[0][0] = 2.09928f; left[0][1] = 0.0f; left[0][2] = 0.0f; left[0][3] = 0.0f; 
left[1][0] = 0.0f; left[1][1] = 3.73205f; left[1][2] = 0.0f; left[1][3] = 0.0f; 
left[2][0] = 0.0f; left[2][1] = 0.0f; left[2][2] = 1.0202f; left[2][3] = -2.0202f; 
left[3][0] = 0.0f; left[3][1] = 0.0f; left[3][2] = 1.0f; left[3][3] = 0.0f; 

right[0][0] = 0.999998f; right[0][1] = 0.0f; right[0][2] = -0.00174533f; right[0][3] = 0.0f; 
right[1][0] = 0.0f; right[1][1] = 1.0f; right[1][2] = 0.0f; right[1][3] = 0.0f; 
right[2][0] = 0.00174533f; right[2][1] = 0.0f; right[2][2] = 0.999998f; right[2][3] = 5.0f; 
right[3][0] = 0.0f; right[3][1] = 0.0f; right[3][2] = 0.0f; right[3][3] = 1.0f; 

使用left * right,我得到:

 2.09928,  0, -0.00178059, 0.00352592 
      0, 3.73205,   0,   0 
    0.00366393,  0,  6.0202, -2.0202 
      0,  0,   1,   0 

這是不正確。在另一方面,與此乘算法:

inline glm::mat4 Multiply(const glm::mat4& left, const glm::mat4 right) 
{ 
    glm::mat4 ret; 

    for (unsigned int i = 0; i < 4; i++) { 
     for (unsigned int j = 0; j < 4; j++) { 
      ret[i][j] = left[i][0] * right[0][j] + 
       left[i][1] * right[1][j] + 
       left[i][2] * right[2][j] + 
       left[i][3] * right[3][j]; 
     } 
    } 

    return ret; 
} 

我得到:

 2.09928,  0, -0.00366393,  0 
      0, 3.73205,   0,  0 
    0.00178059,  0,  1.0202,3.08081 
    0.00174533,  0, 0.999998,  5 

這是正確的。

那麼,我在這裏做錯了什麼?

提前致謝!

回答

2
 ret[i][j] = left[i][0] * right[0][j] + 
      left[i][1] * right[1][j] + 
      left[i][2] * right[2][j] + 
      left[i][3] * right[3][j]; 

GLM使用列主矩陣。因此,left[0]是第一列。你正在做lhs矩陣的列和rhs矩陣的行之間的一個點積。這是倒退;它是行*列。

你可能做錯了什麼是錯誤地建立你的矩陣,以行爲主流的方式。

+0

你說得對。我完全錯過了他們網站上他們指定的那一行。 我不假設有一種方法可以告訴GLM我想爲特定的乘法使用行主矩陣,是嗎? – Haraven