OpenGL使用的是右手笛卡尔坐标系统,Z正轴垂直屏幕向外,X正轴从左到右,Y正轴从下到上。
OpenGL中存下以下几种坐标系:
1.世界坐标系:世界坐标系以屏幕中心为原点(0, 0, 0),在OpenGL中用来描述场景的坐标。比如使用这个坐标系来描述物体及光源的位置。世界坐标系,是不会被改变的。
2.模型坐标系:模型的绘制时使用的坐标系。当模型发生旋转平移等变化时,模型坐标系本身不会变化,变化的是模型在世界坐标系中的位置。
3.视坐标系:以视点为原点,以视线方向为Z轴正方向的坐标系。OpenGL会将世界坐标系先变换到视坐标系,然后进行裁剪,只有在视见体之内的场景才会进入下一个阶段进行处理。
OpenGL中的矩阵变换:
1.视变换(View Transform):将Camera指向物体,即确定视点位置与观察方向。
void gluLookAt(GLdouble eyex, GLdouble exey, GLdouble eyez, ----视点
GLdouble centrex, GLdouble centrey, GLdouble centrez, ----视线方向:从eye指向centre
GLdouble upx, GLdouble upy, GLdouble upz) ----视平截头自下而上的方向 (右乘当前矩阵)
2.模型变换(Model Transformation):确定模型的位置、方向与缩放信息。我们可以计算出位移矩阵、旋转矩阵和缩放矩阵。(右乘当前矩阵)
3.投影变换(Projection Transformation):产生一个六面体的平截头体,把平截头体以外的场景裁剪掉,把平截头体内的物体、场景作为绘制对象。
两个投影函数:
glFrustum(left, right, bottom, top, near, far)
glOrtho(left, right, bottom, top, near, far)
它们生成ProjectionMatrix,并用该Matrix左乘当前矩阵。
图1. 顶点处理流水线
图1是顶点处理流水线,它展示了,顶点从世界空间位置到屏幕坐标的变化,包括Model与View变换,投影变换,透视变换和Viewport变换。
为了完成这些变换,首先需要进行View,Modeling和Projection变换,这项工作通过构建4x4的矩阵来完成。在顶点处理过程中,View和Modeling变换除了会被用于顶点外,还会被用于normal。这保证了normal相对于顶点之间的关系。当顶点发生变换时,normal会发生同样的变换(仅指View与Modeling变换)。将View与Modeling变换组成ModelViewMatrix,并对进入的对象进行变换,会将其转换到视坐标系。
然后为了将部分场景剔除不予显示,就需要定义平截头体。通过使用Projection矩阵进行变换,会将在平截头内的部分进行绘制。
之后的Perspective division就是用dividing coordinate除以w,以此产生一个normalized device coordinate。
最后,将坐标系通过Viewport变换转成屏幕坐标系。
模型经历各种变换后会被绘制在一个平面的坐标系上,模型的x,y值决定模型会被绘制在哪。而模型的z值同样经历了这些变换后会被作为深度信息进行保留。深度值可以帮助我们删除那些不必绘制的像素,当2个顶点在屏幕上的x,y值相同,但z值不同时。OpenGL可以使用这些信息来确定哪些面被遮挡了,然后就可以不对这些面进行绘制。