OGRE基础教程八 Multiple and Dual SceneManagers

本文介绍如何在Ogre3D中创建和管理两个场景,包括设置场景管理器、摄像头、视口及场景,并实现双场景切换与并排渲染的功能。

英语水平有限,欢迎大家批评指正微笑

本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址: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轴位置,即使他们没有重叠。后两个参数是视口的左和上位置,他们的值必须在01之间。最后两个参数是视口按照屏幕百分比大小的宽和高,他们的值也必须在01之间。所以本例中,我们创建的第一个视口在位置(0,0)并将占有屏幕水平方向一半、垂直方向全部大小,第二个视口在位置(0.5,0)并也会占有屏幕水平方向一半、垂直方向全部大小。

Swapping SceneManagers

   我们要添加到程序中的最后一个功能是当C键被按下时转换场景管理器,为此,当setupViewport()dualViewport()函数被调用时我们首先转换primarySceneMgrsecondarySceneMgr变量,我们永远不需要担心哪个场景管理器在哪个变量中。主场景管理器一直都会在单个模式中显示,而且在双模式中主场景管理器也会一直在左侧。添加如下代码到keyPressed()函数的最后:

   else if(arg.key == OIS::KC_C){

    swap(mPrimarySceneMgr, mSecondarySceneMgr);

    if (mDual)

       dualViewport(mPrimarySceneMgr, mSecondarySceneMgr);

    else

       setupViewport(mPrimarySceneMgr);

   }

   编译运行你的程序!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值