Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114399
  • 博文数量: 83
  • 博客积分: 2531
  • 博客等级: 少校
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-31 20:40
文章分类

全部博文(83)

文章存档

2011年(7)

2010年(76)

我的朋友

分类:

2010-05-17 10:38:06

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

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

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/longge7685/archive/2010/01/31/5274467.aspx

关于模型转换的基础知识

1.模型转换与视点转换: glTranslate{fd}(TYPE x, TYPE y, TYPE z )、      glRotate{fd}( TYPE angle, TYPE x, TYPE y, TYPE z )、
     glScale{fd}(TYPE x, TYPE y, TYPE z )
这三个函数分别对模型进行平移,旋转,缩放。我们可以想象一下,视点转换和模型转换可以使用相同的函数进行,比如,在用相机拍摄物体时,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点转换;也可以保持相机的位置不动,将物体移离相机,这就相当于模型转换。
模型转换和视点转换共同构成模型视景矩阵。

2.矩阵堆栈操作:glPushMatrix(),glPopMatrix()
说明,OpenGL中有两个最基本的矩阵,模型视景矩阵和投影矩阵,它们都有相应的矩阵堆栈,这些矩阵的当前值就是在矩阵堆栈中的最顶层元素。对于转换操作,发出转换命令后生成的新的当前矩阵就存储在矩阵堆栈中,因此,我们可以利用矩阵堆栈存储当前值,并在需要的时候将当前值弹出堆栈。
举例来说,我们现在需要绘制一个自行车,设置自行车的两个轮子相对于坐标原点是对称的。我们可以这样绘制:将坐标系原点移动到前车轮中心,然后进行绘制,完成后,计算前车轮中心到后车轮中心的距离,并将坐标系原点移动到后车轮中心,再绘制后车轮。显然,这种绘制顺序是不科学的,如果需要绘制更多的对称物体,那么这种计算量会非常大,而且容易产生错误。
这种问题,我们使用矩阵堆栈可以很容易得到解决。在绘制前车轮之前,将当前矩阵保存在矩阵堆栈中,然后将坐标原点移动到前车轮中心,绘制前车轮,绘制结束后,将保存的当前矩阵弹出矩阵堆栈,这时堆栈顶部的矩阵仍为原坐标系,下一步只需相对于原坐标系移动相应距离到后车轮进行绘制,这样,所有物体的位置都是相对于原坐标系进行设置,程序计算量得到缩减,而且不容易出错误。

阅读(6607) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~