ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
前幾天設置天空盒時一直出問題,現(xiàn)在問題終于解決了,問題來的莫名其妙,走的也莫名其妙。
第一,還是框架,我們依然使用ExampleApplication文件,框架如下
1 #include "ExampleApplication.h" 2 3 class TutorialApplication : public ExampleApplication 4 { 5 protected: 6 public: 7 TutorialApplication() 8 { 9 } 10 11 ~TutorialApplication() 12 { 13 } 14 protected: 15 void chooseSceneManager(void) 16 { 17 mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE); 18 ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 19 } 20 21 void createScene(void) 22 { 23 } 24 }; 25 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 26 #define WIN32_LEAN_AND_MEAN 27 #include "windows.h" 28 29 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) 30 #else 31 int main(int argc, char **argv) 32 #endif 33 { 34 // Create application object 35 TutorialApplication app; 36 37 try { 38 app.go(); 39 } catch( Exception& e ) { 40 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 41 //MessageBox( NULL, e.getFullDescription().c_str(), L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); 42 #else 43 fprintf(stderr, "An exception has occured: %s\n", 44 e.getFullDescription().c_str()); 45 #endif 46 } 47 48 return 0; 49 }第二,我們需要實例化一下chooseSceneManager()函數(shù),添加如下兩行代碼進行初始化工作
1 void chooseSceneManager(void) 2 { 3 mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);//創(chuàng)建一個ST_EXTERIOR_CLOSE類型的場景管理器 4 ResourceGroupManager::getSingleton().initialiseAllResourceGroups();// 初始化所有資源5 }
第三,首先實現(xiàn)天空效果,在createScene()里添加如下代碼實現(xiàn)天空穹
1 mSceneMgr->setAmbientLight(ColourValue(1,1,1));//設置環(huán)境光 2 //創(chuàng)建一個節(jié)點 3 Entity *ent2; 4 SceneNode *node; 5 ent2 = mSceneMgr->createEntity( "Knot1", "ogrehead.mesh" ); 6 node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node",Vector3( 0.0f, 0.0f, 0.0f ) ); 7 node->setPosition(0,10,0); 8 node->attachObject( ent2 ); 9 //創(chuàng)建一個平面 10 Plane plane(Vector3::UNIT_Y, 0);//創(chuàng)建一個平面,法線為Y軸,與原點距離為0 11 MeshManager::getSingleton().createPlane("ground", //面板名稱為“ground” 12 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 13 1500,1500,//平面尺寸 14 20,20,true,1,5,5,Vector3::UNIT_Z); 15 Entity *ent = mSceneMgr->createEntity("GroundEntity", "ground");//創(chuàng)建實體面板 16 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//將面板添加到場景管理器 17 ent->setMaterialName("Examples/Rockwall");//給面板添加材質(zhì) 18 ent->setCastShadows(false);//本身不作為投射陰影體 19 20 mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8 );//天空穹效果如圖
然后實現(xiàn)天空盒效果,屏蔽天空穹,添加如下代碼
mSceneMgr->setSkyBox(true,"Examples/SpaceSkyBox",5000,false);//天空盒
效果如下
最后添加天空面的代碼
Plane plane1;plane1.d = 1000;plane1.normal = Vector3::NEGATIVE_UNIT_Y;mSceneMgr->setSkyPlane( true, plane1, "Examples/SpaceSkyPlane", 1500, 50 ,true,1.5f,150,150);//天空面有必要解釋一下setSkyPlane的參數(shù),第四個參數(shù)是天空面的大小(在這里是1500x1500個單位)第五個參數(shù)是他重復的次數(shù),第六個參數(shù)渲染順序。第七個參數(shù)允許你設置天空面的彎曲度,最后兩個是線段數(shù)量。
第四,我們來實現(xiàn)霧的效果,霧分為線型霧和指數(shù)霧,線性霧“線性的”增濃,而指數(shù)霧“指數(shù)的”增濃(每個距離單位霧的濃度都會比上一個單位增加得更多)。
首先是白天的霧,線型霧
ColourValue fadeCoulour(0.1,0.1,0.1);//霧的顏色 mWindow->getViewport(0)->setBackgroundColour(fadeCoulour);// mSceneMgr->setFog(FOG_LINEAR,fadeCoulour,0.0,50,500);//線型霧如圖:
然后我們看看指數(shù)霧:刪除線型霧,添加如下代碼?mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指數(shù)霧
還有一種指數(shù)霧?mSceneMgr->setFog(FOG_EXP2,fadeCoulour,0.003);//指數(shù)霧,離攝像機越遠它的霧更濃,不過這兩種差不多,至少我沒看出來明顯差別
第五,最后我們看看顏色更深的霧,如同在一個伸手不見五指的夜晚,你看向遠方,想看清一切,卻一片漆黑。
我們改變一下霧的顏色,ColourValue fadeCoulour(0.1,0.1,0.1);
然后我們看到效果
?
原碼:
1 #include "ExampleApplication.h" 2 3 class TutorialApplication : public ExampleApplication 4 { 5 protected: 6 public: 7 TutorialApplication() 8 { 9 } 10 11 ~TutorialApplication() 12 { 13 } 14 protected: 15 void chooseSceneManager(void) 16 { 17 mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE); 18 ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 19 } 20 21 void createScene(void) 22 { 23 //mSceneMgr->setWorldGeometry("terrain.cfg"); 24 mSceneMgr->setAmbientLight(ColourValue(1,1,1));//設置環(huán)境光 25 //創(chuàng)建一個節(jié)點 26 Entity *ent2; 27 SceneNode *node; 28 ent2 = mSceneMgr->createEntity( "Knot1", "ogrehead.mesh" ); 29 node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node",Vector3( 0.0f, 0.0f, 0.0f ) ); 30 node->setPosition(0,10,0); 31 node->attachObject( ent2 ); 32 //創(chuàng)建一個平面 33 Plane plane(Vector3::UNIT_Y, 0);//創(chuàng)建一個平面,法線為Y軸,與原點距離為0 34 MeshManager::getSingleton().createPlane("ground", //面板名稱為“ground” 35 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 36 1500,1500,//平面尺寸 37 20,20,true,1,5,5,Vector3::UNIT_Z); 38 Entity *ent = mSceneMgr->createEntity("GroundEntity", "ground");//創(chuàng)建實體面板 39 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//將面板添加到場景管理器 40 ent->setMaterialName("Examples/Rockwall");//給面板添加材質(zhì) 41 ent->setCastShadows(false);//本身不作為投射陰影體 42 43 mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8 );//天空穹 44 //mSceneMgr->setSkyBox(true,"Examples/SpaceSkyBox",5000,false);//天空盒 45 // Plane plane1; 46 // plane1.d = 1000; 47 // plane1.normal = Vector3::NEGATIVE_UNIT_Y; 48 // mSceneMgr->setSkyPlane( true, plane1, "Examples/SpaceSkyPlane", 1500, 50 ,true,1.5f,150,150);//天空面 49 50 //ColourValue fadeCoulour(0.9,0.9,0.9); 51 //mWindow->getViewport(0)->setBackgroundColour(fadeCoulour); 52 //mSceneMgr->setFog(FOG_LINEAR,fadeCoulour,0.0,50,500);//線型霧 53 54 //mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指數(shù)霧 55 //mSceneMgr->setFog(FOG_EXP2,fadeCoulour,0.003);//指數(shù)霧,離攝像機越遠它的霧更濃 56 ColourValue fadeCoulour(0.1,0.1,0.1); 57 mWindow->getViewport(0)->setBackgroundColour(fadeCoulour); 58 mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指數(shù)霧 59 60 mCamera->setPosition(50.0f, 250.0f, 250.0f ); 61 mCamera->pitch( Degree(-45.0f) ); 62 mCamera->yaw( Degree(-15.0f) ); 63 } 64 }; 65 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 66 #define WIN32_LEAN_AND_MEAN 67 #include "windows.h" 68 69 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) 70 #else 71 int main(int argc, char **argv) 72 #endif 73 { 74 // Create application object 75 TutorialApplication app; 76 77 try { 78 app.go(); 79 } catch( Exception& e ) { 80 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 81 //MessageBox( NULL, e.getFullDescription().c_str(), L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); 82 #else 83 fprintf(stderr, "An exception has occured: %s\n", 84 e.getFullDescription().c_str()); 85 #endif 86 } 87 88 return 0; 89 } Code?
總結:本來打算設置地面的,但是出現(xiàn)了一些莫名其妙的問題,所有就設置了一個簡單的面板,下次再設置地面。
轉載于:https://www.cnblogs.com/songliquan/p/3326028.html
總結
以上是生活随笔為你收集整理的ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2013eoe移动开发者大会圆满落幕
- 下一篇: android源码编译过程