ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头。
基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友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 -- 交换两个场景管理器的更多相关文章
- ogre3D学习基础11 -- 日志文件的使用与异常处理
用文件来记录 Ogre 系统初始化.运行.结束以及调试信息.使用日志便于我们调试程序.Ogre 日志系统由两个类组成:Log 类与 LogManager. 1.Log类 Log 类的一个对象对应于一个 ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础6---场景管理器的使用
场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...
- ogre3D学习基础16 -- 手动创建实体(ManualObject)
这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板 #include "ExampleApplication.h" class Example1 ...
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙. 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 #include "Ex ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
- ogre3D学习基础8 --- 资源管理器
资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术.通路.纹理单元等数据的定义). 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh.包含几何信息和一些 ...
- ogre3D学习基础17 --- 如何手动创建ogre程序
建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...
- ogre3D学习基础15 -- 创建BSP Scene Manager
BSP(binary-space partitioning) Scene Manager(二叉空间分割)场景管理器比较适合用于室内场景. 第一,添加框架代码如下 #include "Exam ...
随机推荐
- 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态
2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行.两天议程满满,包括 17 个主旨演讲.8 个分会场的 88 场技 ...
- 基于FPGA的DDS任意波形发生器设计
一.简介 DDS技术最初是作为频率合成技术提出的,由于其易于控制,相位连续,输出频率稳定度高,分辨率高, 频率转换速度快等优点,现在被广泛应用于任意波形发生器(AWG).基于DDS技术的任 ...
- Linux中根据访问日志统计访问量最高的前N个IP
前段时间面试中被问到如上问题,日常不怎么注意积累,以此谨记. 访问IP 页面[nxuser@im440-zh test]$ vi log 135.252.172.181 page1 136.252.1 ...
- 查看nvidia的GPU
nvidia-smi就可以查看,可以看到进程的占用率,可以kill杀掉进程 注意这里的-前后都不要空格,连起来写
- WINDOWS-API:关于线程CreateThread,_beginthead(_beginthreadex),AfxBeginThread
[转]windows多线程编程CreateThread,_beginthead(_beginthreadex)和AfxBeginThread的区别 在Windows的多线程编程中,创建线程的函数主要有 ...
- IDEA安装及破解
一.下载(IDEA 2019.1.2) 1.下载地址:https://www.jetbrains.com/idea/download/#section=windows 2.选择版本,并选择最终版(.e ...
- MySql下最好用的数据库管理工具是哪个
MySql下最好用的数据库管理工具是哪个? 维基上有个很全的列表: https://en.wikipedia.org/wiki/Comparison_of_database_tools 1. ph ...
- c++ json字符串转换成map管理
在cocos2dx for lua中,我们经常通过lua的table传入c++使用,然后早c++层操作数据. 实现步骤大致如下: table->string->c++层->通过rap ...
- iOS9适配总结
每年iOS升级,都会带来一些坑,这次iOS9也不例外.本文总结了微信在适配iOS9上遇到的问题和解决方案. 一.iOS9问题汇总 1. 编译问题(Bitcode) 大部分人升级到Xcode7后,首 ...
- 【转】vxworks的default boot line说明
boot程序的主要功能是引导vxworks 内核,所以boot程序需要知道vxworks的内核存放在何处,通过什么手段去获取.在vxworks缺省的boot程序里有一条内建的default boot ...