Ari*_*hys 3 c++ opengl glm-math
我从我自己的矩阵/向量操作迁移到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));
...
Run Code Online (Sandbox Code Playgroud)
顶点着色器
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);
}
Run Code Online (Sandbox Code Playgroud)
Cal*_*602 10
所以我们先翻译然后旋转,最后一个比例.
......好吧,恰恰相反.
你的"完整"矩阵看起来像这样(为了简单起见,将旋转放在一边):
proj * view * translate * scale
Run Code Online (Sandbox Code Playgroud)
, 对 ?这是正确的:这意味着您的X点将以这种方式进行转换:
proj * view * translate * scale * X
Run Code Online (Sandbox Code Playgroud)
,这意味着你将首先应用比例,然后翻译,然后相对于相机定位,然后投影.哪个是完美的.
你的问题似乎是"翻译前缩放"的东西.想象一下X轴上的10的平移,比例为2.您可以在船上应用矩阵.
- 你缩放你的船.你现在有一艘大船,但仍然是原产地
- 你翻译你的船.它现在仍然很大,但是在原点的10个单位.
如果你做相反的事情:
- 你翻译你的船.它的中心现在有10个单位
- 你缩放你的船.每个坐标相对于原点乘以2 ,这是很远的...所以你最终得到一艘大船,但是以2*10 = 20为中心.这是你不想要的.
那有意义吗 ?
(来源:opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/)
| 归档时间: |
|
| 查看次数: |
12937 次 |
| 最近记录: |