Ogre 地形管理

2021-09-30 08:56:58 字數 4430 閱讀 4511

ogre

除了我們已經見過的普通場景以外還支援大型複雜的場景,如:寬闊的野外地形和複雜的大樓和迷宮。

3d引擎支援大型複雜場景的主要難度在於對場景的組織和裁減。乙個大型場景的三角型數量極其龐大,如果沒有有效的場景組織和裁減方法,計算機在渲染的時候效率會很低。解決大辦法就是用

bsp或八叉樹等資料結構將場景組織起來,利用與這些資料結構相關的快速檢索演算法將攝象機看到的內容揀選出來,再送到渲染器進行渲染,這樣圖形處理器的負載才會減小。

在ogre

中場景管理器的型別有四種:

st_generic,

普通場景

st_exterior_close,

室外封閉場景

st_exterior_far,

室外無限場景

st_interior

室內場景

除了第一種普通場景外,其它幾種都是處理複雜場景的專用場景管理器。

ogre

引擎中有乙個

scenemanagerenumerator

類,它的作用是管理已實現的場景管理器。在

ogre

的root

類裡就就聚合了乙個

scenemanagerenumerator

物件,已供選擇需要的場景管理器。在

ogre framework

的類中可以看到這樣的**:

從以上**可知,在普通情況下使用的是普通場景管理器。如果要使用特殊的場景管理器,通過

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

函式,以選擇正確的場景管理器。**如下:

最後是建立場景,**如下:

在建立場景的過程中,首先通過場景管理器的

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

。在程式中實現室外場景漫遊很簡單。首先需要選擇室外場景管理器,**如下:

選擇好室外場景管理器後,通過該場景管理器建立場景就可以了。

以上的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類是左上角 ...