坐标系统
有5个不同的坐标系统比较重要:
局部坐标(Local Coordinates):局部坐标是物体自身的坐标系统,相对于物体自身的原点。
世界坐标(World Coordinates):世界坐标是指物体在整个场景中的位置和定位。这是一个全局坐标系统,描述了物体相对于整个场景的位置。
观察坐标(View Coordinates):也称为相机坐标或视图坐标,是指将物体从世界坐标系转换到相机坐标系的坐标系统。
裁剪坐标(Clip Coordinates):裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。
屏幕坐标(Screen Coordinates):裁剪坐标通过视口变换映射到屏幕坐标,即glViewport函数所定义的坐标范围内。屏幕坐标描述了在屏幕上实际呈现的位置。
模型矩阵
局部坐标通过模型矩阵(Model Matrix)变换为世界坐标。模型矩阵是一种变换矩阵,它能通过对物体进行位移、缩放、旋转来将它置于它本应该在的位置或朝向。
观察矩阵
观察坐标就是将世界空间坐标转化为用户视野前方的坐标。这通常是由一系列的位移和旋转的组合来完成,它们通常存储在一个观察矩阵(View Matrix)中。
投影矩阵
将观察坐标变换为裁剪坐标有两种投影矩阵:正射投影矩阵(Orthographic Projection Matrix)和透视投影矩阵(Perspective Projection Matrix)。
正射投影矩阵定义了一个裁剪空间,在这空间之外的顶点都会被裁剪掉。创建一个正射投影矩阵需要指定可见空间的宽、高和长度,其中长度由远近两个平面确定。
我们使用函数glm::ortho()创建一个正射投影矩阵。

前两个参数指定了空间的左右坐标,第三和第四参数指定了底部和顶部,最后两个参数则定义了近平面和远平面的距离。
我们使用函数glm::perspective()创建一个透视投影矩阵。

fov:视野(Field of View),通常以弧度为单位。
aspect:屏幕的宽高比(宽度除以高度)。
near:近裁剪平面的距离。
far:远裁剪平面的距离。
3D化
一个顶点坐标将会根据以下过程被变换到裁剪坐标:

首先,需要创建一个模型矩阵。

这个矩阵让平面绕x轴旋转,使其看起来像一个水平面。
接下来是观察矩阵。
注意:OpenGL中是右手坐标系,垂直于屏幕向外是正z轴方向。

这个矩阵让观察视角在场景中稍向后退。
最后是投影矩阵。

下一步就是把矩阵传入着色器。
声明uniform变量:

发送矩阵数据:

最终效果如下:
