GLM 中的模型矩阵

Posted

技术标签:

【中文标题】GLM 中的模型矩阵【英文标题】:Model matrix in GLM 【发布时间】:2012-10-11 11:22:45 【问题描述】:

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

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

【问题讨论】:

"OpenGL 中的模型矩阵 - model_matrix = scale_matrix * rotate_matrix * translate_matrix" 谁说的?您是在谈论 glRotate/Scale/Translate 函数的作用吗?还是你在说别的? 嗯,不是吗?如果我们 translateX(5) * scaleX(2.0) 我们将坐标系统 x 缩放到 2.0 然后移动到 10 而不是 5 个单位,因为如果我们 scaleX(2.0) * translateX(5) 然后我们移动到 5 个单位然后缩放坐标系统,顺序很重要,不是吗? 【参考方案1】:

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

...嗯,恰恰相反。

您的“完整”矩阵如下所示(为简单起见,将旋转放在一边):

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/)

【讨论】:

以上是关于GLM 中的模型矩阵的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型分类预测器(分类变量)被自动替换为一组虚拟编码变量summary函数查看检查模型使用table函数计算混淆矩阵评估分类模型性能

GLM 中的矩阵除法

GLM 视图矩阵导致模型矩阵无效

3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法

使用 glm 根据光标位置旋转模型视图矩阵

有没有办法从glm中的视图矩阵中提取变换矩阵?