这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头。

  基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListener,另一个我们也刚学过KeyListener。

  好吧,开始。

  首先我们声明一个宏,#define CAMERA_NAME "SceneCamera" ,这是我们要使用的摄像机常量,下面要多次使用。

  然后我们定义两个全局函数,

void setupViewport(RenderWindow *win, SceneManager *curr)
{
  win->removeAllViewports();//移除所有视口
  Camera *cam = curr>getCamera(CAMERA_NAME);//获取摄像机
  Viewport *vp = win->addViewport(cam);//绑定视口到摄像机
  vp>setBackgroundColour(ColourValue(,,));//设置背景色
  cam->setAspectRatio(Real(vp>getActualWidth()) / Real(vp->getActualHeight()));//设置纵宽比
} void dualViewport(RenderWindow *win, SceneManager *primary,SceneManager *secondary)
{
  win->removeAllViewports();//移除所有视口
  Viewport *vp = ;
  Camera *cam = primary->getCamera(CAMERA_NAME);//第一个摄像机
  vp = win->addViewport(cam, , , , 0.5, );
  vp>setBackgroundColour(ColourValue(,,));//
  cam->setAspectRatio(Real(vp>getActualWidth()) / Real(vp>getActualHeight()));
  cam = secondary>getCamera(CAMERA_NAME);//第二个摄像机
  vp = win->addViewport(cam, , 0.5, , 0.5, );//
  vp>setBackgroundColour(ColourValue(,,));//
  cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));//设置纵宽比
}

其中的addViewport的函数定义如下:

  virtual Viewport* addViewport(Camera* cam//摄像机

                 , int ZOrder = 0//窗口重叠的优先级,越大越靠上

                 , float left = 0.0f//左边相对位置

                 , float top = 0.0f//上面相对位置

                 ,float width = 1.0f//宽度

                  , float height = 1.0f);//高度

  最后我们改变类内的函数

  第一,我们把要用到的函数添加进去,在监听器内有

bool frameStarted(const FrameEvent& evt){}
bool keyPressed(const OIS::KeyEvent &arg){}
bool keyReleased(const OIS::KeyEvent &) {}
static void swap(SceneManager *&first, SceneManager *&second){}//静态成员函数,交换两个场景

  在应用程序类中有

void chooseSceneManager(void){}//创建场景管理器
void createCamera(){}//创建摄像机
void createViewports(){}//创建视口
void createScene(void){}//创建场景
void createFrameListener(void){}//创建帧监听器

  第二,我们添加具体代码到函数体中,

  在每一帧的开始我们要捕获键盘状态

bool frameStarted(const FrameEvent& evt)
{
  mKeyboard->capture();//捕获键盘
  return mContinue;
}

  在键盘按下时,我们要响应动作,切换场景,或者切换显示方式,一个场景,还是两个场景

bool keyPressed(const OIS::KeyEvent &arg)
{
switch (arg.key)
{
case OIS::KC_ESCAPE://按下esc时退出程序
  mContinue = false;
break;
     case OIS::KC_V://按下v时,显示两个场景
     mDual = !mDual;//取反
     if (mDual)//
     dualViewport(mWindow, mPrimary, mSecondary);//显示两个视口
     else
     setupViewport(mWindow, mPrimary);//重新设置视口,默认为第一个
   break;
   case OIS::KC_C://按下c时,切换两个场景,并且
     swap(mPrimary, mSecondary);//交换场景管理器
     if (mDual)//
     dualViewport(mWindow, mPrimary,mSecondary);
     else
     setupViewport(mWindow, mPrimary);//
   break;
default:
break;
}
return true;
}

   在应用程序类中创建场景,摄像机,视口等...

void chooseSceneManager(void)
{
mPrimary = mRoot>createSceneManager(ST_GENERIC,"primary");
   mSecondary = mRoot>createSceneManager(ST_GENERIC,"secondary");
}
void createCamera()
{
mPrimary->createCamera(CAMERA_NAME);//摄像机1
mSecondary->createCamera(CAMERA_NAME);//摄像机2
}
void createViewports()
{
setupViewport(mWindow, mPrimary);
}
void createScene(void)
{
  // Setup the TerrainSceneManager
  mPrimary->setSkyBox(true,"Examples/SpaceSkyBox");//创建天空盒
  // Setup the Generic SceneManager
  mSecondary->setSkyDome(true,"Examples/CloudySky", , );//创建天空穹
}
void createFrameListener(void)
{
  //注册帧监听
  mFrameListener = new SMTutorialListener(mWindow, mPrimary,mSecondary);
  mFrameListener->showDebugOverlay(true);
  mRoot->addFrameListener(mFrameListener);
}

  好了,现在可以运行了,按下c可以在两个场景中随意切换,或者按下V键,显示两个视口在程序中。

ogre3D学习基础11 -- 交换两个场景管理器的更多相关文章

  1. ogre3D学习基础11 -- 日志文件的使用与异常处理

    用文件来记录 Ogre 系统初始化.运行.结束以及调试信息.使用日志便于我们调试程序.Ogre 日志系统由两个类组成:Log 类与 LogManager. 1.Log类 Log 类的一个对象对应于一个 ...

  2. ogre3D学习基础1 -- 核心对象与脚本技术

    一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...

  3. ogre3D学习基础6---场景管理器的使用

    场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...

  4. ogre3D学习基础16 -- 手动创建实体(ManualObject)

    这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板 #include "ExampleApplication.h" class Example1 ...

  5. ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹

    前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙. 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 #include "Ex ...

  6. ogre3D学习基础9 -- 光源程序实例

    这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...

  7. ogre3D学习基础8 --- 资源管理器

    资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术.通路.纹理单元等数据的定义). 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh.包含几何信息和一些 ...

  8. ogre3D学习基础17 --- 如何手动创建ogre程序

    建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...

  9. ogre3D学习基础15 -- 创建BSP Scene Manager

    BSP(binary-space partitioning) Scene Manager(二叉空间分割)场景管理器比较适合用于室内场景. 第一,添加框架代码如下 #include "Exam ...

随机推荐

  1. cloud turbine

    turbine是聚合服务器发送事件流数据的一个工具,hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过 turbine来监控集群下hystrix的metrics情况,通过eur ...

  2. SpringBoot热部署的两种方式

    SpringBoot热部署方式一共有两种,分别使用两种不同的依赖 SpringBoot 1.3后才拥有SpringBoot devtools热部署 ①:spring-boot-devtools   ② ...

  3. 查询日志logcat使用总结

    cmd命令行中使用adb logcat命令查看Android系统和应用的log,dos窗口按ctrl+c中断输出log记录.logcat日志中的优先级/tag标记: android输出的每一条日志都有 ...

  4. 【Python图像特征的音乐序列生成】关于mingus一个bug的修复,兼改进情感模型

    mingus在输出midi文件的时候,使用这样的函数: from mingus.containers import NoteContainer from mingus.midi import midi ...

  5. HDU - 5491 The Next 2015 ACM/ICPC Asia Regional Hefei Online

    从D+1开始,对于一个数x,区间[x,x+lowbit(x))内的数字的二进制位上1的数量整体来说是单调不减的,因此可快速得出1在这个区间的取值范围. 每次判断一下有没有和[s1,s2]有没有交集,一 ...

  6. uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)

    这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...

  7. [视觉] 基于YoloV3的实时摄像头记牌器

    基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...

  8. [机器学习] 简单的机器学习算法和sklearn实现

    机器学习基础算法理解和总结 KNN算法 理解 KNN其实是最好理解的算法之一,其实就是依次和空间中的每个点进行距离比较,取距离最近的N个点,看这N个点的类别,那么要判断的点的类别就是这N个点中类别占比 ...

  9. Python-OpenCV中的resize()函数

    改变图像大小意味着改变尺寸,无论是单独的高或宽,还是两者.也可以按比例调整图像大小. 这里将介绍resize()函数的语法及实例. 语法 函数原型 cv2.resize(src, dsize[, ds ...

  10. 在DataGridView控件中设置数据显示格式

    实现效果: 知识运用: DataGridViewCellStyle类的Format属性 //获取或设置应用于DataGridView单元格的文本内容的格式字符串 public string Forma ...