首先解释下图形学中的屏幕,窗口,视见区(视口),裁剪区。
屏幕:即计算机的整个屏幕大小。
窗口:即屏幕中的某一个窗口,可放大放小和移动关闭。
视口:即在窗口中可以见到或可以用来绘图的部分。一般设置视口等于窗口。
裁剪区:即在视口中让你看到的图形,即显示出来的那部分。
GLUT的窗口初始化是在main函数中使用
view sourceprint?
1.
//初始化窗口位置
2.
//x:距屏幕左边的像素大小
3.
//y:距屏幕顶部的像素大小
4.
extern
void
APIENTRY glutInitWindowPosition(
int
x,
int
y);
5.
//初始化窗口的宽度和高度
6.
//width:宽度大小
7.
//height:高度大小
8.
extern
void
APIENTRY glutInitWindowSize(
int
width,
int
height);
视口一般是基于已经定义了的窗口的来定义的。
view sourceprint?
1.
//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了)
2.
//所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。
3.
glViewport(0,0,w,h);
裁剪区的定义:
一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。
view sourceprint?
01.
GLfloat aspectRatio;
02.
glMatrixMode(GL_PROJECTION);
//切换为透视投影矩阵
03.
glLoadIdentity();
//将透视投影矩阵转换为单位矩阵
04.
//建立裁剪区域(左右底顶近远)
05.
aspectRatio = (GLfloat)w/(GLfloat)h;
06.
if
(w<=h){
//如果宽度小于高度(aspectRatio < 1)
07.
glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);
08.
}
else
{
09.
glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);
10.
}
附上一个例子:
view sourceprint?
01.
#include <GL/glut.h>
02.
//绘制场景
03.
void
RenderScence(Void)
04.
{
05.
//用当前颜色清除窗口
06.
glClear(GL_COLOR_BUFFER_BIT);
07.
//把绘图颜色设置为红色
08.
glColor3f(1.0f,0.0f,0.0f);
09.
//用当前的颜色绘制一个填充矩形
10.
glRectf(-25.0f,25.0f,25.0f,-25.0f);
11.
//刷新绘图命令
12.
glFlush();
13.
}
14.
//当窗口改变大小时由GLUT函数库调用
15.
void
ChangeSize(GLsizei w, GLsizei h)
16.
{
17.
GLfloat aspectRatio;
18.
//防止被0所除
19.
if
(h == 0){
20.
h = 1;
21.
}
22.
//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了)
23.
//所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。
24.
//glViewport(0,0,w,h);
25.
glViewport(15,15,w-100,h-100);
26.
//重置坐标系统
27.
glMatrixMode(GL_PROJECTION);
//切换为透视投影矩阵
28.
glLoadIdentity();
//将透视投影矩阵转换为单位矩阵
29.
//建立裁剪区域(左右底顶近远)
30.
aspectRatio = (GLfloat)w/(GLfloat)h;
31.
if
(w<=h){
//如果宽度小于高度(aspectRatio < 1)
32.
//glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);
33.
glOrtho(-30.0, 30.0, -30/aspectRatio, 30.0/aspectRatio, 1.0, -1.0);
34.
}
else
{
35.
//glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);
36.
glOrtho(-30.0*aspectRatio, 30.0*aspectRatio,-30.0, 30.0, 1.0, -1.0);
37.
}
38.
glMatrixMode(GL_MODELVIEW);
//切换为平行投影矩阵
39.
glLoadIdentity();
//将平行投影矩阵转换为单位矩阵
40.
}
41.
//设置渲染状态
42.
void
SetupRC(
void
)
43.
{
44.
//设置清除颜色
45.
glClearColor(0.0f, 0.6f, 1.0f, 1.0f);
46.
}
47.
//主程序入口
48.
int
main(
int
argc,
char
* argv[])
49.
{
50.
glutInit(&argc,argv);
51.
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
52.
glutInitWindowPosition(100,300);
53.
glutInitWindowSize(400,400);
54.
glutCreateWindow(
"coder"
);
//创建一个窗口
55.
glutDisplayFunc(RenderScence);
//注册回调函数
56.
glutReshapeFunc(ChangeSize);
57.
SetupRC();
//设置初始化状态(有些状态只需要设置一次)
58.
glutMainLoop();
//开始循环运行,显示绘图。
59.
return
0;
60.
}