zoukankan      html  css  js  c++  java
  • 《原創》建立最基礎的 Irrlicht 3D 引擎的應用框架。(for vc2008)

    1. Abstract
    建立最基礎的 Irrlicht 3D 引擎的應用框架。(for vc2008)

    2. Introduction
    2-1. 這個框架是我們在讀 Irrlicht 的一系列範例教學最基礎的部份,在官方的教學範例中大部份都由這個框架開始展開。

    2-2. 關於專案檔的建立請參考這邊:
    http://www.gamelife.idv.tw/viewtopic.php?t=1617

    2-3. 現在讓我們一步一步來慢慢完成這框架。

    STEP1. 應用程式的入口函式:

    int main(int argc, char **argv)
    {
        return 0;
    }
    

    a. 加入專案的第一隻檔案也是唯一的叫 "main.cpp"
    b. 加入入口函式 (the entry point of application)
     

    STEP2. 引入 Irrlicht 3D 引擎的表頭檔:

    #ifdef _MSC_VER
    #pragma comment(lib, "Irrlicht.lib")
    #endif
    #include <irrlicht.h>
    
    int main(int argc, char **argv)
    {
        return 0;
    }
    

    a. _MSC_VER 這個 Macro 表明我們是使用 vc 系列的編譯器,它表示 vc 編譯器的版本資訊。
    b. #pragma comment(lib, "Irrlicht.lib") 告訴 Linker 我們要需要聯結這個函式庫進來。

    STEP3. 建立 Irrlicht 3D 引擎最重要的物件 irr::IrrlichtDevice:

    #ifdef _MSC_VER
    #pragma comment(lib, "Irrlicht.lib")
    #endif
    #include <irrlicht.h>
    
    int main(int argc, char **argv)
    {
        irr::IrrlichtDevice *device = irr::createDevice(irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9,
                                                        irr::core::dimension2du(1024,768),
                                                        32, false, false, false, 0);
        if(!device)
            return 1;
    
        return 0;
    }
    

    a. 這裡我們不用 namespace 將 Irrlicht 3D 引擎中相關的名稱空間都 export 出來,而是全都都寫上讓大家可以知道他在那個 namespace 中。
    b. 關於 createDevice 函式說明如下:
    param1: irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9 表示我們希望用 direct3d9 當我們底層的3D處理函式庫。除了d3d9我們還可以選 OpenGL 等...。
    param2: 視窗的大小, 這裡我們希望有一個 1024x768 大小的視窗。
    param3: 顏色深度。
    param4: 是否使用全螢幕模式。
    param5: 是否使用 Stencil Buffer。(如果我們希望有陰影時這個要打開)
    param6: 是否使用垂直同步。(一般而言我們希望自己控制 rendering 的速度)
    param7: 這裡是一個 irr::IEventReceiver 的指標, 當我們需要自定一些我們自己的鍵盤或滑鼠的控制,我們需要寫一個繼承於 irr::EventReceiver 的類別。


    STEP4. 取得 Irrlicht 3D 引擎中的相關的管理器。

    #ifdef _MSC_VER
    #pragma comment(lib, "Irrlicht.lib")
    #endif
    #include <irrlicht.h>
    
    int main(int argc, char **argv)
    {
        irr::IrrlichtDevice *device = irr::createDevice(irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9,
                                                        irr::core::dimension2du(1024,768),
                                                        32, false, false, false, 0);
        if(!device)
            return 1;
    
        irr::video::IVideoDriver  *driver = device->getVideoDriver();    // 取得影像驅動器: 管理底層的 3D API 處理函式庫。
        irr::scene::ISceneManager *smgr   = device->getSceneManager();   // 取得場景管理器: 管理場景中的 Mesh, Node, Camera 等等...
        irr::gui::IGUIEnvironment *guienv = device->getGUIEnvironment(); // 取得GUI管理器: 管理UI的。
    
        return 0;
    }
    

     
    STEP5. 建立遊戲迴圈: Game-Loop

    #ifdef _MSC_VER
    #pragma comment(lib, "Irrlicht.lib")
    #endif
    #include <irrlicht.h>
    
    int main(int argc, char **argv)
    {
        irr::IrrlichtDevice *device = irr::createDevice(irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9,
                                                        irr::core::dimension2du(1024,768),
                                                        32, false, false, false, 0);
        if(!device)
            return 1;
    
        irr::video::IVideoDriver  *driver = device->getVideoDriver();    // 取得影像驅動器: 管理底層的 3D API 處理函式庫。
        irr::scene::ISceneManager *smgr   = device->getSceneManager();   // 取得場景管理器: 管理場景中的 Mesh, Node, Camera 等等...
        irr::gui::IGUIEnvironment *guienv = device->getGUIEnvironment(); // 取得GUI管理器: 管理UI的。
    
        while(device->run())
        {
            if(device->isWindowActive())
            {
                driver->beginScene(true, true, irr::video::SColor(255,100,100,140));
                smgr->drawAll();
                guienv->drawAll();
                driver->endScene();
            }
            else
            {
                device->yield();
            }
        }
    
        return 0;
    }

    a. 遊戲迴圈從一個 while(device->run()) 開始,當收到 WM_QUIT 結束迴圈。
    b. if(device->isWindowActive()) 表示我們希望當視窗是作用中的狀態才去做繪圖。
    c. 真正的繪圖發生在 driver->beginScene() 跟 driver->endScene() 中。
    d. irr::video::SColor(255,100,100,140) 它的格式為 A,R,G,B 這裡表示我們希望在繪圖前先把畫布清為我們指定的顏色。

    STEP6. 釋放資源

    #ifdef _MSC_VER
    #pragma comment(lib, "Irrlicht.lib")
    #endif
    #include <irrlicht.h>
    
    int main(int argc, char **argv)
    {
        irr::IrrlichtDevice *device = irr::createDevice(irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9,
                                                        irr::core::dimension2du(1024,768),
                                                        32, false, false, false, 0);
        if(!device)
            return 1;
    
        irr::video::IVideoDriver  *driver = device->getVideoDriver();    // 取得影像驅動器: 管理底層的 3D API 處理函式庫。
        irr::scene::ISceneManager *smgr   = device->getSceneManager();   // 取得場景管理器: 管理場景中的 Mesh, Node, Camera 等等...
        irr::gui::IGUIEnvironment *guienv = device->getGUIEnvironment(); // 取得GUI管理器: 管理UI的。
    
        while(device->run())
        {
            if(device->isWindowActive())
            {
                driver->beginScene(true, true, irr::video::SColor(255,100,100,140));
                smgr->drawAll();
                guienv->drawAll();
                driver->endScene();
            }
            else
            {
                device->yield();
            }
        }
    
        device->drop();
        return 0;
    }
    

    a. device->drop() 釋放掉先前由 createDevice 所建立的相關資源。像是影像驅動器、場景管理器、場景管理器等。當然由自己建立就自己去Release了。
    b. 關於釋放資源這個部份,就要請大家自己參考 irr::IReferenceCounted。Irrlicht 3D 引擎採用一種引用計數的策略來做管理,這個部份就不在今日的主題上了。
    c. 整個來說這就完成最基礎的 Irrlicht 3D 引擎的應用框架。

    3. Conclusion
    1.在學習 Irrlicht 3D 引擎您必須要會C++,這是必須的因為它是用C++寫的。
    2.在學習 Irrlicht 3D 引擎是否需要先學 Direct3D 或 OpenGL與電腦圖學,就小弟的經驗上來說他是可以同時進行的,但學習沒有法則因人而異
    3.一般來說就入門來講,不懂 Direct3D 或 OpenGL 或電腦圖學並不影響,但要深入的話左述所提的部份還是須要的。

    4. Reference
    1. http://irrlicht.sourceforge.net/

    範例檔

  • 相关阅读:
    [洛谷P4774] [NOI2018]屠龙勇士
    [洛谷P3338] [ZJOI2014]力
    [洛谷P1707] 刷题比赛
    svn查看指定版本提交信息的命令
    ajax无刷新上传文件
    给docker里的php安装gd扩展
    PHP基于openssl实现的非对称加密操作
    php获取文件扩展名
    javascript格式化日期
    javascript获取url参数
  • 原文地址:https://www.cnblogs.com/awen/p/2346351.html
Copyright © 2011-2022 走看看