OpenGL 矩阵变换 复习

今天跟着这篇教程

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

复习了一下矩阵变换。教程本身没有太多数学原理,数学相关的计算 ,使用的是 glm 库。

有几个 和 细节在此总结备忘。


1.

在齐次坐标系中 ,3纬的 position 和 direction 使用 vector4 来表示。最后的 w  = 0 则认为是 方向,w = 1 则认为是 点坐标。

2.

要绘制一个mesh ,比如 最最简单的三角形,先确定 顶点数据。即: 如果此 三角形(mesh) 在原点,它的顶点 是什么样的。

比如一个三角形 ,可能是 由 (-1,-1,0),(1,-1,0),(0,1,0) 这3个点组成的。则 这些相对于模型本身的 顶点位置信息,我们称之为 Model Coordinates, 模型坐标。

顶点位置 需要 最终投射到 相机里,才能显示出来 。此过程需要3步:

(1)Model Coordinates 经过 Model Matrix 矩阵(包含 旋转 平移 缩放信息)作乘法,得到 World Coordinates.这一步 的含义是,把整个模型,摆放到世界坐标的哪个位置 

(2) World Coordates 经过 View Matrix (此矩阵包含 相机位置,相机朝向,相机正上方 信息) 得到 Camera Coordinates 。这一步的含义是 ,把顶点的 世界坐标,转换为 相机内的坐标。

(3) Camera Coordinates 经过 Projection Matrix(此矩阵包含 相机一些属性的信息,以透视投影为例,包含的信息有 fov(纵向),aspect 适口 宽/高 比,zNear 和 zFar ) 得到最终的结果 :Homogeneous Coordinates,齐次坐标。

也就是我们最终要显示的结果。即,顶点在 最终 窗口里显示的位置。

这个过程 是要按照 顺序 一一进行,顺序不可打乱。

但是体现在 矩阵乘法上,这个顺序 是 正好相反的,也就是说,最终的 mvp 矩阵是这样计算出来的 :

glm::mat4 mvp = Projection * View * Model;

最终,顶点的位置, 与 mvp 矩阵做乘法,即可计算出 该顶点 所出现在 屏幕里的坐标:

pResult = mvp x pos

体现在代码里:

c++ 把 顶点的 Model Coordinates 和  mvp 准备好 。

Model Coordinates 参考  之前的 VAO  和 VBO 的总结 ,把 顶点坐标信息 传递到 shader 里面去 

mvp 矩阵按照下面的示例 准备 

    // mvp param to shader

    glm::mat4 modelMatrix = glm::mat4(1.0f);

    glm::mat4 viewMatrix = glm::lookAt(glm::vec3(4,3,3),

                                       glm::vec3(0,0,0),

                                       glm::vec3(0,1,0));

    float fovyAngle = 45;

    float aspectWH = (float)viewportW/(float)viewportH;

    float zNear = 0.1f;

    float zFar = 100.f;

    glm::mat4 projectMatrix = glm::perspective(glm::radians(fovyAngle),aspectWH,zNear,zFar);

    glm::mat4 mvp = projectMatrix * viewMatrix * modelMatrix;

    

    GLuint matrixID = glGetUniformLocation(_programID,"MVP");

    glUniformMatrix4fv(matrixID,1,GL_FALSE,&mvp[0][0]);


之后, 把  mvp 和 model coordinates 传到 vertex shader 里面去。

model coordinates 传递的方法,使用  内存数组 -> vbo -> vao -> shader 的 in 类型 attrib 变量的 方式;

mvp 使用 glUniformMatrix 直接把 C++ 的 矩阵数据,传递到 shader 的 uniform 变量中。

shader 的写法 如下:

#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColor;

out vec3 vColor;
uniform mat4 MVP;

void main(){
    gl_Position = MVP * vec4(vertexPosition_modelspace,1);
    vColor.rgb = vertexColor.rgb;
}


注意 gl_Position 相关的 写法。

MVP  *  vec4. 这个 vec4 是 本身 Model Coordinates ,模型的 顶点坐标。由于顶点坐标是 3维的,并且 是 坐标 (而不是方向),所以  最后 给  vec4 的 w 设置为  1,表示 这是一个点。

把这个结果 给 gl_Position ,就可以确定 模型 顶点  最终 显示的位置了。


重点是 2个概念:

1. 方向的 w = 0, 点 的 w = 1

2. 要理解 mvp 矩阵 各个阶段的含义。

输入是 顶点在模型中的 坐标, 也就是 model coordinates, 是由 vbo vao 写入的.

 model 变换  包括 平移,旋转,缩放。可以把 模型摆放到 世界坐标的任何地方。

view 变换  和   projection 变换矩阵 比较固定 。

注意区分  model coordinates 和 world coordinates 的 概念


匆匆总结,用以备忘.


猜你喜欢

转载自blog.csdn.net/korekara88730/article/details/79332090