[译]GLUT教程 - 渲染到子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows
先回顾一下之前的回调函数定义,当窗体和子窗体创建时定义的:
空闲函数 - renderSceneAll
主窗体的显示函数 - renderScene
子窗体1的显示函数 - renderScenesw1
子窗体2的显示函数 - renderScenesw2
子窗体3的显示函数 - renderScenesw3
我们会从各个窗体的显示函数开始.主窗体被子窗体覆盖,所以我们只想将它涂黑.当我们同时操作多个窗体的时候,第一步是用合适的窗体的ID调用glutSetWindow函数,接着我们用默认颜色黑色来清空颜色缓冲.
void renderScene() {
glutSetWindow(mainWindow);
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
我们必须为每个窗体定义显示函数.在我们的示例中,所有窗体的几何图形都相同,唯一不同的是视点,或者说镜头,随你习惯.
通用几何图形渲染的函数叫renderScene2.然而,在调用该函数之前,我们要设置当前窗体到各个子窗体,读取ID矩阵来整理MODELVIEW矩阵,并用gluLookAt函数来设置镜头.
本章第一节讨论了子窗体,我们可以从不同的视角观看同一个场景.第一个子窗体显示当前视点,作为主镜头.第二个从顶部显示,就好像镜头从当前位置的头顶往下看,用相同的方向作为视线.第三个子窗体像镜头在当前位置的右边望向当前位置.
下面代码为每个窗体定义了显示函数.是之前代码的扩充.如果你需要更多细节你可以回头去看上一节. 关于键盘移动的Moving the Camera II, 关于文本显示的Bitmaps and the Orthogonal View, 或者关于回复计算的Frames per Second.
注意,这里窗体的内容略有不同.顶部窗体会用位图字符串来显示fpt计数.两个底部窗体会在主镜头的位置显示两个红色圆锥形.
// Common render items for all subwindows
void renderScene2() { // Draw ground glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f, 0.0f, -100.0f);
glVertex3f(-100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, -100.0f);
glEnd(); // Draw 36 SnowMen
char number[];
for(int i = -; i < ; i++)
for(int j=-; j < ; j++) { glPushMatrix();
glTranslatef(i*10.0f, 0.0f, j * 10.0f);
drawSnowMan();
glPopMatrix();
}
} // Display func for main window
void renderScene() {
glutSetWindow(mainWindow);
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
} // Display func for sub window 1
void renderScenesw1() { glutSetWindow(subWindow1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
gluLookAt(x, y, z,
x + lx,y + ly,z + lz,
0.0f,1.0f,0.0f); renderScene2(); // display fps in the top window
frame++; time=glutGet(GLUT_ELAPSED_TIME);
if (time - timebase > ) {
sprintf(s,"Lighthouse3D - FPS:%4.2f",
frame*1000.0/(time-timebase));
timebase = time;
frame = ;
} setOrthographicProjection(); glPushMatrix();
glLoadIdentity();
renderBitmapString(,,,GLUT_BITMAP_HELVETICA_12,s);
glPopMatrix(); restorePerspectiveProjection(); glutSwapBuffers();
} // Display func for sub window 2
void renderScenesw2() { glutSetWindow(subWindow2); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
gluLookAt(x, y+, z,
x ,y - ,z,
lx,,lz); // Draw red cone at the location of the main camera
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(x,y,z);
glRotatef(-(angle+deltaAngle)*180.0/3.14,0.0,1.0,0.0);
glutSolidCone(0.2,0.8f,,);
glPopMatrix(); renderScene2(); glutSwapBuffers();
} // Display func for sub window 3
void renderScenesw3() { glutSetWindow(subWindow3); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
gluLookAt(x-lz* , y, z+lx*,
x ,y ,z ,
0.0f,1.0f,0.0f); // Draw red cone at the location of the main camera
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(x,y,z);
glRotatef(-(angle+deltaAngle)*180.0/3.14,0.0,1.0,0.0);
glutSolidCone(0.2,0.8f,,);
glPopMatrix(); renderScene2(); glutSwapBuffers();
}
现在剩下要做的是定义全局空闲函数.在我们的示例中,该函数是renderSceneAll.该函数检查deltaMove或deltaAngle是否为非零,并更新当前位置的值和视线向量.
然后我们让各个子窗体调用显示函数.注意我们不会调用主窗体的显示函数,因为它一直不会做任何修改.
// Global idle func
void renderSceneAll() { // check for keyboard movement
if (deltaMove)
computePos(deltaMove); renderScenesw1();
renderScenesw2();
renderScenesw3();
}
[译]GLUT教程 - 渲染到子窗体的更多相关文章
- [译]GLUT教程(目录)
http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...
- [译]GLUT教程 - 重整子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...
- [译]GLUT教程 - 创建和关闭子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...
- [译]GLUT教程 - 游戏模式
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...
- [译]GLUT教程 - 整合代码7
Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...
- [译]GLUT教程 - 初始化
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Initialization 这一节开始从main函数入手.第一步是线 ...
- [译]GLUT教程 - 子菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果 ...
- [译]GLUT教程 - 改变窗体大小
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Resizing the Window 上一章的例子创建了两个窗体,命 ...
- [译]GLUT教程 - glutPostRedisplay函数
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...
随机推荐
- 洛谷——2722总分 Score Inflation
题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类& ...
- [BZOJ 1567] Blue Mary的战役地图
Link: BZOJ 1567 传送门 Solution: 矩阵Hash/二维$Hash$模板题 涉及到需要快速查询.匹配的题目,考虑直接上$Hash$ 矩阵$Hash$其实就是每行先各$Hash$一 ...
- [POI2014]FarmCraft
题目大意: 一个$n(n\le5\times10^5)$个点的树,每个点有一个权值$c_i$,从$1$出发进行欧拉遍历,每个单位时间移动一条边,记每个点$i$被访问到的时间是$t_i$,问最后$\ma ...
- 2,搭建一个java开发环境
(1)java开发需要的条件? 1)适用于环境开发的jdk(里面包括了jre和加热里面包括了jvm) 2)对应开发环境的eclipse 3)如果涉及到web开发,还需要web服务器(Tomcat) ( ...
- [读书笔记] CSS揭秘-背景与边框
半透明边框 默认情况下,背景会延伸到边框所在的区域下层.可以通过background-clip属性调整该默认行为. border: 10px solid rgba(0,0,0,.2) backgrou ...
- Winform打砖块游戏制作step by step第二节---.画挡板
一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinFor ...
- A folder failed to be renamed or moved--安装Android SDK的问题
对于Android是一直想学却一直未学,行动跟不上想法.现在,终于付诸于行动了. 首先,我找的第一个Android的资料是大话企业级Android,前阵子刚看完大话设计模式,通俗易懂,还是比较喜欢这一 ...
- web-51job(前程无忧)-账户、简历-数据库设计
ylbtech-DatabaseDesgin:web-51job(前程无忧)-账户.简历-数据库设计 1.A,数据库关系图 1.B,数据库设计脚本 /App_Data/1,Account.sql ...
- 面试题:Add Two Numbers(模拟单链表)
题干: You are given two non-empty linked lists representing two non-negative integers. The digits are ...
- curl 执行post请求
#curl -l -H "Content-type: application/json;charset=UTF-8" -H "X-Forwarded-For: 20.20 ...