2012-10-11 120 views
3

我從我自己的矩陣/矢量操作遷移到GLM,我不明白一件事。GLM中的模型矩陣

OpenGL中的模型矩陣 - model_matrix = scale_matrix * rotate_matrix * translate_matrix,所以我們先翻譯,然後旋轉,並在最後一個比例。 但是,然後我嘗試在GLM中這樣做,它只在我使用乘法的逆順序(translate * rotate * scale)時顯示四捨五入正確的位置,但是對MVP矩陣(投影*視圖*模型)應該如此。

示例代碼

using namespace glm; 
mat4 projection = ortho(0.0f, 1.0f, 0.0f, 1.0f); 
mat4 translate = translate(mat4(1.0f), vec3(0.5f, 0.5f, 0.0f)); 
mat4 rotate = rotate(mat4(1.0f), 90.0f, vec3(0.0f, 0.0f, 1.0f)); 
mat4 scale = scale(mat4(1.0f), vec3(0.5f, 0.5f, 1.0f)); 
mat4 m = translate * scale * rotate;// must be scale * rotate * translate 
mat4 mvp = projection * mat4(1.0f)/*view matrix*/ * m; 
glUseProgram(shader->prog); 
glUniformMatrix4fv(shader->uniforms[0]/*um_mvp*/, 1, GL_FALSE, value_ptr(mvp)); 
... 

頂點着色器

attribute vec3 av_pos; 
attribute vec2 av_tex; 

uniform mat4 um_mvp; 

varying vec2 vv_tex; 

void main() 
{ 
vv_tex = av_tex; 
gl_Position = um_mvp * vec4(av_pos, 1.0); 
} 
+0

「*在OpenGL模型矩陣 - model_matrix = scale_matrix * rotate_matrix * translate_matrix *」 說的是誰?你在談論glRotate/Scale/Translate函數做了什麼?或者你在說別的什麼? –

+1

不是嗎?如果我們翻譯X(5)* scaleX(2。0)我們將coords系統x縮放到2.0,然後移動到10而不是5個單位,因此,如果我們scaleX(2.0)* translateX(5)那麼我們移動到5個單位然後縮放座標系統,順序很重要,不是? – Aristarhys

回答

10

所以我們首先轉換,然後旋轉,最後規模。

......好吧,完全相反。

你 「完整」 的矩陣如下所示(離開旋轉一邊爲簡單起見):

proj * view * translate * scale 

,對不對?嗯,這是正確的:這意味着你點X將被改造是這樣的:

proj * view * translate * scale * X 

,這意味着你將首先應用的規模,然後翻譯,那麼相對於相機投影定位,然後。這是完美的。

你的問題似乎是「翻譯前規模」的東西。想象一下在X軸上的一個10的平移,一個2的刻度。你在你的船上應用你的矩陣。

  • 你縮放你的船。你現在有一艘大船,但仍在原點
  • 你翻譯你的船。它現在仍然很大,但是在原點的10個單位。

如果你反其道而行之:

  • 您翻譯的船。它的中心現在位於原點的10個單位
  • 您可以縮放您的船。每個座標乘以2 相對於原點,這是很遠...所以你最終得到一艘大船, ,但集中在2 * 10 = 20。你不想要的。

這有道理嗎?

(來源:opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/