首先解释下图形学中的屏幕,窗口,视见区(视口),裁剪区。
屏幕:即计算机的整个屏幕大小。
窗口:即屏幕中的某一个窗口,可放大放小和移动关闭。
视口:即在窗口中可以见到或可以用来绘图的部分。一般设置视口等于窗口。
裁剪区:即在视口中让你看到的图形,即显示出来的那部分。
GLUT的窗口初始化是在main函数中使用
//初始化窗口位置 //x:距屏幕左边的像素大小 //y:距屏幕顶部的像素大小 extern void APIENTRY glutInitWindowPosition(int x, int y); //初始化窗口的宽度和高度 //width:宽度大小 //height:高度大小 extern void APIENTRY glutInitWindowSize(int width, int height);
视口一般是基于已经定义了的窗口的来定义的。
//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了) //所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。 glViewport(0,0,w,h);
裁剪区的定义:
一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。
GLfloat aspectRatio; glMatrixMode(GL_PROJECTION);//切换为透视投影矩阵 glLoadIdentity(); //将透视投影矩阵转换为单位矩阵 //建立裁剪区域(左右底顶近远) aspectRatio = (GLfloat)w/(GLfloat)h; if(w<=h){ //如果宽度小于高度(aspectRatio < 1) glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); } else { glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0); }
附上一个例子:
#include <GL/glut.h> //绘制场景 void RenderScence(Void) { //用当前颜色清除窗口 glClear(GL_COLOR_BUFFER_BIT); //把绘图颜色设置为红色 glColor3f(1.0f,0.0f,0.0f); //用当前的颜色绘制一个填充矩形 glRectf(-25.0f,25.0f,25.0f,-25.0f); //刷新绘图命令 glFlush(); } //当窗口改变大小时由GLUT函数库调用 void ChangeSize(GLsizei w, GLsizei h) { GLfloat aspectRatio; //防止被0所除 if(h == 0){ h = 1; } //把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了) //所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。 //glViewport(0,0,w,h); glViewport(15,15,w-100,h-100); //重置坐标系统 glMatrixMode(GL_PROJECTION); //切换为透视投影矩阵 glLoadIdentity(); //将透视投影矩阵转换为单位矩阵 //建立裁剪区域(左右底顶近远) aspectRatio = (GLfloat)w/(GLfloat)h; if(w<=h){ //如果宽度小于高度(aspectRatio < 1) //glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); glOrtho(-30.0, 30.0, -30/aspectRatio, 30.0/aspectRatio, 1.0, -1.0); } else { //glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0); glOrtho(-30.0*aspectRatio, 30.0*aspectRatio,-30.0, 30.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW); //切换为平行投影矩阵 glLoadIdentity(); //将平行投影矩阵转换为单位矩阵 } //设置渲染状态 void SetupRC(void) { //设置清除颜色 glClearColor(0.0f, 0.6f, 1.0f, 1.0f); } //主程序入口 int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(100,300); glutInitWindowSize(400,400); glutCreateWindow("coder"); //创建一个窗口 glutDisplayFunc(RenderScence); //注册回调函数 glutReshapeFunc(ChangeSize); SetupRC(); //设置初始化状态(有些状态只需要设置一次) glutMainLoop(); //开始循环运行,显示绘图。 return 0; }