日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾天設置天空盒時一直出問題,現在問題終于解決了,問題來的莫名其妙,走的也莫名其妙。

  第一,還是框架,我們依然使用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()函數,添加如下兩行代碼進行初始化工作

1 void chooseSceneManager(void) 2 { 3 mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);//創建一個ST_EXTERIOR_CLOSE類型的場景管理器 4     ResourceGroupManager::getSingleton().initialiseAllResourceGroups();// 初始化所有資源
5   }

  第三,首先實現天空效果,在createScene()里添加如下代碼實現天空穹

1    mSceneMgr->setAmbientLight(ColourValue(1,1,1));//設置環境光 2 //創建一個節點 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 //創建一個平面 10 Plane plane(Vector3::UNIT_Y, 0);//創建一個平面,法線為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");//創建實體面板 16 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//將面板添加到場景管理器 17 ent->setMaterialName("Examples/Rockwall");//給面板添加材質 18 ent->setCastShadows(false);//本身不作為投射陰影體 19 20 mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8 );//天空穹

  效果如圖

  然后實現天空盒效果,屏蔽天空穹,添加如下代碼

  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的參數,第四個參數是天空面的大小(在這里是1500x1500個單位)第五個參數是他重復的次數,第六個參數渲染順序。第七個參數允許你設置天空面的彎曲度,最后兩個是線段數量。

  第四,我們來實現霧的效果,霧分為線型霧和指數霧,線性霧“線性的”增濃,而指數霧“指數的”增濃(每個距離單位霧的濃度都會比上一個單位增加得更多)。

  首先是白天的霧,線型霧

    ColourValue fadeCoulour(0.1,0.1,0.1);//霧的顏色 mWindow->getViewport(0)->setBackgroundColour(fadeCoulour);// mSceneMgr->setFog(FOG_LINEAR,fadeCoulour,0.0,50,500);//線型霧

  如圖:

  然后我們看看指數霧:刪除線型霧,添加如下代碼?mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指數霧

  還有一種指數霧?mSceneMgr->setFog(FOG_EXP2,fadeCoulour,0.003);//指數霧,離攝像機越遠它的霧更濃,不過這兩種差不多,至少我沒看出來明顯差別

  第五,最后我們看看顏色更深的霧,如同在一個伸手不見五指的夜晚,你看向遠方,想看清一切,卻一片漆黑。

  我們改變一下霧的顏色,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));//設置環境光 25 //創建一個節點 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 //創建一個平面 33 Plane plane(Vector3::UNIT_Y, 0);//創建一個平面,法線為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");//創建實體面板 39 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//將面板添加到場景管理器 40 ent->setMaterialName("Examples/Rockwall");//給面板添加材質 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);//指數霧 55 //mSceneMgr->setFog(FOG_EXP2,fadeCoulour,0.003);//指數霧,離攝像機越遠它的霧更濃 56 ColourValue fadeCoulour(0.1,0.1,0.1); 57 mWindow->getViewport(0)->setBackgroundColour(fadeCoulour); 58 mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指數霧 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

?

總結:本來打算設置地面的,但是出現了一些莫名其妙的問題,所有就設置了一個簡單的面板,下次再設置地面。

  

轉載于:https://www.cnblogs.com/songliquan/p/3326028.html

總結

以上是生活随笔為你收集整理的ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。