○讀者可以對照著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....