OpenGL有六种坐标:
物体或模型坐标系(Object or Model Coordinates)
世界坐标系(World Coordinates)
眼坐标或相机坐标(Eye (or Camera) Coordinates)
裁剪坐标系(Clip Coordinates)
标准设备坐标系(Normalized Devices Coordinates)
屏幕坐标系(Window (or Screen) Coordinates)
备注 :除了以上坐标系,还有一个假想坐标系——纹理坐标系,这个坐标系不存在的,其实是一系列矩阵变换的结果,比如它能使顶点从物体或模型坐标变换到世界坐标系
从 Object Coordinates 到 World Coordinates 再到Camera Coordinates的变换,在OpenGL中统一称为model-View转换,初始化的时候,Object Coordinates 和 World Coordinates 还有Camera Coordinates坐标重合在原点,变换矩阵都为Identity,所以在OpenGL中用glLoadIdentity() 初始化变换矩阵栈。model-view matrix 转换points, vectors到camera坐标系
OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区(Viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。
常用到的集中坐标系:
世界坐标、物体坐标、设备坐标、眼坐标、纹理坐标
世界坐标系:
是针对OpenGL来说明的,即三维坐标系x,y,z
右手笛卡尔坐标系,水平向右为x轴,向上为y轴,屏幕向外为z轴
OpenGL提供了 glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。
坐标变换矩阵栈(ModelView)
用来存储一系列的变换矩阵,栈顶就是当前坐标的变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。
VertexData —>(Object Coordinates)—>ModelViewMatrix —>(Eye Coordinates)—> ProjectionMatrix —>(Clip Coordinates)—>Divide by w —>(Normalized Device Coordinates)—>ViewportTransform—>WindowCoordinates—>
纹理坐标系
纹理是图片,视频等格式的一种渲染方式,图片只有通过纹理才能加载到GLES中
因此纹理坐标系是图片,视频等在手机屏幕上的坐标系,即U,V也有叫ST的。
应用初始化时,UV坐标与三维坐标系重合,可以选择绘制的模式,绘制模式包括点,线,面,且都是坐标集合里进行顺序绘制的。
物体坐标系
物体坐标系是以物体的某一个点为原点来建立的三维坐标系(世界坐标系)。仅针对该物体。物体放到场景中时,各部分经历的坐标变换矩阵相同,相对位置不变,所以可视为一个整体
眼坐标系或相机坐标系
以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。
裁剪坐标系
由眼坐标可知,OpenGL管道首先会将目标从世界坐标变换到眼坐标,然后对视线范围外的部分进行裁剪。
裁剪过程中用到投影变换矩阵栈(ProjectionMatrix),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标
我们上面说到了ModelViewMatrix 与ProjectionMatrix两个矩阵栈,那矩阵栈是怎么切换的呢?
用函数:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。
紧接着glMatrixMode()就是初始化矩阵,我们在上面也讲到,所有矩阵都为Identity,所以用方法glLoadIdentity()初始化矩阵。