Root類Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)課件_第1頁(yè)
Root類Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)課件_第2頁(yè)
Root類Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)課件_第3頁(yè)
Root類Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)課件_第4頁(yè)
Root類Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)課件_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Root類:Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)Root對(duì)象。Root類的構(gòu)造函數(shù):Root*root=newRoot();Root*root=newRoot(“plugins.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”,“ogre.log”);Root*root=newRoot(“”,“”);第2課Ogre應(yīng)用程序基礎(chǔ)Root類:第2課Ogre應(yīng)用程序基礎(chǔ)plugins.cfg文件在啟動(dòng)的Ogre時(shí)候,會(huì)載入plugins.cfg配置文件來(lái)查看有哪些插件可以被使用。#Definespluginstoload

#DefinepluginfolderPluginFolder=.//PluginFolder標(biāo)簽的值告訴了Ogre到哪個(gè)目錄下找下面所使用得的插件。

#Defineplugins //Ogre載入的具體插件Plugin=RenderSystem_Direct3D9Plugin=RenderSystem_GLPlugin=Plugin_ParticleFXPlugin=Plugin_BSPSceneManagerPlugin=Plugin_OctreeSceneManagerPlugin=Plugin_CgProgramManager第2課Ogre應(yīng)用程序基礎(chǔ)plugins.cfg文件第2課Ogre應(yīng)用程序基礎(chǔ)渲染窗口可以調(diào)用Root對(duì)象的initialise()方法來(lái)進(jìn)行系統(tǒng)初始化:

root->initialise(true,”MyRenderWindow”); RenderWindow*window=root->getAutoCreatedWindow();initialise方法的第一個(gè)參數(shù)告知Ogre系統(tǒng)是否自動(dòng)建立一個(gè)渲染窗口來(lái)給用戶使用。在我們這里選擇了簡(jiǎn)單的方法,讓Ogre給我們提供渲染窗口。第二個(gè)參數(shù)并且把“MyRenderWindow”作為程序窗口的標(biāo)題。在這里如果沒(méi)有提供你自己的窗口標(biāo)題,那程序就會(huì)使用默認(rèn)的“OGRERenderWindow”。第二行代碼可以用來(lái)得到自動(dòng)創(chuàng)建的渲染窗口實(shí)例的指針。第2課Ogre應(yīng)用程序基礎(chǔ)渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)Ogre需要攝影機(jī)(Camera)來(lái)“拍攝”場(chǎng)景:Camera*cam=sceneMgr->createCamera(“MainCamera”);cam->setNearClipDistance(5);cam->setFarClipDistance(1000);cam->setAspectRatio(Real(1.333333));場(chǎng)景管理器是一個(gè)生產(chǎn)在你場(chǎng)景中不同對(duì)象實(shí)體的“工廠”。通過(guò)簡(jiǎn)單調(diào)用SceneManager的createCamera()方法,就能得到一個(gè)新的攝像機(jī)實(shí)例。之后你就可以使用這臺(tái)攝像機(jī)來(lái)拍攝渲染你的場(chǎng)景了。第2課Ogre應(yīng)用程序基礎(chǔ)Ogre需要攝影機(jī)(Camera)來(lái)“拍攝”場(chǎng)景:第2課創(chuàng)建一個(gè)視口“Viewport”:Viewport*vp=window->addViewport(camera);vp->setBackgroundColour(ColourValue(0,0,0));

代碼創(chuàng)建了一個(gè)視口對(duì)象的實(shí)例,同時(shí)我們也設(shè)置了視口(viewport)的背景顏色。第2課Ogre應(yīng)用程序基礎(chǔ)創(chuàng)建一個(gè)視口“Viewport”:第2課Ogre應(yīng)用程序基渲染循環(huán):調(diào)用Root對(duì)象的srartRendering()方法開(kāi)始渲染你的場(chǎng)景:root->startRendering();在調(diào)用之后,Ogre就會(huì)不斷地渲染在你場(chǎng)景中所有能被渲染的東西。你可以通過(guò)關(guān)閉渲染窗口來(lái)結(jié)束這個(gè)過(guò)程。當(dāng)你在注冊(cè)了幀監(jiān)聽(tīng)(FrameListener)對(duì)象,然后在回調(diào)結(jié)束后返回一個(gè)false值給系統(tǒng),同樣也能結(jié)束程序渲染。第2課Ogre應(yīng)用程序基礎(chǔ)渲染循環(huán):第2課Ogre應(yīng)用程序基礎(chǔ)幀監(jiān)聽(tīng): 如果決定使用startRender()來(lái)開(kāi)始你的渲染過(guò)程,你就只能通過(guò)使用幀監(jiān)聽(tīng)對(duì)象來(lái)在渲染循環(huán)中插入你自己的代碼了。

所謂幀監(jiān)聽(tīng)對(duì)象就是一個(gè)符合FrameListener接口的類的實(shí)例。當(dāng)Ogre渲染每一幀的開(kāi)始和結(jié)束的時(shí)候會(huì)回調(diào)FrameListener接口的方法。 當(dāng)程序執(zhí)行的時(shí)候,會(huì)在每一次進(jìn)入Ogre渲染管線之前調(diào)用你定義的frameStarted()方法。第2課Ogre應(yīng)用程序基礎(chǔ)幀監(jiān)聽(tīng):第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:classMyFrameListener:publicFrameListener{public: boolframeStarted(constFrameEvent&evt); boolframeEnded(constFrameEvent&evt); }; boolMyFrameListener::frameStarted(constFrameEvent&evt){

//在每一幀畫(huà)面渲染前,調(diào)用這里你寫(xiě)好的代碼 returntrue; } boolMyFrameListener::frameEnded(constFrameEvent&evt){

//在每一幀畫(huà)面渲染后,調(diào)用這里你寫(xiě)好的代碼 returntrue; }

第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:Root*root=newRoot();MyFrameListenermyListener;

//在這里你需要在調(diào)用startRendering()方法前,注冊(cè)你的幀監(jiān)聽(tīng)對(duì)象!??!root->addFrameListener(&myListener);root->startRendering();第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)深入理解Ogre程序:手動(dòng)載入插件Root提供了兩種方法來(lái)處理手動(dòng)載入插件:voidloadPlugin(constString&pluginName);voidunloadPlugin(constString&pluginName);第一個(gè)方法是用來(lái)通過(guò)名稱載入相應(yīng)插件的。第二個(gè)方法是被用來(lái)卸載插件。#ifdefined(_DEGUG)

root->loadPlugin(“Plugin_ParticleFX_d”);#else

root->loadPlugin(“Plugin_ParticleFX”);#endif第2課Ogre應(yīng)用程序基礎(chǔ)深入理解Ogre程序:第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:

·Plugin_OctreeSceneManager:以八叉樹(shù)空間管理為基礎(chǔ)的OctreeSceneManager(八叉樹(shù)場(chǎng)景管理器——OSM)。同時(shí)包含了從其中派生出來(lái)的TerrainSceneManager(地形場(chǎng)景管理器),用來(lái)處理從高度圖(heightMapped)派生出來(lái)的地形場(chǎng)景。·Plugin_BSPSceneManager:提供一個(gè)對(duì)BSP場(chǎng)景的管理系統(tǒng),用來(lái)讀取和處理來(lái)自雷神之錘III中的地圖文件。不過(guò)在今天看來(lái)這已經(jīng)是一個(gè)古老的地圖格式,并且已經(jīng)沒(méi)有人再維護(hù)和支持它了(提供這個(gè)插件的唯一原因是為了某個(gè)演示程序的執(zhí)行)。

·Plugin_CgProgramManager:這個(gè)插件負(fù)責(zé)載入、分析、編譯并且管理Cg語(yǔ)言所寫(xiě)的GPU渲染程序。在今天看來(lái),似乎Cg逐漸被當(dāng)今技術(shù)所拋離(它只能支持3.0版本以前的profiles),因此其價(jià)值也越來(lái)越小;幸好Ogre在其內(nèi)部同時(shí)支持HLSL和GLSL程序的GPU開(kāi)發(fā)。第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:·Plugin_ParticleFX:粒子系統(tǒng)管理插件;提供了很多粒子的效果器(Affector)和發(fā)射器(Emitter),用來(lái)實(shí)現(xiàn)一些基本的粒子特效?!enderSystem_Direct3D9:Windows上面對(duì)Direct3D9的抽象層實(shí)現(xiàn)·RenderSystem_GL:針對(duì)所有平臺(tái)上OpenGL的抽象層實(shí)現(xiàn)。第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:第2課Ogre應(yīng)用程序基礎(chǔ)2.載入渲染系統(tǒng):Root類提供了用來(lái)確認(rèn)那些API可以被使用的getAvailableRenderers()方法:RenderSystemList*getAvailableRenderers();

Root同時(shí)也提供了一些用于設(shè)置和得到已經(jīng)載入渲染系統(tǒng)的方法:

voidaddRenderSystem(RenderSystem*naeRend);RenderSystem*getRenderSystemByName(constString&name);voidsetRenderSystem(RenderSystem*system);RenderSystem*getRenderSystem(void);第2課Ogre應(yīng)用程序基礎(chǔ)2.載入渲染系統(tǒng):第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼://RenderSystemList是std::vector類型RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();

while(it!=rList->end()){//Ogre的字符串類型String是std::string的擴(kuò)展RenderSystem*rSys=*(it++);if(rSys->getName().find(“OpenGL”)){

//把OpenGL渲染系統(tǒng)設(shè)置為我們使用的渲染系統(tǒng)

root->setRenderSystem(rSys);Break; } }//注意,如果系統(tǒng)沒(méi)有支持OpenGL的話,我們就沒(méi)有設(shè)置任何渲染系統(tǒng)!這將會(huì)引起一個(gè)Ogre設(shè)置期間的異常產(chǎn)生。第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口 當(dāng)使用手動(dòng)方式創(chuàng)建渲染窗口的時(shí)候,需要通過(guò)RenderSystem類而不是Root類的方法來(lái)創(chuàng)建。#include“Ogre.h”Root*root=newRoot(“”,””);

//建立一個(gè)沒(méi)有配置文件的Root實(shí)例root->loadPlugin(“RenderSystem_Direct3D9”);//載入渲染系統(tǒng)插件root->loadPlugin(“RenderSystem_GL”);

//在這里我們偽裝成用戶已經(jīng)選擇了OpenGL渲染器StringrName(“OpenGLRenderSubsystem”);RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();RenderSystem*rSys=0;第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口while(it!=rList->end()){

rSys=*(it++);

if(rSys->getName()==rName){

//設(shè)置渲染器,并結(jié)束循環(huán)

root->setRenderSystem(rSys);

break; } }

//如果沒(méi)有找到一個(gè)可用的OpenGL渲染器,就在這里結(jié)束程序。if(root->getRenderSystem()==NULL){

deleteroot; return-1; }第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口

//root初始化的時(shí)候,我們可以傳入一個(gè)false值來(lái)告知Root不用給我們創(chuàng)建渲染窗口。root->initialise(false);

//在這里我們?nèi)匀皇褂媚J(rèn)的參數(shù)來(lái)創(chuàng)建渲染窗口RenderWindow*window=rSys->createRenderWindow(

“ManualOgreWindow”,//窗口的名字

800,

//窗口的寬度(像素)

600,

//窗口的高度(像素)

false,

//是否全屏顯示0);

//其他參數(shù),使用默認(rèn)值//在這之后你就可以向之前所說(shuō)的一樣創(chuàng)攝像機(jī)和視口了。第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)NameValuePairList類:可用于設(shè)置窗口屬性,如渲染窗口的名稱和渲染窗口的標(biāo)題是用不一樣的字符串。NameValuePairListparams;params[“l(fā)eft”]

=“0”;params[“top”]=“0”;params[“title”]=“AlternateWindowTitle”;

RenderWindow*window=rSys->createRenderWindow(

“MainWindow”,

//渲染目標(biāo)的名字

800,

//窗口的寬度(像素)

600,

//窗口的高度(像素)

false,

//是否全屏顯示 ¶ms);

//其他參數(shù),這次我們?cè)谏厦嬉呀?jīng)設(shè)置了第2課Ogre應(yīng)用程序基礎(chǔ)NameValuePairList類:第2課Ogre應(yīng)用程把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中://hWnd是一個(gè)Win32系統(tǒng)中存在的窗口的句柄。//渲染系統(tǒng)的指針?biāo)傅氖且粋€(gè)初始化過(guò)的D3D9RenderSystem的實(shí)例。

NameValuePairListopts;opts[“parentWindowHandle”]=StringConverter::toString(hWnd);//everythingbut“opts”issomewhatirrelevantinthecontextofan//explicitlyparentedwindowRenderWindow*window=RenderSystem->createRenderWindow(

“WindowName”,

800,600,

false,&opts);第2課Ogre應(yīng)用程序基礎(chǔ)把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:第2課Ogr把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:

Ogre的窗口消息處理函數(shù)在這里被忽略了,因此你要手動(dòng)處理Ogre相關(guān)的消息,比如當(dāng)用戶點(diǎn)擊關(guān)閉按鍵時(shí)候,清理Ogre渲染窗口。第2課Ogre應(yīng)用程序基礎(chǔ)把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:第2課Ogr4.場(chǎng)景管理器創(chuàng)建方法:SceneManager*sceneMgr=root->createSceneManager(ST_GENERIC,“MySceneManager”);·ST_GENERIC:最簡(jiǎn)單的場(chǎng)景管理器的構(gòu)造器類型,其場(chǎng)景管理器沒(méi)有對(duì)場(chǎng)景內(nèi)容和結(jié)構(gòu)做任何優(yōu)化。在極其簡(jiǎn)單的場(chǎng)景中(例如菜單界面)中才有其價(jià)值?!T_INTERIOR:這種場(chǎng)景管理器的構(gòu)造器所產(chǎn)生的管理器,優(yōu)化了室內(nèi)近距離的渲染,比較適合高密度的場(chǎng)景?!T_EXTERIOR_CLOSE:優(yōu)化了室外場(chǎng)景里面的中近距離可視體,比較適合用一個(gè)簡(jiǎn)單模型或者高度場(chǎng)產(chǎn)生的場(chǎng)景地圖?!T_EXTERIOR_FAR:Ogre歷史遺留的錯(cuò)誤,已經(jīng)不需要在考慮使用它。在需要的時(shí)候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR來(lái)代替這個(gè)選項(xiàng)。

·ST_EXTERIOR_REAL_FAR:這種類型的場(chǎng)景管理器特別適合那種需要?jiǎng)討B(tài)加載的地形或者場(chǎng)景。動(dòng)態(tài)加載的地形通常都非常巨大,甚至可能描繪了一個(gè)星球的地貌。第2課Ogre應(yīng)用程序基礎(chǔ)4.場(chǎng)景管理器第2課Ogre應(yīng)用程序基礎(chǔ)5.攝像機(jī)(x,y,z)代表攝像機(jī)所在點(diǎn)的坐標(biāo)。X和Y分別代表近截面的寬度和高度Z代表從攝像機(jī)到近截面的距離。X’和Y’代表遠(yuǎn)截面的寬度和高度,其中(Z+Z’)的和代表著從攝像機(jī)到遠(yuǎn)截面的距離。攝像機(jī)的縱寬比率(X/Y)視方向和視截體下截面的夾角W第2課Ogre應(yīng)用程序基礎(chǔ)5.攝像機(jī)第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例:擁有標(biāo)準(zhǔn)3:4的縱寬比;近截面距離攝像機(jī)5單位,遠(yuǎn)截面距離1000單位;視線方向和視截體的下平面(以及上平面)擁有30度夾角(換句話說(shuō),就是上圖的W等于30°)//sceneManager是一個(gè)已經(jīng)存在的場(chǎng)景管理器實(shí)例的指針。//我們?cè)谶@里構(gòu)建名稱為“MainCam”的攝像機(jī)。Camera*camera=sceneMgr->createCamera(“MainCam”);

//并不需要計(jì)算什么,可以直接從視口中得到這個(gè)尺寸camera->setAspectRatio(1.333333f);

//30度角可以讓我們看到一個(gè)長(zhǎng)而遠(yuǎn)的視野camera->setFOVy(30.0f);camera->setNearClipDistance(5.0f);camera->setFarClipDistance(1000.0f);第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例:擁有標(biāo)準(zhǔn)3:4的縱寬比;近截面距離攝像機(jī)5單位,遠(yuǎn)截面攝像機(jī)渲染模式:攝像機(jī)支持3種不同的渲染模式:邊框,實(shí)體,“點(diǎn)”camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonModemode=camera->getPolygonMode();第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)渲染模式:第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)位置和變換:攝像機(jī)是一個(gè)MovableObject(活動(dòng)對(duì)象)接口的實(shí)現(xiàn),因此也具有這對(duì)象的所有方法和特性。設(shè)置攝像機(jī)位置的實(shí)例://確認(rèn)我們已經(jīng)有一個(gè)指向“Camera”類型實(shí)例的指針camera。camera->setPosition(200,10,200);

//也可以用一個(gè)三維向量來(lái)設(shè)置攝像機(jī)坐標(biāo),在我們得到場(chǎng)景坐標(biāo)時(shí)候這么做會(huì)方便一些//camera->setPosition(Vector3(200,10,200));第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)位置和變換:第2課Ogre應(yīng)用程序基礎(chǔ)移動(dòng)攝像機(jī)到當(dāng)前位置的相對(duì)位置的實(shí)例://假設(shè)攝像機(jī)還在我們之前設(shè)置的200,10,200空間位置上。

camera->move(10,0,0);//攝像機(jī)移動(dòng)到210,10,200camera->moveRelative(0,0,10);//攝像機(jī)移動(dòng)到210,10,210第2課Ogre應(yīng)用程序基礎(chǔ)移動(dòng)攝像機(jī)到當(dāng)前位置的相對(duì)位置的實(shí)例:第2課Ogre應(yīng)用程操縱攝像機(jī)的方法:voidsetDirection(Realx,Realy,Realz);voidsetDirection(constVector3&vec);Vector3getDirection(void)const;Vector3getUp(void)const;Vector3getRight(void)const;voidlookAt(constVector3&angle);voidlookAt(Realx,Realy,Realz);voidroll(constRadian&angle);voidroll(Realdegrees){roll(Angle(degrees));}voidyaw(constRadian&angle);voidyaw(Realdegrees){yaw(Angle(degrees));}voidpitch(constRadian&angle);voidpitch(Realdegrees){yaw(Angle(degrees));}第2課Ogre應(yīng)用程序基礎(chǔ)操縱攝像機(jī)的方法:第2課Ogre應(yīng)用程序基礎(chǔ)操縱攝像機(jī)的方法:voidrotate(constVector3&axis,constRadian&angle);voidrotate(constVector3&axis,Realdegrees){rotate(axis,Angle(degrees));}void

setFixedYawAxis(booluseFixed,constVector3&fixedAxis=Vector3::UNIT_Y)constQuaternion&getOrientation(void)constvoidsetOrientation(constQuaternion&q);voidsetAutoTracking(boolenabled,SceneNode*target=0,constVector3&offset=Vector3::ZERO);第2課Ogre應(yīng)用程序基礎(chǔ)操縱攝像機(jī)的方法:第2課Ogre應(yīng)用程序基礎(chǔ)獲得攝像機(jī)屬性的方法:constQuaternion&getDerivedOrientation(void)const;constVector3&getDerivedPosition(void)const;Vector3getDerivedDirection(void)const;Vector3getDerivedUp(void)const;Vector3getDerivedRight(void)const;constQuaternion&getRealOrientation(void)const;constVector3&getRealPosition(void)const;Vector3getRealDirection(void)const;Vector3getRealUp(void)const;Vector3getRealRight(void)const; 有“Real”關(guān)鍵字的方法返回的是世界空間的坐標(biāo),而擁有“Derived”關(guān)鍵字的方法的返回值是在“軸綁定”的本地坐標(biāo)系中(也就是說(shuō)這個(gè)坐標(biāo)系原點(diǎn)是攝像機(jī)所在的點(diǎn),而它的軸向和世界坐標(biāo)系相同)。第2課Ogre應(yīng)用程序基礎(chǔ)獲得攝像機(jī)屬性的方法:第2課Ogre應(yīng)用程序基礎(chǔ)6.主渲染循環(huán)之前我們通過(guò)調(diào)用Root::startRendering()方法來(lái)執(zhí)行這個(gè)循環(huán)。其實(shí)這個(gè)方法也只是簡(jiǎn)單的循環(huán)調(diào)用renderOneFrame()(渲染一幀)來(lái)進(jìn)行程序運(yùn)行工作。手動(dòng)渲染循環(huán)的框架例程:boolkeepRendering=true;

//在這里填入所有這個(gè)章節(jié)之前提到的設(shè)置過(guò)程://載入插件,創(chuàng)建渲染窗口和場(chǎng)景管理器以及攝像機(jī)和視口,//然后再場(chǎng)景中填入你希望的內(nèi)容。

while(keepRendering){//在這里處理引擎使用的網(wǎng)絡(luò)消息。//在這里處理引擎使用的輸入消息。//根據(jù)消息更新場(chǎng)景管理狀態(tài)。

//根據(jù)新的場(chǎng)景管理狀態(tài),渲染下一幀。root->renderOneFrame();第2課Ogre應(yīng)用程序基礎(chǔ)6.主渲染循環(huán)第2課Ogre應(yīng)用程序基礎(chǔ)6.主渲染循環(huán)手動(dòng)渲染循環(huán)的框架例程:

//檢查是否需要退出渲染循環(huán)//注意:NextMessageInQueue()這個(gè)函數(shù)只是為了便于解釋程序含義//而虛構(gòu)出來(lái)的函數(shù)——Ogre引擎中并沒(méi)有實(shí)現(xiàn)它。If(NextMessageInQueue()==QUIT){

keepRendering=false; } }

//在這里進(jìn)行你需要的清理工作//然后,關(guān)閉Ogre

deleteroot;

第2課Ogre應(yīng)用程序基礎(chǔ)6.主渲染循環(huán)第2課Ogre應(yīng)用程序基礎(chǔ)Root中renderOneFrame()的全部代碼(在Ogre源碼的root.cpp中)boolRoot::renderOneFrame(void){

if(!_fireFrameStarted())

returnfalse;

_updateAllRenderTargets();

return_fireFrameEnded();}第2課Ogre應(yīng)用程序基礎(chǔ)Root中renderOneFrame()的全部代碼(在Og附:例題講解:場(chǎng)景節(jié)點(diǎn)與實(shí)體。第2課Ogre應(yīng)用程序基礎(chǔ)附:第2課Ogre應(yīng)用程序基礎(chǔ)附:例題講解:場(chǎng)景節(jié)點(diǎn)與實(shí)體。第2課Ogre應(yīng)用程序基礎(chǔ)附:第2課Ogre應(yīng)用程序基礎(chǔ)Root類:Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)Root對(duì)象。Root類的構(gòu)造函數(shù):Root*root=newRoot();Root*root=newRoot(“plugins.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”);Root*root=newRoot(“plugins.cfg”,“ogre.cfg”,“ogre.log”);Root*root=newRoot(“”,“”);第2課Ogre應(yīng)用程序基礎(chǔ)Root類:第2課Ogre應(yīng)用程序基礎(chǔ)plugins.cfg文件在啟動(dòng)的Ogre時(shí)候,會(huì)載入plugins.cfg配置文件來(lái)查看有哪些插件可以被使用。#Definespluginstoload

#DefinepluginfolderPluginFolder=.//PluginFolder標(biāo)簽的值告訴了Ogre到哪個(gè)目錄下找下面所使用得的插件。

#Defineplugins //Ogre載入的具體插件Plugin=RenderSystem_Direct3D9Plugin=RenderSystem_GLPlugin=Plugin_ParticleFXPlugin=Plugin_BSPSceneManagerPlugin=Plugin_OctreeSceneManagerPlugin=Plugin_CgProgramManager第2課Ogre應(yīng)用程序基礎(chǔ)plugins.cfg文件第2課Ogre應(yīng)用程序基礎(chǔ)渲染窗口可以調(diào)用Root對(duì)象的initialise()方法來(lái)進(jìn)行系統(tǒng)初始化:

root->initialise(true,”MyRenderWindow”); RenderWindow*window=root->getAutoCreatedWindow();initialise方法的第一個(gè)參數(shù)告知Ogre系統(tǒng)是否自動(dòng)建立一個(gè)渲染窗口來(lái)給用戶使用。在我們這里選擇了簡(jiǎn)單的方法,讓Ogre給我們提供渲染窗口。第二個(gè)參數(shù)并且把“MyRenderWindow”作為程序窗口的標(biāo)題。在這里如果沒(méi)有提供你自己的窗口標(biāo)題,那程序就會(huì)使用默認(rèn)的“OGRERenderWindow”。第二行代碼可以用來(lái)得到自動(dòng)創(chuàng)建的渲染窗口實(shí)例的指針。第2課Ogre應(yīng)用程序基礎(chǔ)渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)Ogre需要攝影機(jī)(Camera)來(lái)“拍攝”場(chǎng)景:Camera*cam=sceneMgr->createCamera(“MainCamera”);cam->setNearClipDistance(5);cam->setFarClipDistance(1000);cam->setAspectRatio(Real(1.333333));場(chǎng)景管理器是一個(gè)生產(chǎn)在你場(chǎng)景中不同對(duì)象實(shí)體的“工廠”。通過(guò)簡(jiǎn)單調(diào)用SceneManager的createCamera()方法,就能得到一個(gè)新的攝像機(jī)實(shí)例。之后你就可以使用這臺(tái)攝像機(jī)來(lái)拍攝渲染你的場(chǎng)景了。第2課Ogre應(yīng)用程序基礎(chǔ)Ogre需要攝影機(jī)(Camera)來(lái)“拍攝”場(chǎng)景:第2課創(chuàng)建一個(gè)視口“Viewport”:Viewport*vp=window->addViewport(camera);vp->setBackgroundColour(ColourValue(0,0,0));

代碼創(chuàng)建了一個(gè)視口對(duì)象的實(shí)例,同時(shí)我們也設(shè)置了視口(viewport)的背景顏色。第2課Ogre應(yīng)用程序基礎(chǔ)創(chuàng)建一個(gè)視口“Viewport”:第2課Ogre應(yīng)用程序基渲染循環(huán):調(diào)用Root對(duì)象的srartRendering()方法開(kāi)始渲染你的場(chǎng)景:root->startRendering();在調(diào)用之后,Ogre就會(huì)不斷地渲染在你場(chǎng)景中所有能被渲染的東西。你可以通過(guò)關(guān)閉渲染窗口來(lái)結(jié)束這個(gè)過(guò)程。當(dāng)你在注冊(cè)了幀監(jiān)聽(tīng)(FrameListener)對(duì)象,然后在回調(diào)結(jié)束后返回一個(gè)false值給系統(tǒng),同樣也能結(jié)束程序渲染。第2課Ogre應(yīng)用程序基礎(chǔ)渲染循環(huán):第2課Ogre應(yīng)用程序基礎(chǔ)幀監(jiān)聽(tīng): 如果決定使用startRender()來(lái)開(kāi)始你的渲染過(guò)程,你就只能通過(guò)使用幀監(jiān)聽(tīng)對(duì)象來(lái)在渲染循環(huán)中插入你自己的代碼了。

所謂幀監(jiān)聽(tīng)對(duì)象就是一個(gè)符合FrameListener接口的類的實(shí)例。當(dāng)Ogre渲染每一幀的開(kāi)始和結(jié)束的時(shí)候會(huì)回調(diào)FrameListener接口的方法。 當(dāng)程序執(zhí)行的時(shí)候,會(huì)在每一次進(jìn)入Ogre渲染管線之前調(diào)用你定義的frameStarted()方法。第2課Ogre應(yīng)用程序基礎(chǔ)幀監(jiān)聽(tīng):第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:classMyFrameListener:publicFrameListener{public: boolframeStarted(constFrameEvent&evt); boolframeEnded(constFrameEvent&evt); }; boolMyFrameListener::frameStarted(constFrameEvent&evt){

//在每一幀畫(huà)面渲染前,調(diào)用這里你寫(xiě)好的代碼 returntrue; } boolMyFrameListener::frameEnded(constFrameEvent&evt){

//在每一幀畫(huà)面渲染后,調(diào)用這里你寫(xiě)好的代碼 returntrue; }

第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:Root*root=newRoot();MyFrameListenermyListener;

//在這里你需要在調(diào)用startRendering()方法前,注冊(cè)你的幀監(jiān)聽(tīng)對(duì)象?。。oot->addFrameListener(&myListener);root->startRendering();第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)深入理解Ogre程序:手動(dòng)載入插件Root提供了兩種方法來(lái)處理手動(dòng)載入插件:voidloadPlugin(constString&pluginName);voidunloadPlugin(constString&pluginName);第一個(gè)方法是用來(lái)通過(guò)名稱載入相應(yīng)插件的。第二個(gè)方法是被用來(lái)卸載插件。#ifdefined(_DEGUG)

root->loadPlugin(“Plugin_ParticleFX_d”);#else

root->loadPlugin(“Plugin_ParticleFX”);#endif第2課Ogre應(yīng)用程序基礎(chǔ)深入理解Ogre程序:第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:

·Plugin_OctreeSceneManager:以八叉樹(shù)空間管理為基礎(chǔ)的OctreeSceneManager(八叉樹(shù)場(chǎng)景管理器——OSM)。同時(shí)包含了從其中派生出來(lái)的TerrainSceneManager(地形場(chǎng)景管理器),用來(lái)處理從高度圖(heightMapped)派生出來(lái)的地形場(chǎng)景?!lugin_BSPSceneManager:提供一個(gè)對(duì)BSP場(chǎng)景的管理系統(tǒng),用來(lái)讀取和處理來(lái)自雷神之錘III中的地圖文件。不過(guò)在今天看來(lái)這已經(jīng)是一個(gè)古老的地圖格式,并且已經(jīng)沒(méi)有人再維護(hù)和支持它了(提供這個(gè)插件的唯一原因是為了某個(gè)演示程序的執(zhí)行)。

·Plugin_CgProgramManager:這個(gè)插件負(fù)責(zé)載入、分析、編譯并且管理Cg語(yǔ)言所寫(xiě)的GPU渲染程序。在今天看來(lái),似乎Cg逐漸被當(dāng)今技術(shù)所拋離(它只能支持3.0版本以前的profiles),因此其價(jià)值也越來(lái)越小;幸好Ogre在其內(nèi)部同時(shí)支持HLSL和GLSL程序的GPU開(kāi)發(fā)。第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:·Plugin_ParticleFX:粒子系統(tǒng)管理插件;提供了很多粒子的效果器(Affector)和發(fā)射器(Emitter),用來(lái)實(shí)現(xiàn)一些基本的粒子特效?!enderSystem_Direct3D9:Windows上面對(duì)Direct3D9的抽象層實(shí)現(xiàn)·RenderSystem_GL:針對(duì)所有平臺(tái)上OpenGL的抽象層實(shí)現(xiàn)。第2課Ogre應(yīng)用程序基礎(chǔ) Ogre程序已有的插件:第2課Ogre應(yīng)用程序基礎(chǔ)2.載入渲染系統(tǒng):Root類提供了用來(lái)確認(rèn)那些API可以被使用的getAvailableRenderers()方法:RenderSystemList*getAvailableRenderers();

Root同時(shí)也提供了一些用于設(shè)置和得到已經(jīng)載入渲染系統(tǒng)的方法:

voidaddRenderSystem(RenderSystem*naeRend);RenderSystem*getRenderSystemByName(constString&name);voidsetRenderSystem(RenderSystem*system);RenderSystem*getRenderSystem(void);第2課Ogre應(yīng)用程序基礎(chǔ)2.載入渲染系統(tǒng):第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼://RenderSystemList是std::vector類型RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();

while(it!=rList->end()){//Ogre的字符串類型String是std::string的擴(kuò)展RenderSystem*rSys=*(it++);if(rSys->getName().find(“OpenGL”)){

//把OpenGL渲染系統(tǒng)設(shè)置為我們使用的渲染系統(tǒng)

root->setRenderSystem(rSys);Break; } }//注意,如果系統(tǒng)沒(méi)有支持OpenGL的話,我們就沒(méi)有設(shè)置任何渲染系統(tǒng)!這將會(huì)引起一個(gè)Ogre設(shè)置期間的異常產(chǎn)生。第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例代碼:第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口 當(dāng)使用手動(dòng)方式創(chuàng)建渲染窗口的時(shí)候,需要通過(guò)RenderSystem類而不是Root類的方法來(lái)創(chuàng)建。#include“Ogre.h”Root*root=newRoot(“”,””);

//建立一個(gè)沒(méi)有配置文件的Root實(shí)例root->loadPlugin(“RenderSystem_Direct3D9”);//載入渲染系統(tǒng)插件root->loadPlugin(“RenderSystem_GL”);

//在這里我們偽裝成用戶已經(jīng)選擇了OpenGL渲染器StringrName(“OpenGLRenderSubsystem”);RenderSystemList*rList=root->getAvailableRenderers();RenderSystemList::iteratorit=rList->begin();RenderSystem*rSys=0;第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口while(it!=rList->end()){

rSys=*(it++);

if(rSys->getName()==rName){

//設(shè)置渲染器,并結(jié)束循環(huán)

root->setRenderSystem(rSys);

break; } }

//如果沒(méi)有找到一個(gè)可用的OpenGL渲染器,就在這里結(jié)束程序。if(root->getRenderSystem()==NULL){

deleteroot; return-1; }第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口

//root初始化的時(shí)候,我們可以傳入一個(gè)false值來(lái)告知Root不用給我們創(chuàng)建渲染窗口。root->initialise(false);

//在這里我們?nèi)匀皇褂媚J(rèn)的參數(shù)來(lái)創(chuàng)建渲染窗口RenderWindow*window=rSys->createRenderWindow(

“ManualOgreWindow”,//窗口的名字

800,

//窗口的寬度(像素)

600,

//窗口的高度(像素)

false,

//是否全屏顯示0);

//其他參數(shù),使用默認(rèn)值//在這之后你就可以向之前所說(shuō)的一樣創(chuàng)攝像機(jī)和視口了。第2課Ogre應(yīng)用程序基礎(chǔ)3.渲染窗口第2課Ogre應(yīng)用程序基礎(chǔ)NameValuePairList類:可用于設(shè)置窗口屬性,如渲染窗口的名稱和渲染窗口的標(biāo)題是用不一樣的字符串。NameValuePairListparams;params[“l(fā)eft”]

=“0”;params[“top”]=“0”;params[“title”]=“AlternateWindowTitle”;

RenderWindow*window=rSys->createRenderWindow(

“MainWindow”,

//渲染目標(biāo)的名字

800,

//窗口的寬度(像素)

600,

//窗口的高度(像素)

false,

//是否全屏顯示 ¶ms);

//其他參數(shù),這次我們?cè)谏厦嬉呀?jīng)設(shè)置了第2課Ogre應(yīng)用程序基礎(chǔ)NameValuePairList類:第2課Ogre應(yīng)用程把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中://hWnd是一個(gè)Win32系統(tǒng)中存在的窗口的句柄。//渲染系統(tǒng)的指針?biāo)傅氖且粋€(gè)初始化過(guò)的D3D9RenderSystem的實(shí)例。

NameValuePairListopts;opts[“parentWindowHandle”]=StringConverter::toString(hWnd);//everythingbut“opts”issomewhatirrelevantinthecontextofan//explicitlyparentedwindowRenderWindow*window=RenderSystem->createRenderWindow(

“WindowName”,

800,600,

false,&opts);第2課Ogre應(yīng)用程序基礎(chǔ)把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:第2課Ogr把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:

Ogre的窗口消息處理函數(shù)在這里被忽略了,因此你要手動(dòng)處理Ogre相關(guān)的消息,比如當(dāng)用戶點(diǎn)擊關(guān)閉按鍵時(shí)候,清理Ogre渲染窗口。第2課Ogre應(yīng)用程序基礎(chǔ)把Ogre渲染窗口插入到一個(gè)已經(jīng)存在的窗口中:第2課Ogr4.場(chǎng)景管理器創(chuàng)建方法:SceneManager*sceneMgr=root->createSceneManager(ST_GENERIC,“MySceneManager”);·ST_GENERIC:最簡(jiǎn)單的場(chǎng)景管理器的構(gòu)造器類型,其場(chǎng)景管理器沒(méi)有對(duì)場(chǎng)景內(nèi)容和結(jié)構(gòu)做任何優(yōu)化。在極其簡(jiǎn)單的場(chǎng)景中(例如菜單界面)中才有其價(jià)值。·ST_INTERIOR:這種場(chǎng)景管理器的構(gòu)造器所產(chǎn)生的管理器,優(yōu)化了室內(nèi)近距離的渲染,比較適合高密度的場(chǎng)景。·ST_EXTERIOR_CLOSE:優(yōu)化了室外場(chǎng)景里面的中近距離可視體,比較適合用一個(gè)簡(jiǎn)單模型或者高度場(chǎng)產(chǎn)生的場(chǎng)景地圖?!T_EXTERIOR_FAR:Ogre歷史遺留的錯(cuò)誤,已經(jīng)不需要在考慮使用它。在需要的時(shí)候用ST_EXTERIOR_CLOSE和ST_EXTERIOR_REAL_FAR來(lái)代替這個(gè)選項(xiàng)。

·ST_EXTERIOR_REAL_FAR:這種類型的場(chǎng)景管理器特別適合那種需要?jiǎng)討B(tài)加載的地形或者場(chǎng)景。動(dòng)態(tài)加載的地形通常都非常巨大,甚至可能描繪了一個(gè)星球的地貌。第2課Ogre應(yīng)用程序基礎(chǔ)4.場(chǎng)景管理器第2課Ogre應(yīng)用程序基礎(chǔ)5.攝像機(jī)(x,y,z)代表攝像機(jī)所在點(diǎn)的坐標(biāo)。X和Y分別代表近截面的寬度和高度Z代表從攝像機(jī)到近截面的距離。X’和Y’代表遠(yuǎn)截面的寬度和高度,其中(Z+Z’)的和代表著從攝像機(jī)到遠(yuǎn)截面的距離。攝像機(jī)的縱寬比率(X/Y)視方向和視截體下截面的夾角W第2課Ogre應(yīng)用程序基礎(chǔ)5.攝像機(jī)第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例:擁有標(biāo)準(zhǔn)3:4的縱寬比;近截面距離攝像機(jī)5單位,遠(yuǎn)截面距離1000單位;視線方向和視截體的下平面(以及上平面)擁有30度夾角(換句話說(shuō),就是上圖的W等于30°)//sceneManager是一個(gè)已經(jīng)存在的場(chǎng)景管理器實(shí)例的指針。//我們?cè)谶@里構(gòu)建名稱為“MainCam”的攝像機(jī)。Camera*camera=sceneMgr->createCamera(“MainCam”);

//并不需要計(jì)算什么,可以直接從視口中得到這個(gè)尺寸camera->setAspectRatio(1.333333f);

//30度角可以讓我們看到一個(gè)長(zhǎng)而遠(yuǎn)的視野camera->setFOVy(30.0f);camera->setNearClipDistance(5.0f);camera->setFarClipDistance(1000.0f);第2課Ogre應(yīng)用程序基礎(chǔ)實(shí)例:擁有標(biāo)準(zhǔn)3:4的縱寬比;近截面距離攝像機(jī)5單位,遠(yuǎn)截面攝像機(jī)渲染模式:攝像機(jī)支持3種不同的渲染模式:邊框,實(shí)體,“點(diǎn)”camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonModemode=camera->getPolygonMode();第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)渲染模式:第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)位置和變換:攝像機(jī)是一個(gè)MovableObject(活動(dòng)對(duì)象)接口的實(shí)現(xiàn),因此也具有這對(duì)象的所有方法和特性。設(shè)置攝像機(jī)位置的實(shí)例://確認(rèn)我們已經(jīng)有一個(gè)指向“Camera”類型實(shí)例的指針camera。camera->setPosition(200,10,200);

//也可以用一個(gè)三維向量來(lái)設(shè)置攝像機(jī)坐標(biāo),在我們得到場(chǎng)景坐標(biāo)時(shí)候這么做會(huì)方便一些//camera->setPosition(Vector3(200,10,200));第2課Ogre應(yīng)用程序基礎(chǔ)攝像機(jī)位置和變換:第2課Ogre應(yīng)用程序基礎(chǔ)移動(dòng)攝像機(jī)到當(dāng)前位置的相對(duì)位置的實(shí)例://假設(shè)攝像機(jī)還在我們之前設(shè)置的200,10,200空間位置上。

camera->move(10,0,0);//攝像機(jī)移動(dòng)到210,10,200camera->moveRelative(0,0,10);//攝像機(jī)移動(dòng)到210,10,210第2課Ogre應(yīng)用程序基礎(chǔ)移動(dòng)攝像機(jī)到當(dāng)前位置的相對(duì)位置的實(shí)例:第2課Ogre應(yīng)用程操縱攝像機(jī)的方法:voidsetDirection(Realx,Realy,Realz);voidsetDirection(constVector3&vec);Vector3getDirection(void)const;Vector3getUp(void)const;Vector3getRight(void)const;voidlookAt(constVector3&angle);voidlookAt(Realx,Realy,Realz);voidroll(constRadian&angle);voi

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論