【OpenGL】窗口,视口,裁剪区

首先解释下图形学中的屏幕,窗口,视见区(视口),裁剪区。

屏幕:即计算机的整个屏幕大小。

窗口:即屏幕中的某一个窗口,可放大放小和移动关闭。

视口:即在窗口中可以见到或可以用来绘图的部分。一般设置视口等于窗口。

裁剪区:即在视口中让你看到的图形,即显示出来的那部分。


GLUT的窗口初始化是在main函数中使用

   

1
2
3
4
5
6
7
8
//初始化窗口位置
//x:距屏幕左边的像素大小
//y:距屏幕顶部的像素大小
extern void APIENTRY glutInitWindowPosition( int x, int y);
//初始化窗口的宽度和高度
//width:宽度大小
//height:高度大小
extern void APIENTRY glutInitWindowSize( int width, int height);


视口一般是基于已经定义了的窗口的来定义的。

1
2
3
//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了)
//所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。
glViewport(0,0,w,h);



裁剪区的定义:

   一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。

1
2
3
4
5
6
7
8
9
10
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);
}


附上一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值