Ogre 1 7 2中的地形教程

2021-06-01 19:42:02 字數 3906 閱讀 2615

○讀者可以對照著ogre1.7.2中的terrain.h原始碼進行閱讀加深理解,藍色部分均為原始碼

○去除了一些具體場景比如新增mesh,設定setambientlight等與terrain無關的操作

下面這段**在setupcontent()函式中,使用過ogre1.6.5的一定對createscene()函式非常熟悉。這裡setupcontent()相當於createscene()函式。

首先,在ogre1.7中,地形是由一塊一塊的地形組成的,他們每快地形都有共同的屬性,所以在建立地形之前我們必須指定地形塊的全域性配置。

mterrainglobals = ogre_new terrainglobaloptions();
terrainglobaloptions是乙個類,定義了地形塊的一些全域性變數和預設值,需要的話我們可以改變他的變數引數,我們後面再做改變。

我們將要建立地形分組物件,該物件用於建立以及管理地形塊。

mterraingroup = ogre_new terraingroup(mscenemgr, terrain::align_x_z, terrain_size, terrain_world_size);

mterraingroup->setfilenameconvention(terrain_file_prefix, terrain_file_suffix);

mterraingroup->setorigin(mterrainpos);

這段**比較簡單

首先使用ogre_new (其實也就是new)例項化乙個terraingroup物件

引數1:為他指定場管理器、

引數2:地形的平鋪方向,平鋪方向一般採用align_x_z,也就是採用y作為高度

引數3:unit16 terrainsize=2~n+1,比如512+1=513,不符合公式的可能會導致地圖顯示異常,表示「thesize of each terrain down one edge in vertices (2^n+1)」               樓主只能理解意思,不能完全正確表達其中的專有名詞,實際除錯中,這個引數影響地圖邊緣的鋸齒度,越小鋸齒越明顯,取值太小de 話,執行會錯誤;

引數4:real terrainworldsize,地圖大小,表示地圖正方形的邊長)

然後第二句設定了該地形組的起始位置,在以後建立的地形塊中均採用此位置作為相對位置

執行configterraindefaults(l);

傳遞了乙個引數light,函式定義為:

1.【平坦地形】

以上三步工作做好了之後,我們就可以很方便的建立地形塊了,如果想建立平坦的地形(例子中是山地地形,這裡只是延伸說明,原始碼沒有下面這4行**)

for (long x = terrain_page_min_x; x <= terrain_page_max_x; ++x)

for (long y = terrain_page_min_y; y <= terrain_page_max_y; ++y)

mterraingroup->defineterrain(x, y,0.0f);

mterraingroup->loadallterrains(true);

你將會在你的場景中看到一塊地形了,defineterrain方法首先要指定該塊地形在地形分組中的索引位置,然後第三個引數必須指定高度資料,這裡我設定為0.0f,那麼將是出現乙個平面地形。

2.【用灰度圖建立起伏的山地地形】

若是想讀取點陣圖來建立地形,而不是平坦的地面,需要進行如下操作

for (long x = terrain_page_min_x; x <= terrain_page_max_x; ++x)

for (long y = terrain_page_min_y; y <= terrain_page_max_y; ++y)

defineterrain(x, y, blankterrain);

mterraingroup->loadallterrains(true);

mterraingroup->loadallterrains(true);這一句一定不能少,否則顯示不出來地圖

defineterrain(x, y, blankterrain)定義為:

void defineterrain(long x, long y, bool flat = false)

else

//否則讀取位圖,建立載入地形

else

}

getterrainimage()定義為:

void getterrainimage(bool flipx, bool flipy, image& img)

ogre1.7的地形紋理預設支援8層紋理混合,如果想更改,可通過地形的全域性配置設定,混合越多越慢。剛才我們定義了三層紋理。預設情況下,引擎只顯示第一層紋理紋理,所以我們得為每一層指定混合係數,0表示不顯示,1表示顯示,0~1表示混合混合顯示。混合包括兩大步驟:

void sample_bumper::initblendmaps(terrain* terrain)

} blendmap0->dirty();

blendmap1->dirty();

//blendmap0->loadimage("blendmap1.png", resourcegroupmanager::default_resource_group_name);

blendmap0->update();

blendmap1->update();

}

如下圖:

第三層指 blend2:growth_weirdfungus-03_diffusespecular.dds

第二層沒執行,混合度為0:grass_green-01_diffusespecular.dds

第一層是預設的:dirt_grayrocky_diffusespecular.dds

使用dds質材,可以投射出陰影

或者也可以看我的例子:

defaultimp.layerlist.resize(3);  

defaultimp.layerlist[0].worldsize = 100; //這個值關係到貼圖的細緻程度,太大的話被拉伸得很大,看起來模糊

因為用的jpg質材,所以不能投射出陰影,要是真想投射陰影的話,將photoshop裝個dds外掛程式,讀入,匯出dds格式的,新增第二行**中為空的質材defaultimp.layerlist[0].texturenames.push_back("");

這個例子應該分得很明朗了,設定成高度低於5的使用鵝卵石紋理,高於6的用板岩紋理。沒有使用.dds質材

整合OGRE和bullet的地形

把ogre和bullet的地形整合在一起比預想中的麻煩。主要是兩個問題 通過heightfield生成三角形網格的方式不一樣,以及heightfiled定址方式不同 ogre轉換成float陣列後,以坐下角為 0,0 點,而bullet的btheightfieldterrainshape類是左上角 ...

武俠世界,基於Ogre的地形分析

早期的天龍八部跟武俠世界基本相似。scene 場景的一些基本資訊,包括light,skydome,環境光,霧以及場景中靜態模型staticentity等。摘錄部分檔案如下 terrain 地形的分塊方式,乙個tile由n個grid組成,tile為ogre的mesh,grid不可再分。scale為gr...

cadence allegro 17 2中的正負片

正片和負片都是單純的設計電路板時需要的概念。所謂的正片,就是看到什麼就是什麼,看到導線就是導線,看到敷銅就是敷銅。而負片恰恰相反,看到什麼都是恰恰相反的,導線不是導線,而是隔斷的區域 在allegro中叫anti線 敷銅不是敷銅,而是整版作為平面的前提下被挖空的區域。在17.2中,一些介面相對16....