文章目录
一、前言
用于图形应用的通用软件包称为计算机图形应用变成接口,它提供可以在C++等程序设计语言中用来创建图形的函数库。
创建图形分为两步:
- 1、创建显示场景;
- 2、在显示场景中创建图元;
二、坐标系统
为了描述图形,必须首先确定一个称为世界坐标系的合适的二维或三维笛卡尔坐标系。
接着通过给出世界坐标系中的位置等集合描述来定义图形中的对象,例如,通过两个端点定义一条直线段,通过一组顶点位置定义一个多边形。
坐标范围:对象坐标x、y、z的最小值和最大值,对于三维图形又叫包围盒,对于二维图形又叫包围矩形;
通过将场景信息传送给观察函数、由观察函数识别可见面、将对象映射到视频监视器上来实现对象的显示。
扫描转换过程将颜色值等场景信息保存到帧缓存的相应位置,从而在输出设备上显示场景中的对象。
2.1、屏幕坐标
视频监视器上的位置使用与帧缓存中的像素位置相对应的整数屏幕坐标进行描述。像素的坐标值给出扫描行号(y值)和列号(扫描行的x值)。
屏幕刷新等硬件处理一般从屏幕的左上角开始对像素进行编址:从屏幕最上面的0行到屏幕最下面的某整数值ymax行对扫描行进行编号;每一行中像素位置从左到右、从最左边的0列到最右边的某整数值xmax列进行编号;
但是,使用软件命令可以按照任何方式设定屏幕位置的参考坐标。例如,我们可以设定屏幕区域左下角为原点,用整数坐标(如图4.1)或非整数笛卡尔坐标来描述图形。描述场景几何要素的坐标值由观察函数转换为帧缓存中的整数像素位置。
图元的扫描转换算法使用定义的坐标描述来确定要显示的像素的位置。例如,给定一直线端的两个端点,其显示函数必须计算出两端点间位于线段上所有像素的位置。一旦确定了一个对象的像素位置,必须将合适的颜色值存入帧缓存;
对于二维图形来说,仅需在(x, y)位置指定颜色值;但是对于三维图像来说,屏幕坐标按三维值来存储,第三维表示对象相对于观察位置的深度。在二维场景中,深度值均为0。
三、OpenGL中指定二维世界坐标系统
- OPenGL中的坐标系如上图所示,X坐标轴从左至右、Y坐标轴从下至上、Z坐标轴从里至外;
- OPenGL屏幕中心的坐标值是X和Y轴上的0.0点,一般调用glLoadIdentity()就会将当前点移到屏幕中心;
- 使用glTranslatef(x, y, z)沿着X,Y和Z轴移动,并不是相对于屏幕中心移动,而是相对于当前所在的屏幕位置移动;
我们可以利用gluOrtho2D
命令设定一个二维笛卡尔坐标系,该函数的变量是指定显示图形的x和y坐标范围的四个值。由于gluOrtho2D
函数指定正交投影,因此我们也要确定坐标值放进了OpenGL投影矩阵中。
我们可以将世界坐标范围设定前的投影矩阵定义为一个单位矩阵,这样可保证坐标值不会受以前设置的投影矩阵的影响。使用glLoadIdentity()
函数即可设定投影矩阵为一个单位矩阵。
单位矩阵:对角线上都是1,其余元素皆为0的矩阵
函数原型
函数说明
OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()
命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。
当您调用glLoadIdentity()
之后,您实际上将当前点移到了屏幕中心:类似于一个复位操作
1、X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
2、OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
3、中心左面的坐标值是负值,右面是正值。
移向屏幕顶端是正值,移向屏幕底端是负值。
移入屏幕深处是负值,移出屏幕则是正值。
如图4.2所示,显示窗口被指定为其左下角位于(xmin, ymin)处,右上角位于坐标(xmax, ymax)处:
设置完世界坐标之后,就可以使用gluOrtho2D
语句描述的坐标系统来指定一个或多个要显示的图元了。如果一个图元的坐标范围完全在显示窗口的坐标范围内,则该图元将完整地显示出来;否则,仅仅在显示窗口坐标范围内的图元部分被显示。
同样,在建立图形的几何描述时,所有OpenGL图元的位置必须用gluOrtho2D
函数定义的坐标系统中的绝对坐标给出。