閱讀682 返回首頁    go 阿裏雲 go 技術社區[雲棲]


OGRE學習筆記之一

開始學習3D了,很早就想學了,怎奈數學不好,一直畏懼,可是如果不直麵它,就永遠的害怕,永遠的逃避,這是在很糟.
於是,我終於開始了我的3D之旅.
在學校時候就看上了OGRE,十幾萬行代碼的圖形引擎,它給我的感覺很好.不過奇怪的是國內似乎根本沒有OGRE的社區,曾經是在91看到的,可是那邊早已經荒廢了.

我使用的是OGRE的 1.2.4,VC是VC.net 2003,也就是VC7.1.
我是下載源代碼,自行編譯的,編譯需要兩個包,我選擇了以下兩個包:
OgreDependencies_VC71_1.2.0p2.zip
ogre-win32-v1-2-4.zip
第二個包是引擎的源碼包,解壓縮之.
第一個包是引擎編譯的依存庫,裏麵有兩個文件夾,Samples和Dependencies.Samples是依存庫的DLL文件,而Dependencies是依存庫的頭文件和Lib文件.這兩個文件夾隻要覆蓋掉源碼相同的文件夾就可以了.
接下來就開始進行編譯,編譯的過程是緩慢的,總共得耗費半個小時左右.我還把Debug和Release都編譯出來了,那真是痛苦的過程啊...

引擎我放到了G:\OGRE\OGRE1_2_4,編譯完了引擎的開發包之後,下麵開始設置VC環境了.
Tool->Options->Projects->VC++ Directories.
設置頭文件包含路徑:
1.在Show Directories for選擇Include Files;
2.加入:G:\OGRE\OGRE1_2_4\Dependencies\include,
G:\OGRE\OGRE1_2_4\OgreMain\include
設置Lib庫包含路徑:
1.在Show Directories for選擇Librarys Files;
2.加入G:\OGRE\OGRE1_2_4\OgreMain\lib\Release,
G:\OGRE\OGRE1_2_4\OgreMain\lib\Debug
G:\OGRE\OGRE1_2_4\Dependencies\lib\Release
G:\OGRE\OGRE1_2_4\Dependencies\lib\Debug

這個時候就可以開始我們的第一個OGRE了.
其實,OGRE的引擎源碼包裏麵已經自帶了很多的例子,不過看起來相當之難看,反正我覺得很難讀,於是,我自己按照自己較為熟悉的風格修改了Demo,弄了一個名為Empty的項目,裏麵什麼都沒有做,就是一個空白的窗口(準確說是純黑的窗口).

對於我們這些初學者來說,必須得弄清楚Samples\Common\include下麵的三個頭文件:
ExampleApplication.h
ExampleFrameListener.h
ExampleLoadingBar.h
其實這三個文件和MFC有點形似:
ExampleApplication.h裏麵的類就是應用程序類,它是一個基類;
ExampleFrameListener.h裏麵的類算是一個窗口類,鼠標,鍵盤的檢測都在這裏,還有渲染窗口的刷新等;
ExampleLoadingBar.h其實有沒有也沒什麼關係,粗略看了看,它隻是一個加載條的類.

Empty這個項目有以下文件:
/main.cpp
/Empty.h
/Empty.cpp
/Common/ExampleApplication.h
/Common/ExampleApplication.cpp
/Common/ExampleFrameListener.h
/Common/ExampleFrameListener.cpp
/Common/ExampleLoadingBar.h
/Common/ExampleLoadingBar.cpp
我把上麵的三個公用頭文件拆分出了一個cpp,把實現都丟到了cpp裏麵,之前它們都是直接寫在h裏麵的,對於學習來說,極其難看,就拆開了.

我先把三個項目文件內容列出來:
main.cpp
None.gif#include <windows.h>
None.gif#include "Empty.h"
None.gif
None.gif// =============================================================================
None.gif
// WinMain
None.gif
// -----------------------------------------------------------------------------
ExpandedBlockStart.gif
///
None.gif// =============================================================================
None.gif
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
ExpandedBlockStart.gif{
InBlock.gif
InBlock.gif    // 創建應用程序對象
InBlock.gif
    EmptyApplication app;
InBlock.gif
InBlock.gif    // 進入應用程序循環
ExpandedSubBlockStart.gif
    try {
InBlock.gif        app.go();
ExpandedSubBlockStart.gif    }
 catch( Ogre::Exception& e ) {
InBlock.gif        MessageBox( NULL, e.getFullDescription().c_str(), "應用程序出現異常!", MB_OK | MB_ICONERROR | MB_TASKMODAL );
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    return 0;
ExpandedBlockEnd.gif}

Empty.h
None.gif#include "ExampleApplication.h"
None.gif
None.gifclass EmptyApplication : public ExampleApplication
ExpandedBlockStart.gif{
InBlock.gifpublic:
InBlock.gif    EmptyApplication();
InBlock.gif    ~EmptyApplication();
InBlock.gif
InBlock.gifprotected:
InBlock.gif    void createScene(void);
ExpandedBlockEnd.gif}
;
None.gif
Empty.cpp
None.gif#include <windows.h>
None.gif#include "Empty.h"
None.gif
None.gif// =============================================================================
None.gif
// EmptyApplication
None.gif
// -----------------------------------------------------------------------------
ExpandedBlockStart.gif
///
None.gif// =============================================================================
None.gif
EmptyApplication::EmptyApplication()
ExpandedBlockStart.gif{
ExpandedBlockEnd.gif}
  
None.gif// =============================================================================
None.gif
// ~EmptyApplication
None.gif
// -----------------------------------------------------------------------------
ExpandedBlockStart.gif
///
None.gif// =============================================================================
None.gif
EmptyApplication::~EmptyApplication()
ExpandedBlockStart.gif{
ExpandedBlockEnd.gif}
  
None.gif// =============================================================================
None.gif
// createScene
None.gif
// -----------------------------------------------------------------------------
ExpandedBlockStart.gif
///
None.gif// =============================================================================
None.gif
void EmptyApplication::createScene(void)
ExpandedBlockStart.gif{
ExpandedBlockEnd.gif}
可以看到,根本什麼都沒有做,嗬嗬.

當你第一次運行OGRE的Demo時,你可以看到,每次運行的時候都會彈出一個配置對話框出來,一兩次還沒什麼,多了就很讓人厭煩,恨不得馬上把它踢掉,
OK,我終於把它給踢掉了!不過在此之前,你必須確定你程序運行的當前目錄下有ogre.cfg這個文件,它就是那個配置對話框所配置的東西.內容大致如下:

None.gifRender System=OpenGL Rendering Subsystem
None.gif
None.gif[Direct3D9 Rendering Subsystem]
None.gifAllow NVPerfHUD=No
None.gifAnti aliasing=None
None.gifFloating-point mode=Fastest
None.gifFull Screen=No
None.gifRendering Device=Intel(R) 82915G/GV/910GL Express Chipset Family
None.gifVSync=No
None.gifVideo Mode=800 x 600 @ 32-bit colour
None.gif
None.gif[OpenGL Rendering Subsystem]
None.gifColour Depth=32
None.gifDisplay Frequency=N/A
None.gifFSAA=0
None.gifFull Screen=No
None.gifRTT Preferred Mode=FBO
None.gifVSync=No
None.gifVideo Mode=800 x 600
None.gif
如果沒有這個文件,程序是會掛掉D.
啊,現在我要去掉它,是的,現在我要把這個該死的對話框去掉,打開ExampleApplication.h吧,找到configure()這個函數,你將看到的函數應該是這個樣子的.
ExpandedBlockStart.gif    /** Configures the application - returns false if the user chooses to abandon configuration. */
None.gif    virtual bool configure(void)
ExpandedBlockStart.gif    {
InBlock.gif        // Show the configuration dialog and initialise the system
InBlock.gif        
// You can skip this and use root.restoreConfig() to load configuration
InBlock.gif        
// settings if you were sure there are valid ones saved in ogre.cfg
InBlock.gif
        if(mRoot->showConfigDialog())
ExpandedSubBlockStart.gif        {
InBlock.gif            // If returned true, user clicked OK so initialise
InBlock.gif            
// Here we choose to let the system create a default rendering window by passing 'true'
InBlock.gif
            mWindow = mRoot->initialise(true);
InBlock.gif            return true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        else
ExpandedSubBlockStart.gif        {
InBlock.gif            return false;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }
看到了第二到第四行的注釋沒有?如果你英語還好,就看懂了,知道怎麼做了,如果看不懂,就解釋一下,大致意思是:顯示配置對話框,並初始化係統.你可以忽略掉此對話框,使用 root.restoreConfig() 加載配置.不過你這麼做之前必須確定你設置並且保存了一個ogre.cfg文件.
明白了吧,下麵給出我修改後的代碼:
None.gifbool ExampleApplication::configure()
ExpandedBlockStart.gif{
InBlock.gif    // 顯示配置對話框,並初始化係統.
InBlock.gif    
// 你可以忽略掉此對話框,使用 root.restoreConfig() 加載配置.
InBlock.gif    
// 不過你這麼做之前必須確定你設置並且保存了一個ogre.cfg文件.
InBlock.gif    
//if(mRoot->showConfigDialog())
InBlock.gif
    if(mRoot->restoreConfig())
ExpandedSubBlockStart.gif    {
InBlock.gif        // If returned true, user clicked OK so initialise
InBlock.gif        
// Here we choose to let the system create a default rendering window by passing 'true'
InBlock.gif
        mWindow = mRoot->initialise(true);
InBlock.gif        return true;
ExpandedSubBlockEnd.gif    }

InBlock.gif    else
ExpandedSubBlockStart.gif    {
InBlock.gif        return false;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
非常之簡單,就是把mRoot->showConfigDialog()修改成了mRoot->restoreConfig(),直接加載配置文件.
啊,你應該已經發現了我的修改以後的代碼和之前的代碼不一樣,嗯,是的.因為這個是在cpp裏麵的實現.

翻了一下<Pro OGRE 3D Programming>其實還有更好的代碼,如下:
None.gifbool ExampleApplication::configure()
ExpandedBlockStart.gif{
InBlock.gif    // 顯示配置對話框,並初始化係統.
InBlock.gif    
// 你可以忽略掉此對話框,使用 root.restoreConfig() 加載配置.
InBlock.gif    
// 不過你這麼做之前必須確定你設置並且保存了一個ogre.cfg文件.
InBlock.gif    
//if(mRoot->showConfigDialog())
InBlock.gif
    if(mRoot->restoreConfig())
ExpandedSubBlockStart.gif    {
InBlock.gif        // If returned true, user clicked OK so initialise
InBlock.gif        
// Here we choose to let the system create a default rendering window by passing 'true'
InBlock.gif
        mWindow = mRoot->initialise(true,"渲染窗口");
InBlock.gif        return true;
ExpandedSubBlockEnd.gif    }

InBlock.gif    else
ExpandedSubBlockStart.gif    {
InBlock.gif        if (mRoot->showConfigDialog() )
ExpandedSubBlockStart.gif        {
InBlock.gif            mWindow = mRoot->initialise(true);
InBlock.gif            return true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        else
ExpandedSubBlockStart.gif        {
InBlock.gif            return false;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
如果有ogre.cfg,就讀取,如果沒有的話就新建一個.

OGRE修改窗口標題
OGRE默認的窗口標題為"OGRE Render Window",在哪修改它哪?遠在天邊,近在眼前.就在上麵代碼中的一個函數:mRoot->initialise();
看到了吧,
mWindow = mRoot->initialise(true,"渲染窗口");
這樣,窗口標題就變成了 "渲染窗口"了.

最後更新:2017-10-26 11:04:28

  上一篇:go  遠程數據庫的表超過20個索引的影響
  下一篇:go  法國美女情迷阿裏,成了天貓雙11拚命女郎