OGRE基础教程八 Multiple and Dual SceneManagers
2012-11-05 19:14
253 查看
英语水平有限,欢迎大家批评指正
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
[b]本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+8&structure=Tutorials[/b]
前面我们已经讲过了如何选择你的场景管理器(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);
}
编译运行你的程序!
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
[b]本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+8&structure=Tutorials[/b]
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基础教程四 Frame Listeners and Unbuffered Input
- OGRE基础教程七 CEGUI and Ogre
- OGRE中级教程二 RaySceneQueries and Basic Mouse Usage
- OGRE中级教程三 Mouse Picking(3D Object Selection) and SceneQuery Masks
- 【Cocos2d-x-基础概念】Director Scene Layer and Sprite
- OGRE教程SceneNode, Entity, SceneManager and Get start 的讲解
- 【Cocos2d-x-基础概念】Director Scene Layer and Sprite
- Ogre笔记九:基础教程六—CEGUI和Ogre
- [OGRE]基础教程来四发:来谈一谈地形系统
- [OGRE]基础教程来七发:来谈一谈缓冲绑定
- [OGRE]基础教程来七发:来谈一谈缓冲绑定
- OGRE基础教程1(上)
- Ogre基础教程7:CEGUI 与 Ogre(未完成)
- [unity3D基础教程]Unity3D材质与着色器 Materials and Shaders
- OGRE基础教程1(下)
- OGRE基础教程 一 SceneManager、SceneNode、Entity
- 《learn objective-c on the Mac for OS X and IOS》<译名>《objective-C基础教程》
- (一)UITabBar and UINavigationController基础教程之切换页面
- OGRE 引擎官方基础教程 (七) OGRE 和 CEGUI
- eclipse及插件安装基础教程[copy and verify from web]