2012-10-11 81 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/