基礎教程八(多情境管理器的運用)

來源:互聯網
上載者:User
摘要

在這個簡短的教程中我們將介紹如何轉換多情境管理器。 你可以在here中找到該教程的源碼。當你學習本教程的時候,你應該逐步得添加代碼到你自己建立的工程中並且觀看執行結果。

先決條件

在你選定的IDE中建立一個cpp檔案,然後添加如下代碼:

#include "ExampleApplication.h"#define CAMERA_NAME "SceneCamera"void setupViewport(RenderWindow *win, SceneManager *curr){}void dualViewport(RenderWindow *win, SceneManager *primary, SceneManager *secondary){}class SMTutorialListener : public ExampleFrameListener, public OIS::KeyListener{public:    SMTutorialListener(RenderWindow* win, SceneManager *primary, SceneManager *secondary)  : ExampleFrameListener(win, primary->getCamera(CAMERA_NAME), true, false),          mPrimary(primary), mSecondary(secondary), mDual(false), mContinue(true)    {        mKeyboard->setEventCallback(this);    }    bool frameStarted(const FrameEvent& evt)    {        mKeyboard->capture();        return mContinue;    }    bool keyPressed(const OIS::KeyEvent &arg)    {       switch (arg.key)       {       case OIS::KC_ESCAPE:           mContinue = false;           break;       default:           break;       }       return true;    }    bool keyReleased(const OIS::KeyEvent &) {return true;}private:    SceneManager *mPrimary, *mSecondary;    bool mDual, mContinue;    static void swap(SceneManager *&first, SceneManager *&second)    {        SceneManager *tmp = first;        first = second;        second = tmp;    }};class SMTutorialApplication : public ExampleApplication{public:    SMTutorialApplication()    {    }    ~SMTutorialApplication()     {    }protected:    SceneManager *mPrimary, *mSecondary;    void chooseSceneManager(void)    {    }    void createCamera()    {    }    void createViewports()    {    }    void createScene(void)    {    }    void createFrameListener(void)    {        mFrameListener = new SMTutorialListener(mWindow, mPrimary, mSecondary);        mFrameListener->showDebugOverlay(true);        mRoot->addFrameListener(mFrameListener);    }};#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN#include "windows.h"INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)#elseint main(int argc, char **argv)#endif{    // Create application object    SMTutorialApplication app;    try {        app.go();    } catch(Exception& e) {#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32        MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);#else        fprintf(stderr, "An exception has occurred: %s/n",            e.getFullDescription().c_str());#endif    }    return 0;}

在你繼續之前,請保證你可以成功編譯這段代碼。但是不要在這裡就執行該程式。

建立工程

建立情境管理器

在前面的教程我們已經學習了情境管理器, 因此我們就不在對此功能進行詳細的說明.我們僅僅只是交換我們所創造的情境。找到 chooseSceneManager ()並將以下代碼添加到裡面:

       mPrimary = mRoot->createSceneManager(ST_GENERIC, "primary");       mSecondary = mRoot->createSceneManager(ST_GENERIC, "secondary");

建立攝像機

接下來我們需要為每一個情境建立一個攝像機,和先前的教程不同的是我們要建立兩個名字相同的攝像機。找出createCamera()並將以下代碼添加到裡面:

       mPrimary->createCamera(CAMERA_NAME);       mSecondary->createCamera(CAMERA_NAME);

Creating the Viewports

在這個工程中建立視口會和我們先前的教程有些不一樣。當你建立視口時,你必須做以下兩件事情: 自己建立一個視口和為你使用的攝像機設定縱橫比。首先,將以下代碼添加到 createViewports()

       setupViewport(mWindow, mPrimary);

將以下代碼添加到 setupViewport()

   win->removeAllViewports();   Camera *cam = curr->getCamera(CAMERA_NAME);   Viewport *vp = win->addViewport(cam);   vp->setBackgroundColour(ColourValue(0,0,0));   cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

建立情境

最後,我們需要為每個情境管理器建立一個情境, 我們不會增加一些複雜的東西, 我們交換兩個情境只需要一點點改動,將下面的代碼添加到createScene ():

       // Setup the TerrainSceneManager       mPrimary->setSkyBox(true, "Examples/SpaceSkyBox");       // Setup the Generic SceneManager       mSecondary->setSkyDome(true, "Examples/CloudySky", 5, 8);

在繼續之前你要保證你的程式能夠正確的編譯通過. 你可以在現在編譯你的程式但是在程式中除了退出沒有其他的功能了!

添加功能

添加功能

在做第一件的功能,我們希望添加到該程式使其允許使用者使兩個SceneManagers()並排側。當V鍵被按下時,我們將視口切換的雙模式。這是簡單的基本計劃。要關閉雙視口模式,我們只需調用setupViewport(我們在上一節建立的主要情境管理器)重新建立單一模式的視口。當我們想開啟它,我們將調用一個新的函數調用dualViewport。我們將繼續對視口的狀態變數與mDual軌道。添加以下代碼到keyPressed():

       case OIS::KC_V:           mDual = !mDual;           if (mDual)               dualViewport(mWindow, mPrimary, mSecondary);           else               setupViewport(mWindow, mPrimary);           break;

在我們現在所處的基礎上已經用適當的方式交換了mDual變數和函數調用,我們將確定dualViewport()實際上包含的代碼,以顯示在一次兩個視口。

為了顯示並排兩個SceneManagers,我們基本上做同樣的事情,我們已在setupViewport函數完成。唯一的區別是,我們將建立兩個視口,和SceneManagers裡的相機之一。下面的代碼添加到dualViewport():

   win->removeAllViewports();   Viewport *vp = 0;   Camera *cam = primary->getCamera(CAMERA_NAME);   vp = win->addViewport(cam, 0, 0, 0, 0.5, 1);   vp->setBackgroundColour(ColourValue(0,0,0));   cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));   cam = secondary->getCamera(CAMERA_NAME);   vp = win->addViewport(cam, 1, 0.5, 0, 0.5, 1);   vp->setBackgroundColour(ColourValue(0,0,0));   cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

所有這一切都應該很熟悉,除了我們已經添加到addViewport函數調用額外的參數。第一個參數這個函數仍然是我們所使用的相機。第二個參數是視口Z順序(相當於深度緩衝)。Z值大的會顯示在Z值小的前面。請注意,你不能有相同的Z順序兩個視口,即使他們不重疊。接下來的兩個參數是視口,左側和頂部位置,必須介於0和1。最後兩個參數是寬度和作為螢幕比例的視口的高度(同樣,他們必須在0和1)。因此,在這種情況下,我們建立第一個視口將在位置(0,0),將在螢幕的一半水平,所有螢幕都是垂直。第二個將在視口位置(0.5,0),並採取了一半的水平空間和垂直空間的。

編譯並運行應用程式。按下V你現在可以顯示在同一時間兩個SceneManagers。

交換情境

在功能上,我們要添加到我們的計劃是每當C鍵被按下要交換SceneManagers。為了做到這一點,我們會先換上mPrimary和mSecondary變數,這樣,當setupViewport或dualViewport函數調用,我們永遠不必擔心情境管理器中的變數。主要情境管理器將始終顯示在單一模式,另一個將始終在dualViewport模式的左側。添加以下代碼到keyPressed():

       case OIS::KC_C:           swap(mPrimary, mSecondary);

最後我們交換變數,我們需要實際執行的變化。所有我們所要做的就是調用適當的視口設定功能,我們是否在不同的單或雙模式:

           if (mDual)               dualViewport(mWindow, mPrimary, mSecondary);           else               setupViewport(mWindow, mPrimary);           break;

就是這樣!編譯並運行應用程式。現在我們可以換一個C鍵的SceneManagers,並交換與V鍵單模和雙模

建議

Overlays

我確保你在程式中會發現,當你在雙視口模式下運行,調試的模式下的Ogre覆蓋顯示了雙方。你可能會關閉在覆蓋在視口的顯示。使用視口::setOverlaysEnabled功能開啟和關閉它們。我有此相對簡單的改變的本教程的全部原始碼full source,所以如果你不知如何做到這一點,請查看相關細節和網頁。

最後

始終牢記的視口類,雖然沒有很多的功能本身,就是對所有食人魔渲染的關鍵。不要緊,你有多少SceneManagers建立或在每個情境管理器多少相機時,他們都將呈現給視窗,除非您設定每個攝像機你呈現口。也不要忘記清除你不使用的之前創造的視口!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.