glHint、gluLookAt、glOrtho、gluPerspective、glViewport

来源:互联网 发布:此谓知本 此谓知之至也 编辑:程序博客网 时间:2024/04/30 05:43

简述:

OpenGL的坐标系:z 的正方向垂直屏幕向外(右坐标系),x 的正方向是水平向右,y 的正方向是竖直向上;窗口坐标系:x 的正方向是水平向右,y 的正方向是竖直向下。

OpenGL 有两种投影:正交投影(垂直投影) 和透视投影。投影从数学角度来说,是比较简单和直观的。正交投影,就是一排平行于观察平面的法线方向的光源,它发出一组平行线,从而不管物体离观察平面的远近,大小都是一样的。而透视投影,类似于有个点光源,它会发出一组相交于一点的光线,从而相同的大小,近的物体投影就大一些,而远一些的物体投影就小一些。



1、glHint ( ) 


用于指定特定于实现提示。

void glHint(GLenum target,GLenum mode)

target ,指定所控制行为的符号常量;mode ,指定所采取行为的符号常量。


target含义GL_FOG_HINT指示雾化计算的精度;如果 OpenGL 实现不能有效地支持每个像素的雾化计算,
则 GL_DONT_CARE 或 GL_FASTEST 雾化效果中每个定点计算GL_LINE_SMOOTH_HINT指示是锯消除行(反走样线段)的采样质量。 如果应用了一个较大的滤波函数,
则 GL_NICEST在光栅化期间可以生产更多的像素段,更多像素碎片。 GL_PERSPECTIVE_CORRECTION_HINT表示颜色和纹理坐标的差值质量。 如果OpenGL不能有效的支持透视修正参数差值,
则 GL_DONT_CARE 或 GL_FASTEST 可以执行颜色或纹理坐标的简单线性插值计算。 GL_POINT_SMOOTH_HINT表示是锯消除点(反走样点)的采样质量。 如果应用了一个较大的滤波函数,
则GL_NICEST在光栅化期间可以生产更多的像素段,,更多像素碎片。 GL_POLYGON_SMOOTH_HINT指示是锯消除多边形(反走样多边形)的采样质量。 如果应用了一个较大的滤波函数,
则 GL_NICEST在光栅化期间可以生产更多的像素段,,更多像素碎片。 


mode含义GL_NICEST选择最高质量的选项GL_FASTEST选择速度最快的选项GL_DONT_CARE对选项不作考虑


2、gluLookAt  ( )


gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

gluLookAt ( )的前三个参数定义了观察点的位置,但同时也定义了投影函数如正交投影函数各个参数的原点。

正交投影指物体和照相机之间的距离并不影响它看上去的大小。

gluLookAt ( ) 共接受三对坐标,分别为eye,center,up 。形象点说,eye 表示我们眼睛在 "世界坐标系" 中的位置,center 表示眼睛 "看"的那个点的坐标,而up 坐标表示观察者本身的方向。


3、glOrtho ( )


用来标记正交空间长方体。设置或修改修剪空间的范围。

glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);


若在程序中有 glOrtho ( -2.0 , 2.0 , -2.0 , 2.0 , 5.0 , 100.0 ); 和  gluLookAt ( 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , -4.0 , 0.0 , 1.0 , 0.0 ) ; 而物体坐标为  ( 0 , 0 , -10 ) 则表示以( 1 , 0 , 0 ) 点为原点定义了一个宽为4高为4长为95的长方体,其左下角绝对坐标为 (1-2 , 0-2 , 0-5 ) = ( -1 , -2 , -5 ) ,物体显示时偏左。


若物体坐标为 ( 0 , 0 , -4 ) ,此时会显示黑屏。因为物体在正交立方体外。


4、 gluPerspective ( )  :透视投影函数


gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);

fovy  : 角度,指定视景体的视野角度,以度数为单位,y 轴的上下方向。形象点说,fovy是眼睛上下睁开的角度,角度所及的范围就是窗口绘制的范围。角度值越小,视野范围越狭小(眯眼),角度值越大,视野范围越开阔。当fovy 为180时,窗口相对物体来说是无限大的,此时窗口上显示的物体则缩为一个点。

aspect : 指定视景体的宽高比(x 平面上)

zNear  : 沿 z 轴方向的两截面之间的距离的近处,指定观察者到视景体的最近的裁剪面的距离(必须为正数)。形象点说,zNear表示近裁面到眼睛的距离。

zFar  :沿 z 轴方向的两截面之间的距离的远处,指定观察者到视景体的最远的裁剪面的距离(必须为正数)。形象点说,zFar表示远裁面到眼睛的距离。

其中,zNear 和 zFar 两个参数也是以观察点为原点的相对坐标。在NeHe的框架中,zNear = 0.1f,zFar = 100.0f,如果想绘制图形的话,需要将坐标轴移入屏幕,zFar > 移入距离 > zNear。




5、 glViewPort ( ) :视口变换函数


用于决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体哪个部位。

视口是一个矩形的窗口区域,三维图像通过映射生成二维平面的像素后,就是在这片区域绘制的。默认情况下,视口被设置为打开窗口的整个像素矩阵。

glViewport(GLint x,GLint y,GLsizei width,GLsizei height);
定义视口在窗口中的区域同时也规定了二维的像素平面到视口区域的映射关系。


把视景体映射到视口

若 glViewPort ( 0 , 0 , w / 2 , h ) ,即有:



也可以利用 glViewPort  ( )  生成多窗口模型:


生成效果如图所示:


1 0
原创粉丝点击