OpenGL模型视图变换、投影变换、视口变换

来源:互联网 发布:雀圣软件官方 编辑:程序博客网 时间:2024/05/15 12:24

转自http://blog.csdn.net/longge7685/article/details/5274467

OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕)。

产生目标场景的过程类似于用照相机进行拍照:

(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)。

视口的纵横比一般和视景体的纵横比相同。当窗口的大小发生变化时,并不会自动影响视口,应用程序应该检测窗口大小改变事件。