笛卡尔坐标系: 咱们的极点运用的是标准化的笛卡尔坐标,X、Y、Z轴都是(-1,1)的范围,映射到屏幕上便是viewport视口的中心点是原点,2D视口的左上、左下、右上、右下分别是(-1,1,0)、(-1,-1,0)、(1,1,0)、(1、-1,0),

只考虑2D的情况下咱们制作一个三角形时,它的表现如下:

极点数组

坐标系、投影矩阵与变换

坐标系、投影矩阵与变换

纹路坐标系: 每一个极点都对应一个纹路坐标以确定怎样从纹路中读取色彩数据,纹路坐标是以它的左下角为原点的,右上角为(1,1)的标准化笛卡尔坐标系。

坐标系、投影矩阵与变换

上面这个极点坐标和纹路坐标终究展现的是一张完好的纹路图片在屏幕的正中央,长宽都为viewport的一半。

观察空间(略,还未具体研讨过,只知道能够通过改变观察矩阵,转化视角,类似于人转动头导致看到的东西不一样了)

裁剪空间(投影矩阵): 在一个极点着色器运行的终究,OpenGL期望一切的坐标都能落在一个特定的范围内,且任何在这个范围之外的点都应该被裁剪掉(Clipped)。被裁剪掉的坐标就会被忽略,所以剩余的坐标就将变为屏幕上可见的片段。这也便是裁剪空间(Clip Space)姓名的由来。

由于将一切可见的坐标都指定在-1.0到1.0的范围内不是很直观,所以咱们会指定自己的坐标集(Coordinate Set)并将它改换回标准化设备坐标系,就像OpenGL期望的那样。

浅显地讲,意思便是opengl在视口映射的是一个标准化的正方体空间,只有一切坐标值(x、y、z的值)在-1到1之间的内容才会被烘托出来(可见),这与咱们设备(屏幕)坐标系存在一个转化联系,咱们为了方便转化,所以界说了投影矩阵去处理这2者之间的映射联系。

●正交投影和透视投影矩阵

正交投影:

坐标系、投影矩阵与变换

正交投影所观察到的物体不会由于远近而出现不同的大小,所以它一般适合做纯2D的东西。

创建一个正交投影: letorthMatrix =GLKMatrix4MakeOrtho(0, viewportSize.x, viewportSize.y,0, -1.0,1.0)

viewportSize即你设置的viewport的size,参数也很明了:

这样,你假如想制作一个在viewport上position为(100,100)的物体时,只需要在极点着色器中用输出的位置坐标乘以这个正交投影矩阵即可正确制作出物体。

坐标系、投影矩阵与变换

透视投影: 假如你曾经体会过实际生活给你带来的景象,你就会留意到离你越远的东西看起来更小。这个古怪的作用称之为透视(Perspective)

坐标系、投影矩阵与变换

在GLKit中咱们能够创建一个透视投影矩阵:

坐标系、投影矩阵与变换

参数

视界视点

●viewport的aspect

●near的z轴坐标

●far的z轴坐标

物体改换的组合与矩阵:

咱们为上述的每一个过程都创建了一个改换矩阵:模型矩阵、观察矩阵和投影矩阵。

留意矩阵运算的顺序是相反的(记住咱们需要从右往左阅览矩阵的乘法)。

留意:物体的运动改换顺序应该遵从先缩放、后旋转、再平移,为什么,有一篇博文写的比较具体:为什么要先缩放再旋转终究平移

坐标系、投影矩阵与变换

终究gl_position = M(projection) * M(translation)*M(rotation)M(scale) vec4(vertex)

这便是物体的改换。