OpenGL学习之路-2

glut程序

8.多窗口且子窗口能够跟随reshape的变化而变化

///
#include <GL/glut.h>
#include <iostream>///
int winWidth, winHeight;                                    //  <<=======NEW!!!
int mainWinID;                                              //  <<=======NEW!!!
int subWinID0(0), subWinID1(0), subWinID2(0), subWinID3(0); //  <<=======NEW!!!///
void myMainWinDraw(void);
void myMainWinReshape(int _width, int _height);void mySubWinDrawSphere(void);
void mySubWinDrawTeapot(void);
void mySubWinDrawTorus(void);
void mySubWinDrawIcos(void);///
int main(int argc,char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);mainWinID = glutCreateWindow("Hello");glutDisplayFunc(myMainWinDraw);glutReshapeFunc(myMainWinReshape);glutMainLoop();return 0;
}///
void myMainWinReshape(int _width, int _height) {winWidth  = _width;                  // <<==============NEW!!!winHeight = _height;                 // <<==============NEW!!!if (subWinID0)                       // <<==============NEW!!!glutDestroyWindow(subWinID0);     // <<==============NEW!!!subWinID0 = glutCreateSubWindow(mainWinID, 0, 0,   // <<=======NEW!!!winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawSphere);              // <<=======NEW!!!if (subWinID1) {glutDestroyWindow(subWinID1);}subWinID1 = glutCreateSubWindow(mainWinID, winWidth>>1, 0,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawTeapot);if (subWinID2)glutDestroyWindow(subWinID2);subWinID2 = glutCreateSubWindow(mainWinID, 0, winHeight>>1,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawTorus);if (subWinID3)glutDestroyWindow(subWinID3);subWinID3 = glutCreateSubWindow(mainWinID, winWidth>>1, winHeight>>1,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawIcos);
}///
void myMainWinDraw() {glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glFlush();
}///
void mySubWinDrawSphere(void) {glClearColor(0.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glRotatef(30, 1.0f, 1.0f, 1.0f);glutWireSphere(0.8f, 20, 20);glFlush();
}///
void mySubWinDrawTeapot(void) {glClearColor(1.0, 1.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glutWireTeapot(0.5f);glFlush();
}///
void mySubWinDrawTorus(void) {glClearColor(0.0, 1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glutWireTorus(0.3f, 0.6f, 20, 30);glFlush();
}///
void mySubWinDrawIcos(void) {glClearColor(1.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glRotatef(30, 1.0f, 1.0f, 1.0f);glutWireIcosahedron();glFlush();
}///

新增的知识点:

1.回调函数myMainWinReshape中:改变窗口大小时,先将原来子窗口销毁(如果存在的话),再重新产生新的子窗口。

2.glutDestroyWindow:销毁窗口

道理上是这个样子,但是我在实际运行过程中,拖动鼠标改变窗口大小时,出现了问题。 

差不多是说,没有注册给窗口6的回调函数。可能和我这个freeglut有关系的。暂时没有解决。

9.可控制的子窗口显示

///
#include <GL/ogl.h>
#include <iostream>///
void myMainWinDraw(void);
void myMainWinReshape(int _width, int _height);
void myMainWinKeyboard(unsigned char _key, int _x, int _y);void mySubWinDrawSphere(void);
void mySubWinDrawTeapot(void);
void mySubWinDrawTorus(void);
void mySubWinDrawIcos(void);///
int winWidth, winHeight;
int mainWinID;
int subWinID0(0), subWinID1(0), subWinID2(0), subWinID3(0);// <<================= NEW !!!!!!
bool isShowSubWin0(1), isShowSubWin1(1), isShowSubWin2(1), isShowSubWin3(1);///
int main(int argc,char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);mainWinID = glutCreateWindow("Hello");glutDisplayFunc(myMainWinDraw);glutReshapeFunc(myMainWinReshape);glutKeyboardFunc(myMainWinKeyboard);glutMainLoop();return 0;
}///
void myMainWinReshape(int _width, int _height) {winWidth  = _width;winHeight = _height;if (subWinID0) {glutDestroyWindow(subWinID0);subWinID0 = 0;}if (isShowSubWin0) {subWinID0 = glutCreateSubWindow(mainWinID, 0, 0,  winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawSphere);}if (subWinID1) {glutDestroyWindow(subWinID1);subWinID1 = 0;}if (isShowSubWin1) {subWinID1 = glutCreateSubWindow(mainWinID, winWidth>>1, 0,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawTeapot);}if (subWinID2) {glutDestroyWindow(subWinID2);subWinID2 = 0;}if (isShowSubWin2) {subWinID2 = glutCreateSubWindow(mainWinID, 0, winHeight>>1,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawTorus);}if (subWinID3) {glutDestroyWindow(subWinID3);subWinID3 = 0;}if (isShowSubWin3) {subWinID3 = glutCreateSubWindow(mainWinID, winWidth>>1, winHeight>>1,winWidth>>1, winHeight>>1);glutDisplayFunc(mySubWinDrawIcos);}
}///
void myMainWinDraw() {glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glFlush();
}//      <<<<<===================== NEW !!!!!
#define RENEW    myMainWinReshape(winWidth, winHeight);\glutPostRedisplay();\//myMainWinDraw();///
void myMainWinKeyboard(unsigned char _key, int _x, int _y) {switch (_key) {case 'a':isShowSubWin0 = !isShowSubWin0;RENEW;break;case 's':isShowSubWin1 = !isShowSubWin1;RENEW;break;case 'z':isShowSubWin2 = !isShowSubWin2;RENEW;break;case 'x':isShowSubWin3 = !isShowSubWin3;RENEW;break;case 'f':// <<================== NEW !!!glutFullScreen();break;case 'v':// <<================== NEW !!!glutSetWindow(mainWinID);glutReshapeWindow(300, 300);break;case 'w':// <<================== NEW !!!glutSetWindow(subWinID0);glutReshapeWindow(100, 100);}
}#undef RENEW    // <<================== NEW !!!///
void mySubWinDrawSphere(void) {glClearColor(0.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glRotatef(30, 1.0f, 1.0f, 1.0f);glutWireSphere(0.8f, 20, 20);glFlush();
}///
void mySubWinDrawTeapot(void) {glClearColor(1.0, 1.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glutWireTeapot(0.5f);glFlush();
}///
void mySubWinDrawTorus(void) {glClearColor(0.0, 1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glutWireTorus(0.3f, 0.6f, 20, 30);glFlush();
}///
void mySubWinDrawIcos(void) {glClearColor(1.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glRotatef(30, 1.0f, 1.0f, 1.0f);glutWireIcosahedron();glFlush();
}///

引入bool量isShowSubWin0, isShowSubWin1, isShowSubWin2, isShowSubWin3来判断是否应该显示该子窗口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从道一云到畅捷通T+通过接口配置打通数据

从道一云到畅捷通T通过接口配置打通数据 接通系统&#xff1a;道一云 在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提供集智能门户解决网关流量问题、企业微信端的…

opencv车牌识别<二>

目录 一、车牌识别算法流程 二、车牌检测 一、车牌识别算法流程 在解释ANPR代码之前&#xff0c;需要明白主要步骤和使用ANPR 算法的任务。ANPR 有两个主要步骤:车牌检测和车牌识别。车牌检测的目的是在整个视频帧中检测到车牌位置。当在图像中检测到车牌时&#xff0c;分割的…

SAP系统供应商预付款请求和预付账款业务

最近搞清帐&#xff01; 在SAP中处理客户或供应商的预收/预付款相关业务流程操作说明, 首先由业务部门(销售或采购)下达销售/采购订单,同时基于订单提交预收/预付申请,客户/供应商款项到账时,由财务部门在SAP中勾选申请单来收付款;最后在财务转应收/应付转发票时自动核销。预付…

SAP 事件:SET PF-STATUS 和AT LINE-SELECTION共用

Write List中&#xff0c;如果同时使用了SET PF-STATUS 和 AT LINE-SELECTION,会发现双击的时候不好用了&#xff01; 怎么办&#xff1f;其实&#xff0c;只要设置F2功能键”PICK”就OK了。 2007年12月11日修改&#xff1a; 如图&#xff1a; 例: REPORT z_barry_test_pic…

放假通知!2024年全国中小学寒假时间发布!

进入冬季&#xff0c; 学生们都迫不及待地 期盼着寒假的到来。 近日&#xff0c;全国多地已经明确了 2024年中小学寒假的起止时间。 一起来看看你所在的城市寒假放几天 北京 据“首都教育”微信公众号消息&#xff0c; 普通中小学、中等职业学校 义务教育阶段2024年寒…

有什么方法可以改善CRM实施投资回报?

数据统计显示&#xff0c;几乎70%以上CRM客户管理系统项目的投资回报是负数。这意味着超过半数的CRM项目的结果是失败的。那么我们有什么方法可以改善CRM实施投资回报吗&#xff1f;当然有&#xff0c;下面我们就来说一说。 如何改善CRM实施投资回报 首先&#xff0c;您选择的…

IDEA调试总结

前言 由于 IDEA 每个人使用的版本不同以及快捷键的设置不同&#xff0c;所以忽略了快捷键的使用。如果不知道快捷键请在 IDEA 工具栏里面点开 Run 菜单即可知悉 图标介绍 下面咱们进入看图说话环节&#xff0c;下列图标小伙伴知道是啥功能么&#xff1f;日常开发进行 Debug 使…

记录一个错误

通过Resource注解&#xff0c;将IStateHandler接口的实现类 StateHandlerImpl注入进来 Resource private IStateHandler stateHandler;Resource注解默认按照名称进行装配&#xff0c;这里抛出异常是因为IStateHandler和StateHandlerImpl都被 Spring 容器管理&#xff0c;在进行…

requestAnimationFrame是什么?介绍 如何使用?适用场景?有哪些缺点和优点,兼容性怎么样?

文章目录 前言是什么&#xff1f;如何使用适用场景优点和缺点兼容性后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技…

【nlp】2.2 传统RNN模型

传统RNN模型 1 传统RNN模型1.1 RNN结构分析1.2 使用Pytorch构建RNN模型1.3 传统RNN优缺点1 传统RNN模型 1.1 RNN结构分析 结构解释图: 内部结构分析: 我们把目光集中在中间的方块部分, 它的输入有两部分, 分别是h(t-1)以及x(t), 代表上一时间步的隐层输出, 以及此时间步的…

gurobi最新下载安装教程 2023.11

文章目录 gurobi下载gurobi安装gurobi lincese获取添加系统环境变量 gurobi和python gurobi下载 https://www.gurobi.com/ 点击下载中心 download center 可以直接选择 Gurobi Optimizer下载 gurobi安装 gurobi可以通过python进行调用&#xff0c;但是需要先获得gurobi的li…

利用Python群组分析方法剖析客户行为

大家好&#xff0c;如今的企业有能力收集大量的数据&#xff0c;这些数据可以帮助企业制定更好的策略并了解其客户的行为。Cohort分析可以在其中发挥作用&#xff0c;Cohort分析是一种了解客户行为或用户互动的强大工具&#xff0c;并为企业提供有价值的见解&#xff0c;本文中…

Lua的resty-request库写的一个爬虫

为了使用Lua的resty-request库进行爬虫&#xff0c;需要先安装OpenResty和resty-request库&#xff0c;并将其引入到Lua脚本中。然后&#xff0c;可以使用resty-request库提供的函数来发送HTTP请求和处理HTTP响应。 以下是一个使用resty-request库进行爬虫的示例代码&#xff1…

sqlyog安装和网址

网址Downloads webyog/sqlyog-community Wiki GitHub 1. 2. 3. 4. 5. 6. 7.

图论12-无向带权图及实现

文章目录 带权图1.1带权图的实现1.2 完整代码 带权图 1.1带权图的实现 在无向无权图的基础上&#xff0c;增加边的权。 使用TreeMap存储边的权重。 遍历输入文件&#xff0c;创建TreeMap adj存储每个节点。每个输入的adj节点链接新的TreeMap&#xff0c;存储相邻的边和权重 …

出入库管理系统vue2前端开发服务器地址配置

【精选】vue.config.js 的完整配置&#xff08;超详细&#xff09;_vue.config.js配置_web学生网页设计的博客-CSDN博客 本项目需要修改两处&#xff1a; 1、vue开发服务器地址&#xff1a;config\index.js use strict // Template version: 1.3.1 // see http://vuejs-templa…

传奇手游天花板赤月【盛世遮天】【可做底版】服务端+自主授权+详细教程

搭建资源下载地址&#xff1a;传奇手游天花板赤月【盛世遮天】【可做底版】服务端自主授权详细教程-海盗空间

使用MybatisPlus时出现的java.lang.NullPointerException异常~

错误描述如下所示&#xff1a; 错误原因&#xff1a;Junit的导包错误 单元测试的包有如下所示两个 我们应该根据springboot的版本进行选择&#xff0c; 在Spring Boot 2.2.X以后使用import org.junit.jupiter.api.Test Junit5 在Spring Boot 2.2.x之前使用import org.junit.T…

赛宁网安获评“铸网-2023”江西省实网应急演练优秀支撑单位

近日&#xff0c;南京赛宁信息技术有限公司&#xff08;赛宁网安&#xff09;获得了江西省工业和信息化厅颁发的“优秀支撑单位”荣誉。 该荣誉表彰是对赛宁网安在“铸网-2023”江西省工业领域网络安全实网应急演练中提供全程技术支撑能力的认可。 本次实网应急演练聚焦工业企…

理疗养生服务预约小程序要如何做

不少人面对身体症状疼痛&#xff0c;往往不会选择去医院&#xff0c;而是去理疗养生馆&#xff0c;选择艾灸、拔罐、中药贴敷等方式治疗改善或减轻疼痛。随着人们对中医信赖度增强&#xff0c;理疗养生市场增长迅速。 而在增长的同时&#xff0c;我们也注意到理疗养生馆经营痛…