zoukankan      html  css  js  c++  java
  • 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
    ",
    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
    ",
    84             e.getFullDescription().c_str());
    85 #endif
    86     }
    87 
    88     return 0;
    89 }
    Code

    总结:本来打算设置地面的,但是出现了一些莫名其妙的问题,所有就设置了一个简单的面板,下次再设置地面。

      

  • 相关阅读:
    (三)认识twisted reactor
    (二)inlineCallbacks,同步方式写异步代码
    (一)使用twisted Deferred
    javascript通过字典思想操作数据
    锱铢必较,从(function(){}())与(function(){})()说起
    针对谷歌默认最小字体12px的正确解决方案 (css、html)
    百度搜索研发部:同义词反馈机制
    LinkedList与ArrayList的区别
    从源码的角度分析List与Set的区别
    springboot整合redisson分布式锁
  • 原文地址:https://www.cnblogs.com/songliquan/p/3326028.html
Copyright © 2011-2022 走看看