12 模型、视图矩阵
模型矩阵¶
对模型进行偏移的矩阵。
视图矩阵¶
在现实世界中,山是不变的,如果你要看到山的后面,你就要爬到山的后面进行观看。也就是说,物体(山)不动,摄像机(你的眼睛)移动。
但是,在OpenGL的世界中,是相反的。举个例子,你坐在电脑面前一动不动,你适当操作鼠标就可以看到山的后面。实际上,摄像机(你的眼睛)没有移动,而物体(电脑里的山)移动了。
因此,在OpenGL中,实际上也是没有摄像机这个概念的,你每次操作鼠标,我们都是对顶点位置进行变换的。
而模拟摄像机移动时,对顶点做变换的矩阵,就被称为视图矩阵。
代码¶
int main()
{
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
//...
{
//顶点数据
float positions[] = {
//顶点位置xy, UV坐标xy
100.0f, 100.0f, 0.0f, 0.0f, // 0
200.0f, 100.0f, 1.0f, 0.0f, // 1
200.0f, 200.0f, 1.0f, 1.0f, // 2
100.0f, 200.0f, 0.0f, 1.0f // 3
};
//...
/* glm::ortho 正交矩阵 */
/* 这里应该是 960x720 而不是 960x540 的分辨率 */
glm::mat4 proj = glm::ortho(0.0f, 960.0f, 0.0f, 720.0f, -1.0f, 1.0f);
/* 相机位置 视图矩阵 x&y&z */
glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(-100, 0, 0)); //向左移动100
/* 模型矩阵 对象位置 */
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(200, 200, 0)); //将模型向右移动200,向上移动200
glm::mat4 mvp = proj * view * model; //在OpenGL中,是 矩阵 * 向量。因此顺序是:向量 = 投影矩阵 * 视图矩阵 * 模型矩阵 * 向量
Shader shader("res/shaders/Basic.shader");
shader.Bind();
shader.SetUniform4f("u_Color", 0.2f, 0.3f, 0.8f, 1.0f);
shader.SetUniformMat4f("u_MVP", mvp);
//...
}
//...
}