Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows

先回顾一下之前的回调函数定义,当窗体和子窗体创建时定义的:

空闲函数 - renderSceneAll

主窗体的显示函数 - renderScene

子窗体1的显示函数 - renderScenesw1

子窗体2的显示函数 - renderScenesw2

子窗体3的显示函数 - renderScenesw3

我们会从各个窗体的显示函数开始.主窗体被子窗体覆盖,所以我们只想将它涂黑.当我们同时操作多个窗体的时候,第一步是用合适的窗体的ID调用glutSetWindow函数,接着我们用默认颜色黑色来清空颜色缓冲.

  1. void renderScene() {
  2. glutSetWindow(mainWindow);
  3. glClear(GL_COLOR_BUFFER_BIT);
  4. glutSwapBuffers();
  5. }

我们必须为每个窗体定义显示函数.在我们的示例中,所有窗体的几何图形都相同,唯一不同的是视点,或者说镜头,随你习惯.

通用几何图形渲染的函数叫renderScene2.然而,在调用该函数之前,我们要设置当前窗体到各个子窗体,读取ID矩阵来整理MODELVIEW矩阵,并用gluLookAt函数来设置镜头.

本章第一节讨论了子窗体,我们可以从不同的视角观看同一个场景.第一个子窗体显示当前视点,作为主镜头.第二个从顶部显示,就好像镜头从当前位置的头顶往下看,用相同的方向作为视线.第三个子窗体像镜头在当前位置的右边望向当前位置.

下面代码为每个窗体定义了显示函数.是之前代码的扩充.如果你需要更多细节你可以回头去看上一节. 关于键盘移动的Moving the Camera II, 关于文本显示的Bitmaps and the Orthogonal View, 或者关于回复计算的Frames per Second.

注意,这里窗体的内容略有不同.顶部窗体会用位图字符串来显示fpt计数.两个底部窗体会在主镜头的位置显示两个红色圆锥形.

  1. // Common render items for all subwindows
  2. void renderScene2() {
  3.  
  4. // Draw ground
  5.  
  6. glColor3f(0.9f, 0.9f, 0.9f);
  7. glBegin(GL_QUADS);
  8. glVertex3f(-100.0f, 0.0f, -100.0f);
  9. glVertex3f(-100.0f, 0.0f, 100.0f);
  10. glVertex3f( 100.0f, 0.0f, 100.0f);
  11. glVertex3f( 100.0f, 0.0f, -100.0f);
  12. glEnd();
  13.  
  14. // Draw 36 SnowMen
  15. char number[];
  16. for(int i = -; i < ; i++)
  17. for(int j=-; j < ; j++) {
  18.  
  19. glPushMatrix();
  20. glTranslatef(i*10.0f, 0.0f, j * 10.0f);
  21. drawSnowMan();
  22. glPopMatrix();
  23. }
  24. }
  25.  
  26. // Display func for main window
  27. void renderScene() {
  28. glutSetWindow(mainWindow);
  29. glClear(GL_COLOR_BUFFER_BIT);
  30. glutSwapBuffers();
  31. }
  32.  
  33. // Display func for sub window 1
  34. void renderScenesw1() {
  35.  
  36. glutSetWindow(subWindow1);
  37.  
  38. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  39.  
  40. glLoadIdentity();
  41. gluLookAt(x, y, z,
  42. x + lx,y + ly,z + lz,
  43. 0.0f,1.0f,0.0f);
  44.  
  45. renderScene2();
  46.  
  47. // display fps in the top window
  48. frame++;
  49.  
  50. time=glutGet(GLUT_ELAPSED_TIME);
  51. if (time - timebase > ) {
  52. sprintf(s,"Lighthouse3D - FPS:%4.2f",
  53. frame*1000.0/(time-timebase));
  54. timebase = time;
  55. frame = ;
  56. }
  57.  
  58. setOrthographicProjection();
  59.  
  60. glPushMatrix();
  61. glLoadIdentity();
  62. renderBitmapString(,,,GLUT_BITMAP_HELVETICA_12,s);
  63. glPopMatrix();
  64.  
  65. restorePerspectiveProjection();
  66.  
  67. glutSwapBuffers();
  68. }
  69.  
  70. // Display func for sub window 2
  71. void renderScenesw2() {
  72.  
  73. glutSetWindow(subWindow2);
  74.  
  75. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  76.  
  77. glLoadIdentity();
  78. gluLookAt(x, y+, z,
  79. x ,y - ,z,
  80. lx,,lz);
  81.  
  82. // Draw red cone at the location of the main camera
  83. glPushMatrix();
  84. glColor3f(1.0,0.0,0.0);
  85. glTranslatef(x,y,z);
  86. glRotatef(-(angle+deltaAngle)*180.0/3.14,0.0,1.0,0.0);
  87. glutSolidCone(0.2,0.8f,,);
  88. glPopMatrix();
  89.  
  90. renderScene2();
  91.  
  92. glutSwapBuffers();
  93. }
  94.  
  95. // Display func for sub window 3
  96. void renderScenesw3() {
  97.  
  98. glutSetWindow(subWindow3);
  99.  
  100. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  101.  
  102. glLoadIdentity();
  103. gluLookAt(x-lz* , y, z+lx*,
  104. x ,y ,z ,
  105. 0.0f,1.0f,0.0f);
  106.  
  107. // Draw red cone at the location of the main camera
  108. glPushMatrix();
  109. glColor3f(1.0,0.0,0.0);
  110. glTranslatef(x,y,z);
  111. glRotatef(-(angle+deltaAngle)*180.0/3.14,0.0,1.0,0.0);
  112. glutSolidCone(0.2,0.8f,,);
  113. glPopMatrix();
  114.  
  115. renderScene2();
  116.  
  117. glutSwapBuffers();
  118. }

现在剩下要做的是定义全局空闲函数.在我们的示例中,该函数是renderSceneAll.该函数检查deltaMove或deltaAngle是否为非零,并更新当前位置的值和视线向量.

然后我们让各个子窗体调用显示函数.注意我们不会调用主窗体的显示函数,因为它一直不会做任何修改.

  1. // Global idle func
  2. void renderSceneAll() {
  3.  
  4. // check for keyboard movement
  5. if (deltaMove)
  6. computePos(deltaMove);
  7.  
  8. renderScenesw1();
  9. renderScenesw2();
  10. renderScenesw3();
  11. }

[译]GLUT教程 - 渲染到子窗体的更多相关文章

  1. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  2. [译]GLUT教程 - 重整子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...

  3. [译]GLUT教程 - 创建和关闭子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...

  4. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  5. [译]GLUT教程 - 整合代码7

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...

  6. [译]GLUT教程 - 初始化

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Initialization 这一节开始从main函数入手.第一步是线 ...

  7. [译]GLUT教程 - 子菜单

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果 ...

  8. [译]GLUT教程 - 改变窗体大小

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Resizing the Window 上一章的例子创建了两个窗体,命 ...

  9. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

随机推荐

  1. ReactiveCocoa(二)

    前言 通过ReactiveCocoa(一)的学习,相信大家对ReactiveCocoa有了一些基本认识吧.下面就让我们来学习ReactiveCocoa的一些基本使用吧! ReactiveCocoa基本 ...

  2. 记录git rebase用法

    git 是基于文件系统的版本管理工具,文档和详细介绍可以查看git 一.git commit --amend 如果你对文件做了修改需要和上一次的修改合并为一个change git add . git ...

  3. 【bzoj2190】【仪仗队】欧拉函数+线性筛(浅尝ACM-J)

    向大(hei)佬(e)势力学(di)习(tou) Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪 ...

  4. 六. 异常处理10.Java的内置异常

    在标准包java.lang中,Java定义了若干个异常类.前面的例子曾用到其中一些.这些异常一般是标准类RuntimeException的子类.因为java.lang实际上被所有的Java程序引入,多 ...

  5. Spring的AOP浅尝

    项目中使用到了Spring,写了一个简单的例子,跟大家分享一下,由于自己写东西,所以在技术选择上充分自由,虽然对于Spring的利弊众说纷纭,我也不能评判,反正我是尝试用了,记得在上学时候老师讲Spr ...

  6. c:foreach如何输出序号

    关键在于<c:forEach>的varStatus属性,具体代码如下: <table width="500" border="0" cells ...

  7. JS编码三种方法的区别:escape、encodeURI和encodeURIComponent

    1.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的效果是%XX或者%uXXXX这种形式.其中  ...

  8. 新人补钙系列教程之:体验ApplicationDomain 应用程序域

    要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...

  9. shell中declare命令

    declare命令有如下选项: -a 声明一个数组 -i 声明一个整型 -f 打印所有函数定义 -F 仅打印函数名字 -r 声明一个readonly变量,该变量的值无法改变,并且不能为unset -x ...

  10. 初识Nginx及编译安装Nginx

    初识Nginx及编译安装Nginx 环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...