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轴位置,即使他们没有重叠。后两个参数是视口的左和上位置,他们的值必须在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);

  }

  编译运行你的程序!