产生目标场景的过程类似于用照相机进行拍照:
(1)把照相机固定在三角架上,并让他对准场景
从不同位置观察场景(视图变换)
(2)对场景进行安排,使各个物体在照片中的位置是我们所希望的
移动,旋转或者放大缩小场景中的物体(模型变换)
(3)选择照相机镜头,并调整放大倍数(调焦)
显示物体时,可以选择物体是如何投影到屏幕上(投影变换)
(4)确定照片的大小,放大照片还是缩小照片
把图形画下来,是要占据整个屏幕还是屏幕的一部分(视口变换)
三大变换:(都是通过操作矩阵来实现的)
1、模型视图变换
在进行模型视图变换之前,应先设置当前操作的矩阵为"模型视图矩阵",通过设置glMatrixMode( GL_MODELVIEW),在进行变换
之前把当前矩阵设置为单位矩阵glLoadIdentity();如果不进行单位化,所有的后续操作都是在当前矩阵的前提下进行的。
2、投影变换
投影变换即定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上(从现在起,坐标不在是-1.0到1.0了)
OpenGL支持两种投影,透视投影和正投影,通过设置glMatrixMode( GL_PROJECTION )来操作投影矩阵。
透视投影的主要函数
1、glFrustum()
2、glPerspective( GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far)
创建一个表示对称透视视图平截头体的矩阵,并把它与当前矩阵相乘。fovy是YZ平面上视野的角度,范围【0,180】。aspect是这个平截头体的纵横比,也就是宽度除于高度。near和far值分别是观察点与近侧裁剪平面以及远侧裁剪平面的距离(沿Z轴负方向)这两个值都是正的。
正投影的主要函数
1、glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)
创建一个平行视景体(就是一个长方体空间区域)。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。注意,near和far都是正值。只有在视景体里的物体才能显示出来,我感觉你最后两个参数取得有点问题,而且你改成0,0后,视景体深度没有了,整个视景体都被压成个平面了,当然就显示不正确了。
2、glOrtho2D( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)
创建一个表示把二维坐标投影到屏幕上的矩阵,并把当前矩阵与它相乘,裁剪区域为矩形。
把像素绘制到屏幕上glViewport()定义视口,前两个参数最左下方,后两个参数宽度和高度。
3、视口变换
在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。
glViewport( Glint x, Glint y, GLsizei width, GLsizei height );XY指定了视口的左下角,WH指定了视口的高度和宽度。在默认情况下,视口的初始值是(0,0,winwidth,winheight)。
视口的纵横比一般和视景体的纵横比相同。当窗口的大小发生变化时,并不会自动影响视口,应用程序应该检测窗口大小改变事件。