• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            OGRE學習筆記之一

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

            我使用的是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,編譯完了引擎的開發(fā)包之后,下面開始設置VC環(huán)境了.
            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的引擎源碼包里面已經(jīng)自帶了很多的例子,不過看起來相當之難看,反正我覺得很難讀,于是,我自己按照自己較為熟悉的風格修改了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,把實現(xiàn)都丟到了cpp里面,之前它們都是直接寫在h里面的,對于學習來說,極其難看,就拆開了.

            我先把三個項目文件內(nèi)容列出來:
            main.cpp
            #include?<windows.h>
            #include?
            "Empty.h"

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

            ????
            //?創(chuàng)建應用程序?qū)ο?/span>
            ????EmptyApplication?app;

            ????
            //?進入應用程序循環(huán)
            ????try?{
            ????????app.go();
            ????}
            ?catch(?Ogre::Exception&?e?)?{
            ????????MessageBox(?NULL,?e.getFullDescription().c_str(),?
            "應用程序出現(xiàn)異常!",?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這個文件,它就是那個配置對話框所配置的東西.內(nèi)容大致如下:

            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.
            啊,現(xiàn)在我要去掉它,是的,現(xiàn)在我要把這個該死的對話框去掉,打開ExampleApplication.h吧,找到configure()這個函數(shù),你將看到的函數(shù)應該是這個樣子的.
            ????/**?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;
            ????????}

            ????}
            看到了第二到第四行的注釋沒有?如果你英語還好,就看懂了,知道怎么做了,如果看不懂,就解釋一下,大致意思是:顯示配置對話框,并初始化系統(tǒng).你可以忽略掉此對話框,使用 root.restoreConfig() 加載配置.不過你這么做之前必須確定你設置并且保存了一個ogre.cfg文件.
            明白了吧,下面給出我修改后的代碼:
            bool?ExampleApplication::configure()
            {
            ????
            //?顯示配置對話框,并初始化系統(tǒng).
            ????
            //?你可以忽略掉此對話框,使用?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(),直接加載配置文件.
            啊,你應該已經(jīng)發(fā)現(xiàn)了我的修改以后的代碼和之前的代碼不一樣,嗯,是的.因為這個是在cpp里面的實現(xiàn).

            翻了一下<Pro OGRE 3D Programming>其實還有更好的代碼,如下:
            bool?ExampleApplication::configure()
            {
            ????
            //?顯示配置對話框,并初始化系統(tǒng).
            ????
            //?你可以忽略掉此對話框,使用?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",在哪修改它哪?遠在天邊,近在眼前.就在上面代碼中的一個函數(shù):mRoot->initialise();
            看到了吧,
            mWindow = mRoot->initialise(true,"渲染窗口");
            這樣,窗口標題就變成了 "渲染窗口"了.

            posted on 2007-01-23 17:07 楊粼波 閱讀(2872) 評論(3)  編輯 收藏 引用

            評論

            # re: OGRE學習筆記之一 2007-01-31 09:37 gameogre

            你有Pro OGRE 3D Programming的電子版嗎?可否共享一下,謝謝。
            gameogre@gmail.com  回復  更多評論   

            # re: OGRE學習筆記之一 2007-02-02 21:13 wstorm

            能給我一份嗎? wstorm910@163.com  回復  更多評論   

            # re: OGRE學習筆記之一[未登錄] 2007-02-03 14:35 大橘子

            只是第四章,是Apress放出來的試讀版,可以去其官方網(wǎng)站查詢到.

            完整版我自己還在找哪,找到了自然會給各位一份的.  回復  更多評論   

            亚洲国产精品成人AV无码久久综合影院 | 亚洲精品高清一二区久久| 99久久这里只精品国产免费| 久久天天躁狠狠躁夜夜avapp| 热re99久久精品国产99热| 亚洲国产日韩欧美综合久久| 久久婷婷五月综合色高清| 国产福利电影一区二区三区久久老子无码午夜伦不 | 午夜精品久久久久9999高清| 亚洲va久久久噜噜噜久久 | 久久国产福利免费| 老色鬼久久亚洲AV综合| 免费一级欧美大片久久网| 国产精品99精品久久免费| 日韩中文久久| 麻豆精品久久久一区二区| 亚洲午夜久久久久久久久久| 国产成人精品综合久久久| 久久99热只有频精品8| 欧美亚洲国产精品久久高清| 亚洲一区中文字幕久久| 精品久久人妻av中文字幕| 国产69精品久久久久观看软件| 久久99国产精品成人欧美| 国产精品毛片久久久久久久| 色欲综合久久中文字幕网| 亚洲欧美日韩久久精品| 日韩中文久久| 亚洲国产精品综合久久一线| 久久精品综合一区二区三区| AAA级久久久精品无码片| 久久亚洲精品成人av无码网站| 久久久无码精品亚洲日韩京东传媒| 国产精品久久久久一区二区三区| 国产精品久久久久久福利69堂| 亚洲中文久久精品无码| 亚洲乱码中文字幕久久孕妇黑人| 久久SE精品一区二区| 国产精品99久久久精品无码| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久精品国产99国产精品澳门|