一、gluOtho2d()
这个函数是定义剪裁面,何谓剪裁面,我这样理解,我们是在一个无限的空间里绘图,因为坐标是 可以随便指定的,随便在哪个坐标绘图,但是我们可以通过定一个剪裁面,也就是说,有一架照相机,尽管沿途风景很多,但是镜头只能拍到一定的范围,这个范围就是我们的剪裁面,我们能显示的就是这个剪裁面。
二、glViewPort()
这个函数跟上面的相似,但是我们发现上面的指定一个剪裁面后,是在我们定义的窗口的整个窗口中显示我们剪裁出来的面,而这个函数就是为了在一部分中显我们要显示的剪裁面,即,我们先取景(就是用gluOrtho2D()剪出来那个),然后在我们定义的窗口中选一个区域来显示这个取好的景。
下面是一个例子:
#include <gl/glut.h>
//不显示控制台窗口#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")
void display(){//glMatrixMode( GL_MODELVIEW );//glLoadIdentity();
glClear( GL_COLOR_BUFFER_BIT );
glColor3f( 1.0, 0.0, 0.0 );//画分割线,分成四个视见区glViewport( 0, 0, 400, 400 );glBegin( GL_LINES ); glVertex2f( -1.0, 0 ); glVertex2f( 1.0, 0 ); glVertex2f( 0.0, -1.0 ); glVertex2f( 0.0, 1.0 ); glEnd();
//定义在左下角的区域glColor3f( 0.0, 1.0, 0.0 );glViewport( 0, 0, 200, 200 );glBegin( GL_POLYGON ); glVertex2f( -0.5, -0.5 ); glVertex2f( -0.5, 0.5 ); glVertex2f( 0.5, 0.5 ); glVertex2f( 0.5, -0.5 );glEnd();
//定义在右上角的区域glColor3f( 0.0, 0.0, 1.0 );glViewport( 200, 200, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标 glBegin( GL_POLYGON ); glVertex2f( -0.5, -0.5 ); glVertex2f( -0.5, 0.5 ); glVertex2f( 0.5, 0.5 ); glVertex2f( 0.5, -0.5 );glEnd();
//定义在左上角的区域glColor3f( 1.0, 0.0, 1.0 );glViewport( 0, 200, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标glBegin( GL_POLYGON );glVertex2f( -0.5, -0.5 );glVertex2f( -0.5, 0.5 );glVertex2f( 0.5, 0.5 );glVertex2f( 0.5, -0.5 );glEnd();
//定义在右下角glColor3f( 1.0, 1.0, 0.0 );glViewport( 200, 0, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标glBegin( GL_POLYGON );glVertex2f( -0.5, -0.5 );glVertex2f( -0.5, 0.5 );glVertex2f( 0.5, 0.5 );glVertex2f( 0.5, -0.5 );glEnd();
glFlush();}
void init(){ glClearColor( 0.0, 0.0, 0.0, 0.0 );glColor3f( 1.0, 1.0, 1.0 );
glMatrixMode( GL_PROJECTION );glLoadIdentity();//定义剪裁面gluOrtho2D( -1.0, 1.0, -1.0, 1.0 );
//glViewport( 0, 0, 200, 200 ); //放在这里不好使}
int main( int argc, char ** argv ){ glutInit( &argc, argv );glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );glutInitWindowPosition( 100, 100 );glutInitWindowSize( 400, 400 );glutCreateWindow( "glViewport()" );glutDisplayFunc( display ); init();glutMainLoop();}
在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho。
glOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum则产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。
glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。这里,我们先抛开glViewport函数不看。先单独理解glOrtho的功能。 假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。 如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。上述三种情况可以见图: