開始學習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
#include?<windows.h>
#include?"Empty.h"

//?=============================================================================
//?WinMain
//?-----------------------------------------------------------------------------

/**////
//?=============================================================================
INT?WINAPI?WinMain(?HINSTANCE?hInst,?HINSTANCE,?LPSTR?strCmdLine,?INT?)


{

????//?創建應用程序對象
????EmptyApplication?app;

????//?進入應用程序循環

????try?
{
????????app.go();

????}?catch(?Ogre::Exception&?e?)?
{
????????MessageBox(?NULL,?e.getFullDescription().c_str(),?"應用程序出現異常!",?MB_OK?|?MB_ICONERROR?|?MB_TASKMODAL?);
????}

????return?0;
}Empty.h
#include?"ExampleApplication.h"

class?EmptyApplication?:?public?ExampleApplication


{
public:
????EmptyApplication();
????~EmptyApplication();

protected:
????void?createScene(void);
};

Empty.cpp
#include?<windows.h>
#include?"Empty.h"

//?=============================================================================
//?EmptyApplication
//?-----------------------------------------------------------------------------

/**////
//?=============================================================================
EmptyApplication::EmptyApplication()


{
}??
//?=============================================================================
//?~EmptyApplication
//?-----------------------------------------------------------------------------

/**////
//?=============================================================================
EmptyApplication::~EmptyApplication()


{
}??
//?=============================================================================
//?createScene
//?-----------------------------------------------------------------------------

/**////
//?=============================================================================
void?EmptyApplication::createScene(void)


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

[Direct3D9?Rendering?Subsystem]
Allow?NVPerfHUD=No
Anti?aliasing=None
Floating-point?mode=Fastest
Full?Screen=No
Rendering?Device=Intel(R)?82915G/GV/910GL?Express?Chipset?Family
VSync=No
Video?Mode=800?x?600?@?32-bit?colour

[OpenGL?Rendering?Subsystem]
Colour?Depth=32
Display?Frequency=N/A
FSAA=0
Full?Screen=No
RTT?Preferred?Mode=FBO
VSync=No
Video?Mode=800?x?600

如果沒有這個文件,程序是會掛掉D.
啊,現在我要去掉它,是的,現在我要把這個該死的對話框去掉,打開ExampleApplication.h吧,找到configure()這個函數,你將看到的函數應該是這個樣子的.

????/**//**?Configures?the?application?-?returns?false?if?the?user?chooses?to?abandon?configuration.?*/
????virtual?bool?configure(void)

????
{
????????//?Show?the?configuration?dialog?and?initialise?the?system
????????//?You?can?skip?this?and?use?root.restoreConfig()?to?load?configuration
????????//?settings?if?you?were?sure?there?are?valid?ones?saved?in?ogre.cfg
????????if(mRoot->showConfigDialog())

????????
{
????????????//?If?returned?true,?user?clicked?OK?so?initialise
????????????//?Here?we?choose?to?let?the?system?create?a?default?rendering?window?by?passing?'true'
????????????mWindow?=?mRoot->initialise(true);
????????????return?true;
????????}
????????else

????????
{
????????????return?false;
????????}
????}看到了第二到第四行的注釋沒有?如果你英語還好,就看懂了,知道怎么做了,如果看不懂,就解釋一下,大致意思是:顯示配置對話框,并初始化系統.你可以忽略掉此對話框,使用 root.restoreConfig() 加載配置.不過你這么做之前必須確定你設置并且保存了一個ogre.cfg文件.
明白了吧,下面給出我修改后的代碼:
bool?ExampleApplication::configure()


{
????//?顯示配置對話框,并初始化系統.
????//?你可以忽略掉此對話框,使用?root.restoreConfig()?加載配置.
????//?不過你這么做之前必須確定你設置并且保存了一個ogre.cfg文件.
????//if(mRoot->showConfigDialog())
????if(mRoot->restoreConfig())

????
{
????????//?If?returned?true,?user?clicked?OK?so?initialise
????????//?Here?we?choose?to?let?the?system?create?a?default?rendering?window?by?passing?'true'
????????mWindow?=?mRoot->initialise(true);
????????return?true;
????}
????else

????
{
????????return?false;
????}
}非常之簡單,就是把mRoot->showConfigDialog()修改成了mRoot->restoreConfig(),直接加載配置文件.
啊,你應該已經發現了我的修改以后的代碼和之前的代碼不一樣,嗯,是的.因為這個是在cpp里面的實現.
翻了一下<Pro OGRE 3D Programming>其實還有更好的代碼,如下:
bool?ExampleApplication::configure()


{
????//?顯示配置對話框,并初始化系統.
????//?你可以忽略掉此對話框,使用?root.restoreConfig()?加載配置.
????//?不過你這么做之前必須確定你設置并且保存了一個ogre.cfg文件.
????//if(mRoot->showConfigDialog())
????if(mRoot->restoreConfig())

????
{
????????//?If?returned?true,?user?clicked?OK?so?initialise
????????//?Here?we?choose?to?let?the?system?create?a?default?rendering?window?by?passing?'true'
????????mWindow?=?mRoot->initialise(true,"渲染窗口");
????????return?true;
????}
????else

????
{
????????if?(mRoot->showConfigDialog()?)

????????
{
????????????mWindow?=?mRoot->initialise(true);
????????????return?true;
????????}
????????else

????????
{
????????????return?false;
????????}
????}
}如果有ogre.cfg,就讀取,如果沒有的話就新建一個.
OGRE修改窗口標題
OGRE默認的窗口標題為"OGRE Render Window",在哪修改它哪?遠在天邊,近在眼前.就在上面代碼中的一個函數:mRoot->initialise();
看到了吧,
mWindow = mRoot->initialise(true,"渲染窗口");
這樣,窗口標題就變成了 "渲染窗口"了.