跳转至

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

        //...
    }

    //...
}