GLM中的模型矩阵

Model matrix in GLM

本文关键字:模型 GLM      更新时间:2023-10-16

我从自己的矩阵/向量运算迁移到GLM,但我一件事都不懂。

OpenGL-中的模型矩阵model_matrix=scale_matrix*旋转矩阵*平移矩阵,因此我们首先平移,然后旋转,最后缩放。但我试图在GLM中这样做,只有当我使用乘法的逆序(平移*旋转*缩放)时,它才会在正确的位置显示quad,但它对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); 
} 

所以我们首先平移,然后旋转,最后缩放。

。。。恰恰相反。

你的"完整"矩阵看起来是这样的(为了简单起见,把旋转放在一边):

proj * view * translate * scale

,对吧?这是正确的:这意味着你的点X将以这种方式转换:

proj * view * translate * scale * X

,这意味着您将首先应用缩放,然后应用平移,然后应用相对于摄影机的定位,然后应用投影。这是完美的。

你的问题似乎是"翻译前量表"之类的东西。想象一下,在X轴上平移10,比例为2。你把你的矩阵应用到,比如说一艘船上。

  • 你缩放你的船。你现在有一艘大船,但仍在原点
  • 你翻译你的船。它现在仍然很大,但有10个单位的起源

如果你做相反的事情:

  • 你翻译你的船。它的中心现在位于原点的10个单位
  • 你可以按比例缩放你的船。每个坐标都乘以相对于原点的2,这是遥远的。。。所以你最终得到了一艘大船,但以2*10=20为中心。这是你不想要的

这有意义吗?

(来源:opengl tutorial.org/初学者教程/tutorial-3-矩阵/)