首先解釋下圖形學中的屏幕,窗口,視見區(視口),裁剪區。html
屏幕:即計算機的整個屏幕大小。函數
窗口:即屏幕中的某一個窗口,可放大放小和移動關閉。oop
視口:即在窗口中能夠見到或能夠用來繪圖的部分。通常設置視口等於窗口。spa
裁剪區:即在視口中讓你看到的圖形,即顯示出來的那部分。.net
GLUT的窗口初始化是在main函數中使用code
1.
//初始化窗口位置
get
2.
//x:距屏幕左邊的像素大小
回調函數
3.
//y:距屏幕頂部的像素大小
it
4.
extern
void
APIENTRY glutInitWindowPosition(
int
x,
int
y);
5.
//初始化窗口的寬度和高度
6.
//width:寬度大小
7.
//height:高度大小
8.
extern
void
APIENTRY glutInitWindowSize(
int
width,
int
height);
視口通常是基於已經定義了的窗口的來定義的。
1.
//把視口區設置爲窗口大小,相對與窗口而言(而窗口的位置在開始運行是已經定義了)
2.
//因此(0,0,w,h)中的(0,0)是相對於已經定義好的窗口的左下角的位置。
3.
glViewport(0,0,w,h);
裁剪區的定義:
通常會保證與窗口的縱橫比是一致的,因此得設置一個變量aspectRatio。
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.
}
附上一個例子:
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.
}