Root類Ogre的程序所需要作的第一件事情就是實例化一個.ppt_第1頁
Root類Ogre的程序所需要作的第一件事情就是實例化一個.ppt_第2頁
Root類Ogre的程序所需要作的第一件事情就是實例化一個.ppt_第3頁
Root類Ogre的程序所需要作的第一件事情就是實例化一個.ppt_第4頁
Root類Ogre的程序所需要作的第一件事情就是實例化一個.ppt_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Root類: Ogre的程序所需要作的第一件事情就是實例化一個Root對象。 Root類的構(gòu)造函數(shù): Root * root = new Root(); Root * root = new Root(“plugins.cfg”); Root * root = new Root(“plugins.cfg”, “ogre.cfg”); Root * root = new Root(“plugins.cfg”, “ogre.cfg”, “ogre.log”); Root * root = new Root(“”, “”);,第2課 Ogre應(yīng)用程序基礎(chǔ),plugins.cfg文件 在啟動的Ogre時

2、候,會載入plugins.cfg配置文件來查看有哪些插件可以被使用。 # Defines plugins to load # Define plugin folder PluginFolder=. /PluginFolder標簽的值告訴了Ogre到哪個目錄下找下面所使用得的插件。 # Define plugins/Ogre載入的具體插件 Plugin=RenderSystem_Direct3D9 Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_BSPSceneManager Plugin=Plugin_OctreeSc

3、eneManager Plugin=Plugin_CgProgramManager,第2課 Ogre應(yīng)用程序基礎(chǔ),渲染窗口 可以調(diào)用Root對象的initialise()方法來進行系統(tǒng)初始化: root-initialise(true, ”My Render Window”); RenderWindow * window =root-getAutoCreatedWindow (); initialise方法的第一個參數(shù)告知Ogre系統(tǒng)是否自動建立一個渲染窗口來給用戶使用。在我們這里選擇了簡單的方法,讓Ogre給我們提供渲染窗口。 第二個參數(shù)并且把“My Render Window”作為程序窗口

4、的標題。在這里如果沒有提供你自己的窗口標題,那程序就會使用默認的“OGRE Render Window”。 第二行代碼可以用來得到自動創(chuàng)建的渲染窗口實例的指針。,第2課 Ogre應(yīng)用程序基礎(chǔ),Ogre需要攝影機(Camera)來“拍攝” 場景: Camera * cam = sceneMgr -createCamera(“MainCamera”); cam-setNearClipDistance(5); cam-setFarClipDistance(1000); cam-setAspectRatio(Real(1.333333); 場景管理器是一個生產(chǎn)在你場景中不同對象實體的“工廠”。通過簡單

5、調(diào)用SceneManager的createCamera()方法,就能得到一個新的攝像機實例。之后你就可以使用這臺攝像機來拍攝渲染你的場景了。,第2課 Ogre應(yīng)用程序基礎(chǔ),創(chuàng)建一個視口“Viewport”: Viewport * vp = window-addViewport(camera); vp-setBackgroundColour(ColourValue(0, 0, 0); 代碼創(chuàng)建了一個視口對象的實例,同時我們也設(shè)置了視口(viewport)的背景顏色。,第2課 Ogre應(yīng)用程序基礎(chǔ),渲染循環(huán): 調(diào)用Root對象的srartRendering()方法開始渲染你的場景: root-st

6、artRendering(); 在調(diào)用之后,Ogre就會不斷地渲染在你場景中所有能被渲染的東西。 你可以通過關(guān)閉渲染窗口來結(jié)束這個過程。 當你在注冊了幀監(jiān)聽(Frame Listener)對象,然后在回調(diào)結(jié)束后返回一個false值給系統(tǒng),同樣也能結(jié)束程序渲染。,第2課 Ogre應(yīng)用程序基礎(chǔ),幀監(jiān)聽: 如果決定使用startRender()來開始你的渲染過程,你就只能通過使用幀監(jiān)聽對象來在渲染循環(huán)中插入你自己的代碼了。 所謂幀監(jiān)聽對象就是一個符合FrameListener接口的類的實例。當Ogre渲染每一幀的開始和結(jié)束的時候會回調(diào)FrameListener接口的方法。 當程序執(zhí)行的時候,會在每一

7、次進入Ogre渲染管線之前調(diào)用你定義的frameStarted()方法。,第2課 Ogre應(yīng)用程序基礎(chǔ),實例代碼: class MyFrameListener : public FrameListener public: bool frameStarted (const FrameEvent ,第2課 Ogre應(yīng)用程序基礎(chǔ),實例代碼: Root * root = new Root(); MyFrameListener myListener; /在這里你需要在調(diào)用startRendering()方法前,注冊你的幀監(jiān)聽對象! root-addFrameListener(,第2課 Ogre應(yīng)用程序基

8、礎(chǔ),深入理解Ogre程序: 手動載入插件 Root提供了兩種方法來處理手動載入插件: void loadPlugin(const String #endif,第2課 Ogre應(yīng)用程序基礎(chǔ),Ogre程序已有的插件: Plugin_OctreeSceneManager:以八叉樹空間管理為基礎(chǔ)的OctreeSceneManager(八叉樹場景管理器OSM)。同時包含了從其中派生出來的TerrainSceneManager(地形場景管理器),用來處理從高度圖(heightMapped)派生出來的地形場景。 Plugin_BSPSceneManager:提供一個對BSP場景的管理系統(tǒng),用來讀取和處理來自

9、雷神之錘III中的地圖文件。不過在今天看來這已經(jīng)是一個古老的地圖格式,并且已經(jīng)沒有人再維護和支持它了(提供這個插件的唯一原因是為了某個演示程序的執(zhí)行)。 Plugin_CgProgramManager:這個插件負責(zé)載入、分析、編譯并且管理Cg語言所寫的GPU渲染程序。在今天看來,似乎Cg逐漸被當今技術(shù)所拋離(它只能支持3.0版本以前的profiles),因此其價值也越來越??;幸好Ogre在其內(nèi)部同時支持HLSL和GLSL程序的GPU開發(fā)。,第2課 Ogre應(yīng)用程序基礎(chǔ),Ogre程序已有的插件: Plugin_ParticleFX:粒子系統(tǒng)管理插件;提供了很多粒子的效果器(Affector)和發(fā)

10、射器(Emitter),用來實現(xiàn)一些基本的粒子特效。 RenderSystem_Direct3D9:Windows上面對Direct3D 9的抽象層實現(xiàn) RenderSystem_GL:針對所有平臺上OpenGL的抽象層實現(xiàn)。,第2課 Ogre應(yīng)用程序基礎(chǔ),2. 載入渲染系統(tǒng): Root類提供了用來確認那些API可以被使用的getAvailableRenderers()方法: RenderSystemList* getAvailableRenderers(); Root同時也提供了一些用于設(shè)置和得到已經(jīng)載入渲染系統(tǒng)的方法: void addRenderSystem(RenderSystem*

11、naeRend); RenderSystem* getRenderSystemByName(const String,第2課 Ogre應(yīng)用程序基礎(chǔ),實例代碼: /RenderSystemList是std:vector類型 RenderSystemList *rList = root-getAvailableRenderers(); RenderSystemList:iterator it = rList-begin(); while(it != rList-end() /Ogre的字符串類型String是std:string的擴展 RenderSystem *rSys = *(it+); if

12、(rSys-getName().find(“OpenGL”) /把OpenGL渲染系統(tǒng)設(shè)置為我們使用的渲染系統(tǒng) root-setRenderSystem(rSys); Break; /注意,如果系統(tǒng)沒有支持OpenGL的話,我們就沒有設(shè)置任何渲染系統(tǒng)!這將會引起一個Ogre設(shè)置期間的異常產(chǎn)生。,第2課 Ogre應(yīng)用程序基礎(chǔ),3. 渲染窗口 當使用手動方式創(chuàng)建渲染窗口的時候,需要通過RenderSystem類而不是Root類的方法來創(chuàng)建。 #include “Ogre.h” Root *root = new Root(“”, ”); /建立一個沒有配置文件的Root實例 root-loadPlu

13、gin(“RenderSystem_Direct3D9”); /載入渲染系統(tǒng)插件 root-loadPlugin(“RenderSystem_GL”); /在這里我們偽裝成用戶已經(jīng)選擇了OpenGL渲染器 String rName(“OpenGL Render Subsystem”); RenderSystemList * rList = root-getAvailableRenderers(); RenderSystemList:iterator it = rList-begin(); RenderSystem *rSys = 0;,第2課 Ogre應(yīng)用程序基礎(chǔ),3. 渲染窗口 while(

14、it != rList-end() rSys = * (it+); if(rSys-getName() = rName) /設(shè)置渲染器,并結(jié)束循環(huán) root-setRenderSystem(rSys); break; /如果沒有找到一個可用的OpenGL渲染器,就在這里結(jié)束程序。 if(root-getRenderSystem() = NULL) delete root;return -1;,第2課 Ogre應(yīng)用程序基礎(chǔ),3. 渲染窗口 /root初始化的時候,我們可以傳入一個false值來告知Root不用給我們創(chuàng)建渲染窗口。 root-initialise(false); /在這里我們?nèi)匀皇?/p>

15、用默認的參數(shù)來創(chuàng)建渲染窗口 RenderWindow *window = rSys-createRenderWindow( “Manual Ogre Window”, /窗口的名字 800, /窗口的寬度(像素) 600, /窗口的高度(像素) false, /是否全屏顯示 0); /其他參數(shù),使用默認值 /在這之后你就可以向之前所說的一樣創(chuàng)攝像機和視口了。,第2課 Ogre應(yīng)用程序基礎(chǔ),NameValuePairList類: 可用于設(shè)置窗口屬性,如渲染窗口的名稱和渲染窗口的標題是用不一樣的字符串。 NameValuePairList params; params“l(fā)eft” = “0”; p

16、arams“top” = “0”; params“title” = “Alternate Window Title”; RenderWindow *window = rSys-createRenderWindow( “MainWindow”, /渲染目標的名字 800, /窗口的寬度(像素) 600, /窗口的高度(像素) false, /是否全屏顯示 /其他參數(shù),這次我們在上面已經(jīng)設(shè)置了,第2課 Ogre應(yīng)用程序基礎(chǔ),把Ogre渲染窗口插入到一個已經(jīng)存在的窗口中: /hWnd是一個Win32系統(tǒng)中存在的窗口的句柄。 /渲染系統(tǒng)的指針所指的是一個初始化過的D3D9RenderSystem的實例

17、。 NameValuePairList opts; opts“parentWindowHandle” = StringConverter:toString(hWnd); /everything but “opts” is somewhat irrelevant in the context of an /explicitly parented window RenderWindow *window = RenderSystem-createRenderWindow( “WindowName”, 800, 600, false, ,第2課 Ogre應(yīng)用程序基礎(chǔ),把Ogre渲染窗口插入到一個已經(jīng)存

18、在的窗口中: Ogre的窗口消息處理函數(shù)在這里被忽略了,因此你要手動處理Ogre相關(guān)的消息,比如當用戶點擊關(guān)閉按鍵時候,清理Ogre渲染窗口。,第2課 Ogre應(yīng)用程序基礎(chǔ),4. 場景管理器 創(chuàng)建方法: SceneManager* sceneMgr = root-createSceneManager(ST_GENERIC, “MySceneManager”); ST_GENERIC:最簡單的場景管理器的構(gòu)造器類型,其場景管理器沒有對場景內(nèi)容和結(jié)構(gòu)做任何優(yōu)化。在極其簡單的場景中(例如菜單界面)中才有其價值。 ST_INTERIOR:這種場景管理器的構(gòu)造器所產(chǎn)生的管理器,優(yōu)化了室內(nèi)近距離的渲染,比

19、較適合高密度的場景。 ST_EXTERIOR_CLOSE:優(yōu)化了室外場景里面的中近距離可視體,比較適合用一個簡單模型或者高度場產(chǎn)生的場景地圖。 ST_EXTERIOR_FAR:Ogre歷史遺留的錯誤,已經(jīng)不需要在考慮使用它。在需要的時候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR來代替這個選項。 ST_EXTERIOR_REAL_FAR:這種類型的場景管理器特別適合那種需要動態(tài)加載的地形或者場景。動態(tài)加載的地形通常都非常巨大,甚至可能描繪了一個星球的地貌。,第2課 Ogre應(yīng)用程序基礎(chǔ),5. 攝像機 (x, y, z)代表攝像機所在點的坐標。 X和Y分別代表近

20、截面的寬度和高度 Z代表從攝像機到近截面的距離。 X和Y代表遠截面的寬度和高度,其中(Z+Z)的和代表著從攝像機到遠截面的距離。 攝像機的縱寬比率(X/Y) 視方向和視截體下截面 的夾角W,第2課 Ogre應(yīng)用程序基礎(chǔ),實例:擁有標準3:4的縱寬比;近截面距離攝像機5單位,遠截面距離1000單位;視線方向和視截體的下平面(以及上平面)擁有30度夾角(換句話說,就是上圖的W等于30) /sceneManager是一個已經(jīng)存在的場景管理器實例的指針。 /我們在這里構(gòu)建名稱為“MainCam”的攝像機。 Camera *camera = sceneMgr-createCamera(“MainCam”

21、); /并不需要計算什么,可以直接從視口中得到這個尺寸 camera-setAspectRatio(1.333333f); /30度角可以讓我們看到一個長而遠的視野 camera-setFOVy(30.0f); camera-setNearClipDistance(5.0f); camera-setFarClipDistance(1000.0f);,第2課 Ogre應(yīng)用程序基礎(chǔ),攝像機渲染模式: 攝像機支持3種不同的渲染模式:邊框,實體,“點” camera-setPolygonMode(PM_WIREFRAME); camera-setPolygonMode(PM_POINTS); came

22、ra-setPolygonMode(PM_SOLOD); PolygonMode mode = camera-getPolygonMode();,第2課 Ogre應(yīng)用程序基礎(chǔ),攝像機位置和變換: 攝像機是一個MovableObject(活動對象)接口的實現(xiàn),因此也具有這對象的所有方法和特性。 設(shè)置攝像機位置的實例: /確認我們已經(jīng)有一個指向“Camera”類型實例的指針camera。 camera-setPosition(200, 10, 200); /也可以用一個三維向量來設(shè)置攝像機坐標,在我們得到場景坐標時候這么做會方便一些 /camera-setPosition(Vector3(200,

23、 10, 200);,第2課 Ogre應(yīng)用程序基礎(chǔ),移動攝像機到當前位置的相對位置的實例: /假設(shè)攝像機還在我們之前設(shè)置的200, 10, 200空間位置上。camera-move(10, 0, 0); /攝像機移動到210, 10, 200 camera-moveRelative(0, 0, 10); /攝像機移動到210, 10, 210,第2課 Ogre應(yīng)用程序基礎(chǔ),操縱攝像機的方法: void setDirection(Real x, Real y, Real z); void setDirection(const Vector3,第2課 Ogre應(yīng)用程序基礎(chǔ),操縱攝像機的方法: void rotate(const Vector3,第2課 Ogre應(yīng)用程序基礎(chǔ),獲得攝像機屬性的方法: const Quaternion 有“Real”關(guān)鍵字的方法返回的是世界空間的坐標,而擁有“Derived”關(guān)鍵字的方法的返回值是在“軸綁定”的本地坐標系中(也就是說這個坐標系原點是攝像機所在的點,而它的軸向和世界坐標系相同)。,第2課 Ogre應(yīng)用程序基礎(chǔ),6.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論