概括:openGL是一个三维的图形库,我们调用openGL的API在三维当中绘制图形以及对其进行相应的控制,如平移、旋转等,openGL根据综合的因素对我们绘制的图形进行处理并显示在屏幕上。
一、坐标系统
1.1、任何的几何图形无论是三维的还是二维的都是由点组成的,而我们描述点就是描述其坐标,描述坐标就必须有参考位置也就死坐标系,openGL中采用的三维直角笛卡尔坐标系。简单的说就是x y z轴相互垂直的坐标系统。
1.2、在openGL中坐标系和点的坐标值都是用矩阵表示的。
1.2.1、直角笛卡尔坐标系用如下的矩阵表示
[1,0,0] ->表示x轴
[0,1,0] ->表示y轴
[0,0,1] ->表示z轴
矩阵中的每一行代表一个向量,而这些向量的几何就表示了坐标系。
1.2.2、点的坐标如下表示
[x1 x2]
[y1 y2]
[z1 z3]
注意x y z的位置,矩阵中每一列表示一个点坐标,点的维度(矩阵的列数)必须和坐标系的行数相同,为什么要相同?因为只有相同了,矩阵之间的乘法才有意义,
矩阵的乘法的意义就是几何转换的意义,下面再讲。
二、几何转换
2.1、旋转和缩放可以通过矩阵相乘来实现,而平移可以通过矩阵相加来实现,openGL为了实现两者的统一就是所有的几何变换都是通过矩阵相乘来实现,所以对坐标系和点的矩阵进行了修改,表示如下:
2.1.1、openGL坐标系表示
[1,0,0,0] ->表示x轴,最后一个值可以设定平移
[0,1,0,0] ->表示y轴,最后一个值可以设定平移
[0,0,1,0] ->表示z轴,最后一个值可以设定平移
[0,0,0,1]
2.2.2、openGL点的表示
[x1,x2]
[y1,y2]
[z1,z2]
[1 ,1]->本来是凑数的,呵呵,满足矩阵运算,但是openGL赋予了最后一个坐标值意义,就是整体的缩放。
2.2.3、几何变换就是点相对于坐标系的位置改变了,在openGL中当发生几何变换,就是通过把各个点的矩阵和变换矩阵相乘来实现。
三、模型视图与投影视图
3.1、模型视图可以理解为描述几何图形的视图,当我们对几何图形进行变换时,实际上是对模型视图矩阵进行相应的乘法操作,也就是说经过变换以后我们得到了一个相对于一个坐标系统的一系列点坐标(点矩阵)。
3.2、投影视图是把由模型视图得来的点坐标映射到屏幕上,这里有正投影和透视投影两种方式,正投影就是从z轴的正方向垂直往往负方向投影,而透视投影可以任意选择角度和方向对几何图形进行观察。
3.3、最后我们还要设置窗口的剪裁特性,openGL根据以上的设置完成了几何图形的显示。
四、openGL几何转换相关函数举例说明。
4.1、glViewport
这个函数设置窗口中的哪一块区域用于几何对象的投影,下面举例说明。
#include <gl/glut.h>
void reshape(int w,int h);
float mymatrix[16]={1,0,0,0,0,1,0,0,0,0,1,0,20,0,0,1};
void draw_graph(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,1,0);
glRecti(-50,50,50,-50); //在xy平面的中心画一个填充矩形
glFlush();
}
void reshape(int w,int h) {
glViewport(0,0,400,400);//窗口的宽度和高度是不包含标题栏的
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-200,200,-200,200,200,-200);
}
void frame_init(void) {
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(400,400);
glutCreateWindow("Learning openGL");
glutDisplayFunc(draw_graph);
glutReshapeFunc(reshape);
glClearColor(1.0,1.0,1.0,1.0);
}
int main(void) {
frame_init();
glutMainLoop();
return 0;
}
上面的程序由于glViewport把投影区设置为和窗口一致,所以我们看到一个绿色的矩形投影到了窗口的正中央,效果如下:
如果把glViewport语句改成glViewport(0,0,200,200);则矩形被投影到了左下角的四分之一的正方形的中央,效果如下:
注意glViewport的参数的意义依次是 x,y,width,height
4.2、glMatrixMode
上文提到,几何变换就是对矩阵的乘法计算,在模型视图转换就是对模型视图矩阵计算,在投影设置的时候就是对投影矩阵进行计算。这个函数的意义就是声明现在要对那个矩阵进行转换了。
4.2.1、glMatrixMode(GL_PROJECTION);
声明对投影矩阵进行操作,能对投影矩阵产生影响的函数有。
正交投影:
glOrtho(-200,200,-200,200,200,-200); 设置正交投影,并设置3d画布范围。
gluOrtho2D(-200,200,-200,200);设置正交投影,并设置2d画布的范围,此时z轴坐标一直是0。
透视投影:
透视投影能从任意角度和方向观察几何图形,而且透视投影的另外最重要的特点是举例观察点远的物体投影到屏幕上时会相对较小。
gluPerspective(fovy,w/h,near,far)如下图
注意此函数的观察方向依然是z轴的负方向。
gluLookAt(观察者坐标,观察目标坐标,观察者上方向坐标),改变的是模型视图矩阵。
可以有比较高级的openGL模型视图转换函数,glTranslatef,glRotatef等。
矩阵可以进行压栈出栈的操作。