博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openGL如何在改变窗口大小时,使自己的图形不被拉伸
阅读量:6875 次
发布时间:2019-06-26

本文共 1167 字,大约阅读时间需要 3 分钟。

这里要注意两个概念:视口和视景体,当视口的纵横比和视景体的纵横比相同的时候,改变窗口大小,图像才不会变形;

视景体是指成像景物所在空间的集合。它是一个空间集合体。

单个的视景体,比如一个球体,若要完全显示,其视景体应该是该球体的最小外接立方体;若要只显示上半部分,则取上半球,其视景体是上半球的最小外接立方体。对于半球而言,上半球是视景体,那么其只有上半球有显示权限,下半球没有,所以就算是将该球体位置拉远,也只能看到上半球。

若视景体仅仅为上半球,那么默认情况下,上半球所映射的画布刚好充满摄像机。将摄像机下移,则摄像机画面中显示的是上半球切面的水平线,水平线以下是黑色背景色。即使此时从理论上来说摄像机对着下半球,但由于视景体仅为上半球,所以下半球是没有显示权限的,是不会被显示的。

 对OpenGL而言,视景体就意味着可显示空间,在该空间内的一切物体都可以被显示,都可以被看到,该空间外的一切物体都不能被看到。相机若要看到该空间中的物体,则相机本身就必须处于该视景体空间中。若相机在视景体空间外,哪怕该视景体就在相机正对的面前,相机依然无法看到

 

例如:

控制视口大小为:glViewprot(0,0,400,200);则其纵横比为2
那么控制视景体的参数为:gluPerspective(fovy,2,near,far);可以了

添加代码如下:

1 void changeSize(GLsizei w, GLsizei h) 2 { 3     if (h == 0) 4         h = 1; 5     glViewport(0, 0, w, h); 6     glMatrixMode(GL_PROJECTION); 7     glLoadIdentity(); 8  9     if (w <= h)10     {11         glOrtho(0.0f, 300.0f, 0.0f, 300.0f * h / w, 1.0f, -1.0f);12     }13     else14     {15         glOrtho(0.0f, 300.0f * w / h, 0.0f, 300.0f, 1.0f, -1.0f);16     }17 18     glMatrixMode(GL_MODELVIEW);19     glLoadIdentity();20 }

注意:绘制图形时需要使用像素坐标系,左下角为原点。例如:glRectf(100.0f, 100.0f, 200.0f, 200.0f); 而不是glRectf(-0.5f, -0.5f, 0.5f, 0.5f);

转载于:https://www.cnblogs.com/keguniang/p/9857975.html

你可能感兴趣的文章
VMware View FAQ[一]
查看>>
【原创翻译】布尔值(boolean)
查看>>
三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器
查看>>
MySQL分库分表分表后数据的查询(5th)
查看>>
iOS-点击图片放大,再次点击返回原视图 类似查看相册的功能
查看>>
JAVA -- stateless4j StateMachine 使用浅析(二)
查看>>
oracle checkpoint
查看>>
KVM虚拟化开源高可用方案(六)ISCSI ON DRBD搭建及常见故障处理
查看>>
android device related
查看>>
iOS 6 Beta3即将发布,iPhone面板谍照已经曝光
查看>>
hadoop 源码包编译
查看>>
关于scrapy的piplines
查看>>
Windows Server 2008 FTP用户目录隔离模式
查看>>
python实现linux下指定目录下文件中的单词个数统计
查看>>
Android源代码下载编译
查看>>
jsp---语句对象Statement
查看>>
RESTful API
查看>>
前端UI框架总结
查看>>
Atom 初识
查看>>
每日英语:Poor Chinese Schools Tell Students: Bring Your Own Desks
查看>>