數學符號的輸入
先開啟Word空白文件或PowerPoint投影片
1.    功能表---插入---物件                       2.   選擇    Microsoft Equation 3.0    或        方程式編輯器

hoshili770205 發表在 痞客邦 留言(0) 人氣()

hoshili770205 發表在 痞客邦 留言(0) 人氣()

這是 ogre官方出的教材 下載
下載網址: https://www.4shared.com/document/gl8b26EM/1849512485OGRE.html

hoshili770205 發表在 痞客邦 留言(1) 人氣()

設定霧最重要的是,這跟你想像的不一樣並不是在空的場景中新增一個霧的實體。霧相當於一個遮罩在你的是現前面。
這有些影響,最直接的影響是,當你是也沒有物體時,妳就看不到霧的效果。事實上,你將會看到視野中背景的顏色。
為了使霧的效果正確的呈現,我們必須將背景設成霧的顏色。
霧的介紹
有兩個基本的霧型態,線性及指數的型態。線性的霧在線性的型態比較濃,而指數的霧,濃度以指數的方式呈現。
這兩蓊的差別將會在範例中呈現。
霧的型態
第一種霧的型態,我們將實作線性的霧,這是最容易了解的霧型態。在我們呼叫 setWorldGeometry 我們要做的是設定是野的背景顏色。

hoshili770205 發表在 痞客邦 留言(0) 人氣()

一個skybox簡單來說就是,一個巨大的方塊,圍繞著所有場景中的物件。最佳的解釋方法就是展示給你看。
將這行程是加入:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
編譯與執行,skyBoxes有很多有用的屬性,可以供我們來設定。
第一個選項是要不要產生SkyBox,如果希望稍後再取消SkyBox 只要'mSceneMgr->setSkyBox(false, "");' 第二個屬性是skybox要用的材質草稿。
第三個屬性與第四格個屬性對了解 setSkyBox 來說是很重要的。
第三個屬性設定SkyBox 與攝影機的距離,第四個屬性在場景重設之前或之後,完成設定skybox。
現在就來試驗看看,當你調整距離屬性從預設的5000單位調整到非常近的距離會有什麼效果:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 10);
沒有變化! 這是因為第四個屬境控制著是否要先繪製skybox的屬性被設成true。要是 SkyBox 被先繪製,之後所更改的任何渲染效果將會被繪製在它之上,因此使得skybox永遠想是在背景。先繪製skybox這種效果並不理想,因為所有的東西都被渲染了。當你將它設定成最後繪製,只有看得見得部分被渲染,這樣可以加速畫面的呈現。
因此,把SkyBox 設定成最後繪製吧:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 5000, false); 
但這跟之前看到的差不多,但現在skybox看不見的部分將不會被渲染。在使用這個技術的時候要十分小心,要是你設設定skyBox 距離太近, 你將有一部分的場景會被切掉。例如:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 100, false);
如你所見,terrain戳穿SkyBox. 這絕對不是我們想要的. 要是你用SkyBoxes 在你的應用程式中,你必須決定要怎樣運用它們。讓skybox在terrain之後渲染是可以加快速度的, 但要注意幾何的完整性。(除非這就是你要的效果)。一般而言,讓所有東西穿過第二的屬性設成預設是很安全的選擇。
SkyDomes 
SkyDomes 與SkyBoxes非常相似,你將會呼叫 setSkyDome使用它們. 一個巨大的方塊被創見環繞著攝影機與渲染物,但是最大的不同是它的貼圖示球狀投影在skybox到上面。你依然看著方塊,但它看起來就像被貼圖用球狀表面包裝起。主要的缺點是方塊的下方會沒有貼圖,所以你永遠需要一些地形來影藏這個區塊。
這個Ogre 提供的範例,會讓你清楚的看到這個情形。清除 setSkyBox 從 createScene 呼叫的,增加下面的程式碼:
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8); 
酖你執行,移動攝影機到 terrain 的中心,然後移動攝影機你將會非常接近地形的表面。確定畫面之後,在按R, 切換到可見 mesh 模式。如你所見,我門依然看著方塊,但是它上面彷彿覆蓋著球狀的包裝。
前兩個 setSkyDome 屬性與 setSkyBox 相同 ,你可將 SkyDome 關掉,用 'mSceneMgr->setSkyDome(false, "");'。
第三個屬性非正統的使用 SkyDome。API 建議使用值在2~65之間,降低以達到較好的距離效果,但是較高的數值可以減少雜訊與平滑效果。示著設定第三個屬性在2~65之間,並觀察它的差別。API参考的距離的效果指的是在螢幕截圖時可以清晰的顯示。
第四個屬性是貼圖的次數。你將會需要調整貼圖的大小來改變貼圖次數。確認這個數值是浮點的形別不是整數的型別。你可以將數值調整成 1.234 次, 要是這可以產生你要的效果的話。 
第五與第六個屬性分別是距離與繪製先後,這個前面已經分別提過了。
SkyPlanes 
SkyPlanes 跟 SkyBoxes及SkyDomes差異非常大. 不是在一個方塊渲上染貼貼圖,而是在一個平面上。從createScene中清掉所有的SkyDomes。首先新增一個平面,將它朝下。 setSkyPlane method 的使用不像SkyBox 與 SkyDome 需要距離屬性。那個屬性已經設定在平面的 d 值中:
Ogre::Plane plane;
plane.d = 1000;
plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y; 
現在平面已經定義好了,我可以新增 SkyPlane。 注意第四個屬性設定SkyPlane的大小 (在範例中是 1500x1500 單位) 第五個屬性貼圖次數:
mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 1500, 75); 
編譯與執行程式。新增SkyPlane有兩個問題。
第一個,貼圖次數太低,沒有完整鋪好。這可以很簡單解決,只要調高貼圖次數與調整貼圖材質就可以了。 然而,這個技術的主要的問題是看你看著水平線時會發現盡頭。不論你的貼圖的材質好壞,這個現象不令人滿意。SkyPlane大部分用在當你有一座高牆的時候 (或山脈) 圍繞著視角。使用 SkyPlane 在考慮降低圖片的密集度的時候使用。
幸運的是,這並不是所有我們可以使用 SkyPlane屬性. 第六個屬性是先繪製,這在之前已經提過了。
第七個屬性允許你彎曲 SkyPlane, 如此一來我們不必再用平面,可以用曲面來當作表面。我們需要設定x,y的切割數來建立 SkyPlane (初始的 SkyPlane 是一個巨大的正方形,但要是我們彎曲它,我們需要設定一些分割線。)第八個與第九個屬性是x與y的切割數:
mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 1500, 50, true, 1.5f, 150, 150); 
編譯與執行,現在 SkyPlane 看起來比較好,經過再次鋪平精會產生相同的效果。你可以用cloud material 來取代:
mSceneMgr->setSkyPlane(true, plane, "Examples/CloudySky", 1500, 40, true, 1.5f, 150, 150); 
編譯與執行。使用 clouds 來做這種貼圖會比用SkyDome略差一些,特別是靠近地形的邊緣,會看到水平線的外面。
可以清掉 SkyPlane 呼叫 'mSceneMgr->setSkyPlane(false, Ogre::Plane(), "");'

hoshili770205 發表在 痞客邦 留言(0) 人氣()

讓 your Basic Tutorial 3 實作檔案,成為下方的格式: 
void BasicTutorial3::destroyScene(void)
{
}
//-------------------------------------------------------------------------------------
void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial3::defineTerrain(long x, long y)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial3::initBlendMaps(Ogre::Terrain* terrain)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial3::configureTerrainDefaults(Ogre::Light* light)
{
}
//-------------------------------------------------------------------------------------
void BasicTutorial3::createFrameListener(void)
{
BaseApplication::createFrameListener();
}
//-------------------------------------------------------------------------------------
void BasicTutorial3::createScene(void)
{
}
//-------------------------------------------------------------------------------------
bool BasicTutorial3::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
bool ret = BaseApplication::frameRenderingQueued(evt);
return ret;
}
連結器 輸入
為了能夠編譯程式,需要加入 Ogre Terrain 組件.
Add 'OgreTerrain.lib' for release and 
'OgreTerrain_d.lib' for debug to your project library input on Windows.
在較舊的Ogre版本中,必須使用地形管理經理,將你所要的地形加入Ogre應用程式中,沒有更友善的方法。
從Ogre1.7版開始,有三個組件可以使用:Terrain, Paging and Property 
The Terrain and Paging components have a special relationship in that Ogre Terrain is able to make use of the Paging component for - yes, you guessed it: paging.
This tutorial will introduce you to the Ogre Terrain component, and leave paging for a later tutorial.
"paging"要怎樣翻
處理攝影機
首先, 變更地形中的攝影機物件
將下面的程式碼放到BasicTutorial3::createScene 裡面:
mCamera->setPosition(Ogre::Vector3(1683, 50, 2116));
mCamera->lookAt(Ogre::Vector3(1963, 50, 1660));
mCamera->setNearClipDistance(0.1);
mCamera->setFarClipDistance(50000);
if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE))
{
mCamera->setFarClipDistance(0); // enable infinite far clip distance if we can
}
除樂設定攝影機的位置、方向外,還可以調整視野的遠近,地形通常是都相當大,所以我們希望攝影機可以看到比較遠的地方,如果渲染系統支援的話,就把他設成無限遠。
設定 平行光光源 與 環境光 
地形組件用平行光來照亮全圖,將平行光放入場景中:
Ogre::Vector3 lightdir(0.55, -0.3, 0.75);
lightdir.normalise();
Ogre::Light* light = mSceneMgr->createLight("tstLight");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(lightdir);
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2));
配置地形
首先,新增地形選項
mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();
接著,建構地形群組物件,來管理地形實體
mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
mTerrainGroup->setFilenameConvention(Ogre::String("BasicTutorial3Terrain"), Ogre::String("dat"));
mTerrainGroup->setOrigin(Ogre::Vector3::ZERO);
地形群組的建構需要場景經理實體,地形排列的選項、地形的大小、地形全域的大小的参數,接下來,用setFilenameConvention function告訴地型群組,要用什麼名字來儲存。最後將設定變成預設。
開始設定設定地形
configureTerrainDefaults(light);
我們將會稍後再處理 configureTerrainDefaults function 
注意 我們放入平行光到 function 中。
然後 我們定義地形與建構地形群組來載入所有需要的物件:
for (long x = 0; x <= 0; ++x)
for (long y = 0; y <= 0; ++y)
defineTerrain(x, y);
// sync load since we want everything in place when we start
mTerrainGroup->loadAllTerrains(true);
當我們只有一個地形, 我們將會呼叫 defineTerrain function 一次。 
但要是有很多得時候, 我們將會這麼做。
我們將會稍後處理 defineTerrain function。
現在載入地形的話,我們希望 blendmaps 被計算: 
if (mTerrainsImported)
{
Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
while(ti.hasMoreElements())
{
Ogre::Terrain* t = ti.getNext()->instance;
initBlendMaps(t);
}

這迴圈執行遇到存在的地形,就會呼叫 initBlendMaps 一次,
The initBlendMaps function 將會在後面被提到。
現在,還有一個動作要做,清掉產生的地形:
mTerrainGroup->freeTemporaryResources(); 
到目前所寫的程式碼,應該如下面所示:
void BasicTutorial3::createScene(void)
{
mCamera->setPosition(Ogre::Vector3(1683, 50, 2116));
mCamera->lookAt(Ogre::Vector3(1963, 50, 1660));
mCamera->setNearClipDistance(0.1);
mCamera->setFarClipDistance(50000);
if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE))
{
mCamera->setFarClipDistance(0); // enable infinite far clip distance if we can
}
Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::TFO_ANISOTROPIC);
Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(7);
Ogre::Vector3 lightdir(0.55, -0.3, 0.75);
lightdir.normalise();
Ogre::Light* light = mSceneMgr->createLight("tstLight");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(lightdir);
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2));
mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();
mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
mTerrainGroup->setFilenameConvention(Ogre::String("BasicTutorial3Terrain"), Ogre::String("dat"));
mTerrainGroup->setOrigin(Ogre::Vector3::ZERO);
configureTerrainDefaults(light);
for (long x = 0; x <= 0; ++x)
for (long y = 0; y <= 0; ++y)
defineTerrain(x, y);
// sync load since we want everything in place when we start
mTerrainGroup->loadAllTerrains(true);
if (mTerrainsImported)
{
Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
while(ti.hasMoreElements())
{
Ogre::Terrain* t = ti.getNext()->instance;
initBlendMaps(t);
}
}
mTerrainGroup->freeTemporaryResources();

不要編譯 -因為不會運作 ,直到我們實作 terrain utility functions才會成功運作!
設定TerrainDefaults
ogre組件,可以被快速的設定。
mTerrainGlobals 是 Ogre::TerrainGlobalOptions 實體.
找到 configureTerrainDefaults function 將下面的程式碼貼上:
// Configure global
mTerrainGlobals->setMaxPixelError(8);
// testing composite map
mTerrainGlobals->setCompositeMapDistance(3000);
收先設定全域選項: MaxPixelError 與 CompositeMapDistance
MaxPixelError 描述地形的精確度。數字越小代表越精確,但要付出效能上的代價。
CompositeMapDistance 描述渲染場景被照亮的地形範圍要多遠。 
接著,我們要處理場經中被照亮的地形,使用平行光:
// Important to set these so that the terrain knows what to use for derived (non-realtime) data
mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());
mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());
mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
他用我們的光來設定方向與顏色,顏色與場景經理的全域光源顏色相同。
接下來,我們設定一些屬性需要的值:
// Configure default import settings for if we use imported image
Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings();
defaultimp.terrainSize = 513;
defaultimp.worldSize = 12000.0f;
defaultimp.inputScale = 600;
defaultimp.minBatchSize = 33;
defaultimp.maxBatchSize = 65;
我們不會將這些值在這個教學中作詳細的說明,但場景大小與世界的大小將會與全域的大小相符。inputScale描述高解析度的圖片縮放的比例。我們使用比例縮放,因為圖片的精確度被限制。
一個raw的高解析度的圖片,不需要比例縮放,因為他的精確度被存成不可作比例調整的浮點陣列。
最後是 貼圖材質
// textures
defaultimp.layerList.resize(3);
defaultimp.layerList[0].worldSize = 100;
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");
defaultimp.layerList[1].worldSize = 30;
defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");
defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");
defaultimp.layerList[2].worldSize = 200;
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");
我們將地形貼圖塗層設成3 ,呼叫 defaultimp.layerList.resize(3)
我們設定每個圖層的世界大小,及唯一的貼圖名稱。
'worldSize' 描述貼圖圖示的大小。 一個小的數值將會增加渲染貼圖圖層的結果。
預設的材質產生器,一個貼圖圖層,需要兩個貼圖。
1.diffuse_specular - diffuse texture 用一個鏡面當作的透明度
2.normal_height - normal map 用高解析度的圖面當作透明度。
全部的configureTerrainDefaults function 如下:
void BasicTutorial3::configureTerrainDefaults(Ogre::Light* light)
{
// Configure global
mTerrainGlobals->setMaxPixelError(8);
// testing composite map
mTerrainGlobals->setCompositeMapDistance(3000);
// Important to set these so that the terrain knows what to use for derived (non-realtime) data
mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());
mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());
mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
// Configure default import settings for if we use imported image
Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings();
defaultimp.terrainSize = 513;
defaultimp.worldSize = 12000.0f;
defaultimp.inputScale = 600;
defaultimp.minBatchSize = 33;
defaultimp.maxBatchSize = 65;
// textures
defaultimp.layerList.resize(3);
defaultimp.layerList[0].worldSize = 100;
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");
defaultimp.layerList[1].worldSize = 30;
defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");
defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");
defaultimp.layerList[2].worldSize = 200;
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");
}
defineTerrain
這是我們的 defineTerrain function: 
void BasicTutorial3::defineTerrain(long x, long y)
{
Ogre::String filename = mTerrainGroup->generateFilename(x, y);
if (Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), filename))
{
mTerrainGroup->defineTerrain(x, y);
}
else
{
Ogre::Image img;
getTerrainImage(x % 2 != 0, y % 2 != 0, img);
mTerrainGroup->defineTerrain(x, y, &img);
mTerrainsImported = true;
}
}
這個function簡單明瞭,
首先,他問TerrainGroup,產生地形的時候要用什麼名稱。
之後檢查再來源檔是否有相對應的檔名。
要是找到的話, 代表我們已經產生過一個二元的地形資料, 因此沒有需要再從檔案中匯入。
要是找不到相符的檔案,代表需要產生地形,載入檔案並定義它。
這個 function 呼叫 getTerrainImage
void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img)
{
img.load("terrain.png", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
if (flipX)
img.flipAroundY();
if (flipY)
img.flipAroundX();
}
initBlendMaps
這是 initBlendMaps function 中的實體:
void BasicTutorial3::initBlendMaps(Ogre::Terrain* terrain)
{
Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1);
Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2);
Ogre::Real minHeight0 = 70;
Ogre::Real fadeDist0 = 40;
Ogre::Real minHeight1 = 70;
Ogre::Real fadeDist1 = 15;
float* pBlend1 = blendMap1->getBlendPointer();
for (Ogre::uint16 y = 0; y < terrain->getLayerBlendMapSize(); ++y)
{
for (Ogre::uint16 x = 0; x < terrain->getLayerBlendMapSize(); ++x)
{
Ogre::Real tx, ty;
blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty);
Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty);
Ogre::Real val = (height - minHeight0) / fadeDist0;
val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
val = (height - minHeight1) / fadeDist1;
val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
*pBlend1++ = val;
}
}
blendMap0->dirty();
blendMap1->dirty();
blendMap0->update();
blendMap1->update();
}
在這個教學中我們將不會詳細的說明它是怎樣運作的。
簡單的講究室它用地形的高度對應到在地形上的三個圖層中的圖示。 
注意使用 getLayerBlendMap 與 getBlendPointer. 
'Nuff said.
第一部分~編譯與執行
編譯與執行Basic Tutorial 3,
你應該可以看到一個很不錯的地形成現在Ogre場景中。
但我們可以作稍稍的改進,增加3屬性進去:
1.Terrain generation indicator
2.Saving of the terrain
3.Cleaning up after ourselves
首先, 我們將會需要新增新的資料成員到 BasicTutorial3 class: 
OgreBites::Label* mInfoLabel;
然後我們需要覆蓋三個 functions 在我們的 BasicTutorial3 class:
frameRenderingQueued - 呈現 地形產生過程與儲存當它完成載入時。
createFrameListener - 來建構資訊標籤
destroyScene - 自我清掉 
三個實作如下:
frameRenderingQueued
bool BasicTutorial3::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
bool ret = BaseApplication::frameRenderingQueued(evt);
if (mTerrainGroup->isDerivedDataUpdateInProgress())
{
mTrayMgr->moveWidgetToTray(mInfoLabel, OgreBites::TL_TOP, 0);
mInfoLabel->show();
if (mTerrainsImported)
{
mInfoLabel->setCaption("Building terrain, please wait...");
}
else
{
mInfoLabel->setCaption("Updating textures, patience...");
}
}
else
{
mTrayMgr->removeWidgetFromTray(mInfoLabel);
mInfoLabel->hide();
if (mTerrainsImported)
{
mTerrainGroup->saveAllTerrains(true);
mTerrainsImported = false;
}
}
return ret;
}
首先我們問 TerrainGroup terrain generation是否正在運作中: isDerivedDataUpdateInProgress. 
要是它正在運作中,就顯示資訊標籤與說明。
要是它不是正在運作中,檢查我們匯入的新地形。 
要是成功的話,存所有的地形,這樣在我們下次執行的時候,就可以跳過產生的程序。
createFrameListener
我們重寫這個 function 因為我們希望增加新資訊標籤到 OgreBites::SdkTrayManager 'mTrayMgr'. 
當 BaseApplication 建構它使用 createFrameListener function,我們不會將它加入 'createScene' function中, 因為 createFrameListener function 被呼叫在 createScene 之後... 
Very simple: 
void BasicTutorial3::createFrameListener(void)
{
BaseApplication::createFrameListener();
mInfoLabel = mTrayMgr->createLabel(OgreBites::TL_TOP, "TInfo", "", 350);
}Call BaseApplication::createFrameListener and then sneak in our info label.
destroyScene
我們清掉的地方: 
void BasicTutorial3::destroyScene(void)
{
OGRE_DELETE mTerrainGroup;
OGRE_DELETE mTerrainGlobals;
}OGRE_NEW requires OGRE_DELETE.
第二部分~編譯與執行
要是你現在編譯與執行,你應該會看到資訊標籤告訴你 TerrainGroup 正在產生 generating 地形. 
當標籤消失, TerrainGroup 將會儲存地形。
你將會注意到在建構地形時,你無法離開程式。
但是, 要是你再次執行, 你不會再看到這個訊息,開始將變得非常迅速,因為我們已經產生過地形的檔案的路徑了。 
可以查看 OGRE_HOME/media. 
你將看到'BasicTutorial3Terrain_00000000.dat' 檔案在那裏...

hoshili770205 發表在 痞客邦 留言(1) 人氣()

之前的教學中,我們已經學會加入實體,及旋轉及放大縮小的調整。現在來談談攝影機、燈光與影子。
void BasicTutorial2::createCamera(void)
{
// create the camera
mCamera = mSceneMgr->createCamera("PlayerCam");
// set its position, direction 
mCamera->setPosition(Ogre::Vector3(0,10,500));
mCamera->lookAt(Ogre::Vector3(0,0,0));
// set the near clip distance
mCamera->setNearClipDistance(5);
mCameraMan = new OgreBites::SdkCameraMan(mCamera); // create a default camera controller
}在BaseApplication 更改createCamera的参數
--------------------------------------------------------------------------------
void BasicTutorial2::createViewports(void)
{
// Create one viewport, entire window
Ogre::Viewport* vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
// Alter the camera aspect ratio to match the viewport
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->;getActualHeight()));
}更改createViewports的設定
Ogre所支援的陰影
1.Modulative Texture Shadows (Ogre::SHADOWTYPE_TEXTURE_MODULATIVE) 最省計算資源,產生一個黑白的陰影投射。
2.Modulative Stencil Shadows (Ogre::SHADOWTYPE_STENCIL_MODULATIVE) 這項技術將陰影體積當作一個模組,渲染所有不透明的物件。跟Additive Stencil Shadows比起來較為稀疏。
3.Additive Stencil Shadows (Ogre::SHADOWTYPE_STENCIL_ADDITIVE)這項技術將每到光,當作獨立的添加在場景上。這將會對顯示卡造成負擔,因為當增加而外的光通過場景時,就必須在做計算。
void BasicTutorial2::createScene(void)
{
mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0));
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE)
//設定AmbientLight,設定使用SHADOWTYPE_STENCIL_ADDITIVE
Ogre::Entity* entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");
entNinja->setCastShadows(true);
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);
//載入實體,設定投射陰影
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0);
//須要一個平面讓投影呈現
//定義平面,在(0,0,0)的位置 以y+為法向量,場景幾何物件與之距離為0
Ogre::MeshManager::getSingleton().createPlane("ground", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
//大小1500x1500,新增一個叫做ground的mesh 
Ogre::Entity* entGround = mSceneMgr->createEntity("GroundEntity", "ground");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entGround);
//告訴場景經理,不要投影那些用來投影陰影的物件
entGround->setMaterialName("Examples/Rockwall");
entGround->setCastShadows(false);
//在平面上貼上Rockwall的材質
Ogre::Light* pointLight = mSceneMgr->createLight("pointLight");
pointLight->setType(Ogre::Light::LT_POINT);
pointLight->setPosition(Ogre::Vector3(0, 150, 250));
//新增一個點光源,可以調整位置,或將它與場景節點結合,隨物件移動。 
pointLight->setDiffuseColour(1.0, 0.0, 0.0);
pointLight->setSpecularColour(1.0, 0.0, 0.0);
//設定光線顏色跟反射顏色
Ogre::Light* directionalLight = mSceneMgr->createLight("directionalLight");
directionalLight->setType(Ogre::Light::LT_DIRECTIONAL);
directionalLight->setDiffuseColour(Ogre::ColourValue(.25, .25, 0));
directionalLight->setSpecularColour(Ogre::ColourValue(.25, .25, 0));
//設定平行光源,光線顏色、反色顏色
directionalLight->setDirection(Ogre::Vector3( 0, -1, 1 )); 
//因為平行光從很遠的地方照射過來,所以不用設定位置,只要設定照射方向
Ogre::Light* spotLight = mSceneMgr->createLight("spotLight");
spotLight->setType(Ogre::Light::LT_SPOTLIGHT);
spotLight->setDiffuseColour(0, 0, 1.0);
spotLight->setSpecularColour(0, 0, 1.0);
//新增一個聚光燈,設定光線顏色、反色顏色
spotLight->setDirection(-1, -1, 0);
spotLight->setPosition(Ogre::Vector3(300, 300, 0));
//要設定燈的位置及照射方向 
spotLight->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50));
//可以設定光線直射區域及光暈大小。
}

hoshili770205 發表在 痞客邦 留言(0) 人氣()

ogre1.png
Scene Manager :管理場景中的所有物件。所有在螢幕上呈現的物件,都由場景經理們來管理,當你樣放物件到場景中,場景經理將會持續追蹤物件的位置。 有很多不同型態的場景經理,各管理不同的型態的物件。
Entity Basics:實體是一種可以渲染在螢幕上的物件,實體是由3D mesh 組成的物件。 注意! ogre分離可以渲染的物件, 位置及方向。這表示不可以直接在場景中放置實體,而是要將實體與場景節點物件結合,場景節點含有位置與方向的資訊。
SceneNode Basics: 場景節點持續追蹤與它結合的實體位置與方向,當你新增一個實體,如果沒有與場景節點結合就不會渲染呈現,只有實體與場景節點結合才會呈現在螢幕上。 場景節點可以有任意數量的實體與它結合。
 

hoshili770205 發表在 痞客邦 留言(0) 人氣()





hoshili770205 發表在 痞客邦 留言(1) 人氣()





hoshili770205 發表在 痞客邦 留言(0) 人氣()

  • May 12 Wed 2010 18:07
  • prezi

不論是在快活的學生時代,或是充滿無奈的上班族生涯,簡報工具都是一個蠻重要的工具軟體,雖然大部分的人都使用微軟的PowerPoint,但網路事還是有一些很好玩的線上編輯服務。
Prezi兼具 較 PowerPoint 製作更容易的優點,以及有 心智圖 擴散性思考的優點,其把呆版的簡報,開創了新的局面,讓上台簡報可以比較有趣,有條理~

hoshili770205 發表在 痞客邦 留言(0) 人氣()

hoshili770205 發表在 痞客邦 留言(0) 人氣()

1 2 3
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。