前面的例子,当我们通过拖拉的方法改变窗口的长宽比例时,窗口里的图形的长宽也相应地伸缩,导致图形变形。如下图:

正如上图所示,当我们把窗口宽度拉长后,图形就会显得比较胖。同样,当我们把窗口的高度拉长后,图形会现的比较瘦。原因很简单,前面的文章已经提到过,绘图时我们使用的坐标是相对于窗口的坐标,当窗口的坐标系变化后,图形也相应地变化。

如果做到在图形放大或缩小后不变形呢(宽高比不变)

1、确保图形不变形的原理

当窗口大小变化时,如果我们能保证图形的宽度和高度的比例保持不变,那图形就能保持原型,只是大小发生变化而已。
假设窗口的宽度放大(或缩小)w倍,高度放大(或缩小)h倍。当w>=h时,我们让窗口里的图形的宽度和高度都放大(或缩小)h倍; 当w < 时,让图形的宽度和高度都放大(或缩小)w倍。

2、glutReshapeFunc函数注册回调
glutReshapeFunc((changeSize);),函数glutReshapeFunc为我们提供了注册窗口大小改变时注册回调函数的接口,函数changeSize是我们要写的函数,当窗口变化时,需要处理的事情,我们可以在函数changeSize里添加处理代码。函数原型为:void changeSize(GLsizei w, GLsizei h);w为窗口改变后的宽度,h为窗口改变后的高度。

3、完整代码如下

#include <windows.h>
#include <gl/glut.h>//Rect.cppvoid renderScene(void)
{glClear(GL_COLOR_BUFFER_BIT);   //清空颜色缓冲池glColor3f(1.0f, 0.0f, 0.0f);    //设置绘图颜色glRectf(100.0f, 100.0f, 200.0f, 200.0f);    //绘制矩形glFlush();  //执行OpenGL指令列表中的指令
}void changeSize(GLsizei w, GLsizei h)
{if(h == 0)h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w <= h){glOrtho(0.0f, 300.0f, 0.0f, 300.0f * h/w, 1.0f, -1.0f);}else{glOrtho(0.0f, 300.0f * w/h, 0.0f, 300.0f, 1.0f, -1.0f);}glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}void main(void)
{glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置显示模式glutInitWindowSize(300, 300); //设置窗口大小glutInitWindowPosition(200, 200);   //设置窗口在屏幕上的位置 glutCreateWindow("矩形"); //创建窗口并给出标题glutDisplayFunc(renderScene);   //注册显示窗口时回调函数renderSceneglOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0, -1.0);glutReshapeFunc(changeSize);    //注册窗口大小改变时回调函数glClearColor(0.0f, 0.0f, 1.0f, 1.0f);   //使用蓝色清空背景底glutMainLoop();     //消息循环(处理操作系统等的消息,例如键盘、鼠标事件等)
}

4、效果图:

OpenGL编程(四)改变窗口大小时保持图形的原形相关推荐

  1. 改变窗口大小时重新设置 rem时window.onresize失效

    初始化font-size的js文件setRem.js如下 // 基准大小 const baseSize = 75 // 设置 rem 函数 function setRem() {// 当前页面宽度相对 ...

  2. Qt5应用改变窗口大小时出现黑影

    解决方法 在启动程序时,添加-platform wayland参数 添加QT_QPA_PLATFORM=wayland-egl到系统环境变量 注意:改完后虽然没有黑影,但软件图标显示不正常,也不能正常 ...

  3. VC++下的OpenGL编程

    1.值得记住的约定 一般情况下,VC++下进行OpenGL应用程序开发步骤如下: 1.通过PIXELFORMATDESCRIPTOR结构设置备注描述表DC的像素格式属性. 2.创建渲染描述表RC,并与 ...

  4. OpenGL编程(六)通过三角形绘画出3D模型

    使用三角形绘制3D模型 三角形是基本的多边形,任何多变形都能由三角形组成.三角形是由三个顶点的连线组成.三个点分别是v0:v1:v2. 1.绕法 从某个顶点开始,有两种连线的方法,顺时针和逆时针,这是 ...

  5. Win32 OpenGL编程(4) 2D图形基础(颜色及坐标体系进阶知识)

    Win32 OpenGL 编程 (4) 2D 图形基础(颜色及坐标体系进阶知识) write by 九天雁翎 (JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 ...

  6. Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...

  7. OpenGL编程入门学习

    OpenGL编程入门学习  非常详细的教程,很适合初学者 本文转自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html === ...

  8. QT openGL 编程 笔记

    据说QT牛,特地花了一个晚上来研究研究.其实我也不想把自己搞得熊猫眼,只是碰到问题了精力就特好,想睡觉都不行.第一次尝试在LINUX下用OpenGL编程,实在是很兴奋,只是感觉碰了不少灰.一个问题从1 ...

  9. Qt下的OpenGL 编程(3)绘制平面几何体

    一. 提要 之前的一篇教程已经搭建好了Qt下的OpenGL的编程环境,几天要来学习的就是OpenGL的2D绘图. 2D作为绘图的基础,还是很值得去好好学习,比如迪卡尔坐标,透视设置等等,而所谓的3D, ...

  10. OpenGL编程轻松入门(一)

    OpenGL编程轻松入门(一) (由同事黄燕创作)   本文介绍了有关OpenGL的基本知识,主要涉及颜色.绘制几何体.坐标变换.堆栈操作.显示列表.光照和材质.纹理映射.特殊效果.曲面和曲线的绘制. ...

最新文章

  1. 7纳米duv和euv_要超车台积电 三星宣布采用EUV技术7纳米制程完成验证
  2. php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞
  3. HBase+Spark技术双周刊 第四期
  4. 基于贝叶斯决策理论的分类器
  5. 排序算法以及其java实现
  6. sqlplus 修改system密码_华为交换机console密码忘了如何解决 华为交换机console密码忘了解决方法【介绍】...
  7. jQuery 属性操作 - addClass() 和 removeClass() 方法
  8. [渝粤教育] 西南科技大学 国际贸易理论与实务 在线考试复习资料2021版(1)
  9. 推荐方法-1:UserCFItemCF
  10. PHP的图片等比缩放
  11. 实现Springboot整合UReport2
  12. 好用的python工具_Python哪些工具好用?老男孩Python开发
  13. 06540计算机网络2018年自考真题,自考06540计算机网络基本原理复习资料六
  14. 总结几个有关国家行政区划的问题
  15. 渲染101渲染农场完美支持火凤凰插件Phoenix FD
  16. 基于数组判断字符串是否是回文
  17. 商业智慧:创造奇迹的信件
  18. 算法系列之二十:计算中国农历(一)
  19. 提高APP用户粘性,你需要了解这些!
  20. C++ P1282 多米诺骨牌

热门文章

  1. WorldPress博客系统更换域名导致博客访问出错的解决方案
  2. 网站设计的思路是怎么样的?如何设计一个好网站?|优漫动游
  3. ERROR ITMS-4238
  4. 微信小程序开发——调用免费天气api接口(高德、天气API)
  5. ASA Failover
  6. 像把大象放入冰箱那样制造芯片
  7. Linux应用软件的安装包常见三种格式
  8. ASAN和HWASAN原理解析
  9. 区块链游戏:何为虚拟?何为现实?
  10. K折交叉验证大集合(KFold 、Stratified k-fold、Group k-fold、StratifiedGroupKFold)