ogre除了我們已經見過的普通場景以外還支援大型複雜的場景,如:寬闊的野外地形和複雜的大樓和迷宮。3d引擎支援大型複雜場景的主要難度在於對場景的組織和裁減。乙個大型場景的三角型數量極其龐大,如果沒有有效的場景組織和裁減方法,計算機在渲染的時候效率會很低。解決大辦法就是用bsp或八叉樹等資料結構將場景組織起來,利用與這些資料結構相關的快速檢索演算法將攝象機看到的內容揀選出來,再送到渲染器進行渲染,這樣圖形處理器的負載才會減小。
在ogre中場景管理器的型別有四種:
st_generic, 普通場景
st_exterior_close, 室外封閉場景
st_exterior_far, 室外無限場景
st_interior 室內場景
view plaincopy to clipboardprint?
virtual void choosescenemanager(void)
virtual void choosescenemanager(void)
從以上**可知,在普通情況下使用的是普通場景管理器。如果要使用特殊的場景管理器,通過mroot->getscenemanager()函式做出選擇就可以了。
在ogre的scenemanager類中有這樣的乙個函式setworldgeometry,它的作用是讀入世界資訊(複雜場景中的大樓、野外地形等不變場景內容,區別於程式設計師手工加入的可以控制的場景元素),並將其管理起來。對於普通場景管理器來講,沒有「world su***ce(terrain,room...)」這個概念,呼叫這個函式將只會丟擲乙個 "world geometry is not supported by the generic scenemanager." 的異常。
而ogre在其引擎提供的plugin_bspscenemanager.dll中提供了通過bsp演算法實現的st_interior 室內場景管理器,它重新實現了setworldgeometry函式,使其可以讀入乙個.bsp的室內場景檔案並管理之。.bsp是quake和cs等室內遊戲使用的場景檔案型別。ogre還在其引擎提供的plugin_octreescenemanager.dll中提供了通過八叉樹演算法實現的st_exterior_close室外封閉場景管理器,它同樣重新實現了setworldgeometry函式,使其可以讀入乙個.cfg室外場景配置檔案,並載入以灰度圖形式表達的地形高程圖。
需要注意的是特殊場景管理器不僅可以管理複雜場景中那些屬於「world su***ce」(複雜場景中的大樓、野外地形等不變場景內容)的場景內容,它也具有普通場景管理器的全部功能。所以在應用時,通過setworldgeometry函式載入「不變世界」之後依然可以向場景中加入scenenode和entity等其它場景元素,依然可以通過framelisener來控制這些普通場景元素的運動。只不過它們將在乙個具有樓房或山坡的場景中運動了。
室內場景
demo_bsp工程是ogre引擎帶的室內場景例子。開啟demo_bsp工程檢視**。
ogre在其引擎提供的plugin_bspscenemanager.dll外掛程式中提供了通過bsp演算法實現的st_interior室內場景管理器。ogre引擎在初始化的時候會載入plugins.cfg中指定的全部外掛程式,只要在plugins.cfg中包含plugin_bspscenemanager.dll外掛程式就可以使用了。
由於ogre目前支援的是quake3的地圖,所以必須有乙個quake3settings.cfg來指定quake3的地圖包(. pk3檔案,其實是乙個zip檔案)和其中的地**件名(.bsp)。quake3是乙個商業遊戲軟體,其中的全部地圖的智財權都屬於id公司,所以ogre引擎的demo程式並沒有附帶任何quake3地圖,你必須在自己的計算機上安裝quake3的地圖包,並將路徑設定到quake3settings.cfg中去,demo_bsp才能夠正確執行。
地圖包檔案實際上是乙個zip檔案,該zip檔案中包含ogre真正需要的實際擴充套件名為.bsp的地**件,所以還必須將地圖包zip檔案加入到ogre的資源搜尋路徑中去。**如下:
}由於採用了特殊的室內場景管理器,所以必須重新實現choosescenemanager函式,以選擇正確的場景管理器。**如下:
view plaincopy to clipboardprint?
void choosescenemanager(void)
void choosescenemanager(void)
最後是建立場景,**如下:
view plaincopy to clipboardprint?
void createscene(void)
void createscene(void)
在建立場景的過程中,首先通過場景管理器的setworldgeometry方法載入地圖。
接下來是設定攝象機。quake地圖中都有預先設定好的起始點和起始方向,通過場景管理器的getsuggestedviewpoint方法可以獲取到這個viewpoint,而後再將攝象機定位到這個點上。由於quake是以xy軸構成的平面為水平面,z軸為上方向,所以必須將攝象機用mcamera->pitch(90)語句調整90度。mcamera->rotate(vp.orientation);一句的意思是將攝象機調整到起始方向。最後將攝象機的旋轉軸固定,因為人只能頭向上走路,不能象飛機那樣360度全空間翻滾。因為在quake中z軸向上,所以通過mcamera->setfixedyawaxis(true, vector3::unit_z);語句實現。
室外場景
demo_terrain工程是ogre自帶的室外場景的例子,開啟該工程檢視**。
ogre在其引擎提供的plugin_octreescenemanager.dll外掛程式中提供了通過八叉樹演算法實現的st_exterior_close室外封閉場景管理器。ogre引擎在初始化的時候會載入plugins.cfg中指定的全部外掛程式,只要在plugins.cfg中包含plugin_octreescenemanager.dll外掛程式就可以使用了。
室外場景的主要內容是起伏的地形。表現地形起伏的一般方法是通過乙個灰度圖來表達場景中每一塊土地的高度,顏色淺為高,顏色深為低。引擎讀取這個灰度圖,並根據每個畫素的顏色值畫出高低起伏的地形網格。再用另外的彩色圖作為地表紋理鋪在地形網格上,就實現了室外場景。
除此之外,為了防止地表紋理放大造成的失真,還需要乙個代表地面細節的可拼接的細節紋理圖。地形顯示的時候應該還可以設定縮放因子。ogre將這些地形顯示需要的和屬性都放在terrain.cfg檔案中設定。請檢視terrain.cfg。
在程式中實現室外場景漫遊很簡單。首先需要選擇室外場景管理器,**如下:
view plaincopy to clipboardprint?
virtual void choosescenemanager(void)
virtual void choosescenemanager(void)
選擇好室外場景管理器後,通過該場景管理器建立場景就可以了。
view plaincopy to clipboardprint?
void createscene(void)
void createscene(void)
以上的createscene函式首先設定環境光,又建立了乙個點光源。通過mscenemgr -> setworldgeometry( "terrain.cfg" );語句載入terrain.cfg配置檔案,解析它,同時建立地形。場景管理器的setfog函式可以設定霧化效果。
儘管本例使用的是室外場景管理器,我們依然可以用熟悉的方法向場景中加入entity等場景元素,試著向程式中加入如下**並檢視效果。
這部分**向場景中加入了乙個食人魔。從這裡可以看到,場景管理器的setworldgeometry方法會將固定不變的地形建立好,我們還可以很方便的向場景中加入其它可運動的物體(汽車、動物等),從而實現乙個近乎真實的野外世界。
Ogre 地形管理
ogre 除了我們已經見過的普通場景以外還支援大型複雜的場景,如 寬闊的野外地形和複雜的大樓和迷宮。3d引擎支援大型複雜場景的主要難度在於對場景的組織和裁減。乙個大型場景的三角型數量極其龐大,如果沒有有效的場景組織和裁減方法,計算機在渲染的時候效率會很低。解決大辦法就是用 bsp或八叉樹等資料結構將...
OGRE 地形碰撞檢測
我們現在要實現它,以便當我們向著地面移動時,能夠不穿過地面。因為baseframelistener已經處理了攝像機移動,所以我們就不用碰那些 了。替代地,在baseframelistener移動了攝像機後,我們要確保攝像機在地面以上10個單位處。如果它不在,我們要把它移到那兒。請跟緊這段 我們將在本...
整合OGRE和bullet的地形
把ogre和bullet的地形整合在一起比預想中的麻煩。主要是兩個問題 通過heightfield生成三角形網格的方式不一樣,以及heightfiled定址方式不同 ogre轉換成float陣列後,以坐下角為 0,0 點,而bullet的btheightfieldterrainshape類是左上角 ...