OGRE基础教程八 Multiple and Dual SceneManagers
来源:互联网 发布:灌篮高手 爱知学院 编辑:程序博客网 时间:2024/06/03 13:02
英语水平有限,欢迎大家批评指正
本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+8&structure=Tutorials
Setting up the Application
Creating the SceneManagers
前面我们已经讲过了如何选择你的场景管理器(SceneManager),现在我们要创建两个场景管理器。添加如下代码到chooseSceneManager函数:
mPrimarySceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "primary");
mSecondarySceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "secondary");
Creating the Cameras
下面为每个场景管理器用同一个名字创建一个Camera,添加如下代码到createCamera函数中:
mPrimarySceneMgr->createCamera(CAMERA_NAME);
mSecondarySceneMgr->createCamera(CAMERA_NAME);
Creating the Viewports
本程序创建视口时,我们将与前面的教程有些小出入。当你创建视口时,必须做两件事:设置视口和设置你要使用的摄像机的方向比率(aspect ratio)。添加如下代码到createViewports函数中:
setupViewport(mPrimarySceneMgr);
设置视口的代码在setupViewport()函数中,第一我们要移除之前创建的所有视口,在我们调用这个函数之前要确保创建新的视口前老的视口都被移除了。之后我们要设置视口,在文件最上面添加如下代码到setupViewport()函数中:
mWindow->removeAllViewports();
Ogre::Camera *cam = curr->getCamera(CAMERA_NAME); //The Camera
Ogre::Viewport *vp = mWindow->addViewport(cam); //Our Viewport linked to the camera
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
Creating the Scene
最后,我们需要为每个场景管理器创建一个场景,添加如下代码到createScene函数中:
// Set up the space SceneManager
mPrimarySceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
// Set up the Cloudy SceneManager
mSecondarySceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
Adding Functionality
Dual SceneManagers
我们要添加的第一个功能就是允许用户将两个场景管理器并排渲染出来。但V键被按下时,我们将启动双视口模式。用主场景管理器调用setupViewport函数重新创建视口为单个模式,来关闭双视口模式。当我们要打开双模式时,我们将调用一个新函数dualViewport。我们使用mDual来保存视口的状态,添加如下代码到keyPressed()函数的最后:
else if(arg.key == OIS::KC_V){
mDual = !mDual;
if (mDual)
dualViewport(mPrimarySceneMgr, mSecondarySceneMgr);
else
setupViewport(mPrimarySceneMgr);
}
下面定义dualViewport()函数,为了将两个场景管理器一起显示出来,我们要做和在setupViewport()函数中一样的事情。唯一的不同就是我们要创建两个视口,各自对应一个场景管理器创建的摄像机。添加如下代码到dualViewport()函数中:
mWindow->removeAllViewports();
Ogre::Viewport *vp = 0;
Ogre::Camera *cam = primarySceneMgr->getCamera(CAMERA_NAME);
vp = mWindow->addViewport(cam, 0, 0, 0, 0.5, 1);
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
cam = secondarySceneMgr->getCamera(CAMERA_NAME);
vp = mWindow->addViewport(cam, 1, 0.5, 0, 0.5, 1);
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
addViewport函数的第一个参数是我们使用的摄像机,第二个参数是视口的Z轴位置。高Z轴位置在低Z轴位置之上。注意两个视口不能有相同的Z轴位置,即使他们没有重叠。后两个参数是视口的左和上位置,他们的值必须在0到1之间。最后两个参数是视口按照屏幕百分比大小的宽和高,他们的值也必须在0到1之间。所以本例中,我们创建的第一个视口在位置(0,0)并将占有屏幕水平方向一半、垂直方向全部大小,第二个视口在位置(0.5,0)并也会占有屏幕水平方向一半、垂直方向全部大小。
Swapping SceneManagers
我们要添加到程序中的最后一个功能是当C键被按下时转换场景管理器,为此,当setupViewport()或dualViewport()函数被调用时我们首先转换primarySceneMgr和secondarySceneMgr变量,我们永远不需要担心哪个场景管理器在哪个变量中。主场景管理器一直都会在单个模式中显示,而且在双模式中主场景管理器也会一直在左侧。添加如下代码到keyPressed()函数的最后:
else if(arg.key == OIS::KC_C){
swap(mPrimarySceneMgr, mSecondarySceneMgr);
if (mDual)
dualViewport(mPrimarySceneMgr, mSecondarySceneMgr);
else
setupViewport(mPrimarySceneMgr);
}
编译运行你的程序!
- OGRE基础教程八 Multiple and Dual SceneManagers
- OGRE基础教程七 CEGUI and Ogre
- OGRE基础教程 二 Cameras, Lights, and Shadows
- OGRE基础教程三 Terrain, Sky, and Fog
- Ogre笔记八:基础教程五—缓冲输入
- OGRE基础教程四 Frame Listeners and Unbuffered Input
- Ogre笔记十二:基础教程八—多场景管理器的运用
- OGRE基础教程六 The Ogre Startup Sequence
- OGRE基础教程1(上)
- OGRE基础教程1(下)
- 基础教程六(CEGUI和OGRE)
- OGRE基础教程五 Buffered Input
- OGRE基础教程1(上)
- OGRE基础教程1(下)
- ogre学习笔记-基础教程345
- HTML 基础教程(八)
- Objective-C基础教程八
- JS 基础教程八
- 关于电子商务运营
- OGRE基础教程七 CEGUI and Ogre
- 同步与异步
- 软件测试常见面试题
- python 随机数
- OGRE基础教程八 Multiple and Dual SceneManagers
- 清除Firefox下Flash(swf文件)缓存
- 改变CXF WEBSERVICE 日志输出方式
- android 修改权限无法开机解决方案 (没有删除数据的前提下)
- Android service与thread的选择
- 安装postgis2.0.1出错configure error: could not find gdal
- 第一章:JavaScript基础---(三)转义字符
- OGRE中级教程一 Animation, Walking Between Points, and Basic Quaternions
- OGRE中级教程二 RaySceneQueries and Basic Mouse Usage