【发布时间】: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 个单位然后缩放坐标系统,顺序很重要,不是吗?