[译]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 直 ...
随机推荐
- ReactiveCocoa(二)
前言 通过ReactiveCocoa(一)的学习,相信大家对ReactiveCocoa有了一些基本认识吧.下面就让我们来学习ReactiveCocoa的一些基本使用吧! ReactiveCocoa基本 ...
- 记录git rebase用法
git 是基于文件系统的版本管理工具,文档和详细介绍可以查看git 一.git commit --amend 如果你对文件做了修改需要和上一次的修改合并为一个change git add . git ...
- 【bzoj2190】【仪仗队】欧拉函数+线性筛(浅尝ACM-J)
向大(hei)佬(e)势力学(di)习(tou) Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪 ...
- 六. 异常处理10.Java的内置异常
在标准包java.lang中,Java定义了若干个异常类.前面的例子曾用到其中一些.这些异常一般是标准类RuntimeException的子类.因为java.lang实际上被所有的Java程序引入,多 ...
- Spring的AOP浅尝
项目中使用到了Spring,写了一个简单的例子,跟大家分享一下,由于自己写东西,所以在技术选择上充分自由,虽然对于Spring的利弊众说纷纭,我也不能评判,反正我是尝试用了,记得在上学时候老师讲Spr ...
- c:foreach如何输出序号
关键在于<c:forEach>的varStatus属性,具体代码如下: <table width="500" border="0" cells ...
- JS编码三种方法的区别:escape、encodeURI和encodeURIComponent
1.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的效果是%XX或者%uXXXX这种形式.其中 ...
- 新人补钙系列教程之:体验ApplicationDomain 应用程序域
要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...
- shell中declare命令
declare命令有如下选项: -a 声明一个数组 -i 声明一个整型 -f 打印所有函数定义 -F 仅打印函数名字 -r 声明一个readonly变量,该变量的值无法改变,并且不能为unset -x ...
- 初识Nginx及编译安装Nginx
初识Nginx及编译安装Nginx 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...