2016-07-17 10 views
0

文脈については、私はOpenGLを学んでおり、遠近法の予測を得ました。私の行列乗算(glm :: mat4の演算子*を使って実行)の1つに気付かれるまで、私の三角ピラミッドがなぜ正しく表示されていないのかを確かめようとしていました。その文脈の外で同じ値を持つ2つの行列を乗算しようとしましたが、確かに結果は正しくありませんでした。私がされた乗算しようとした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

関連する問題