跳到主要内容

2 篇博文 含有标签「坐标系」

查看所有标签

MVP变换坐标

· 阅读需 2 分钟
苏明才
Vulkan驱动填坑狮

MVP概念

在opengl中,MVP称为模型观察投影矩阵,它是模型(Model)、观察(View)和投影(Projection)矩阵作用在物体上组合作用,用于对物体的坐标系进行变换。

1639300692250

如上图所示,物体的坐标系变化过程为:

  1. 局部坐标系
  2. 世界坐标系
  3. 观察坐标系
  4. 裁剪坐标系

MVP公式

$$ MVP=Mprojection⋅Mview⋅Mmodel$$

在shader中用MVP * gl_Position 得到转换后的坐标。

示例代码

OpenGL纹理中,介绍了纹理的使用方法,最终的运行效果为:

1637478946876

修改vertext shader,添加MVP变量

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
uniform mat4 MVP;

out vec2 TexCoord;

void main()
{
gl_Position = MVP * vec4(aPos, 1.0);
TexCoord = aTexCoord;
}

在绘制之前将MVP矩阵传入着色器:

glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float) width / (float)height, 0.1f, 100.0f);
glm::mat4 view = glm::lookAt(glm::vec3(1,2,3), glm::vec3(0,0,0), glm::vec3(0,1,0));
glm::mat4 model = glm::mat4(1.0f);
glm::mat4 mvp = projection * view * model;

GLuint mvpId = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(mvpId, 1, GL_FALSE, &mvp[0][0]);

现在的运行效果如下:

1639310527486