前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙。

  第一,还是框架,我们依然使用ExampleApplication文件,框架如下

 #include "ExampleApplication.h"

 class TutorialApplication : public ExampleApplication
{
protected:
public:
TutorialApplication()
{
} ~TutorialApplication()
{
}
protected:
void chooseSceneManager(void)
{
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
} void createScene(void)
{
}
};
#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h" INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
TutorialApplication app; try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
//MessageBox( NULL, e.getFullDescription().c_str(), L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
} return ;
}

  第二,我们需要实例化一下chooseSceneManager()函数,添加如下两行代码进行初始化工作

 void chooseSceneManager(void)
{
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);//创建一个ST_EXTERIOR_CLOSE类型的场景管理器
4     ResourceGroupManager::getSingleton().initialiseAllResourceGroups();// 初始化所有资源
  }

  第三,首先实现天空效果,在createScene()里添加如下代码实现天空穹

       mSceneMgr->setAmbientLight(ColourValue(,,));//设置环境光
//创建一个节点
Entity *ent2;
SceneNode *node;
ent2 = mSceneMgr->createEntity( "Knot1", "ogrehead.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node",Vector3( 0.0f, 0.0f, 0.0f ) );
node->setPosition(,,);
node->attachObject( ent2 );
//创建一个平面
Plane plane(Vector3::UNIT_Y, );//创建一个平面,法线为Y轴,与原点距离为0
MeshManager::getSingleton().createPlane("ground", //面板名称为“ground”
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
,,//平面尺寸
,,true,,,,Vector3::UNIT_Z);
Entity *ent = mSceneMgr->createEntity("GroundEntity", "ground");//创建实体面板
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//将面板添加到场景管理器
ent->setMaterialName("Examples/Rockwall");//给面板添加材质
ent->setCastShadows(false);//本身不作为投射阴影体 mSceneMgr->setSkyDome( true, "Examples/CloudySky", , );//天空穹

  效果如图

  然后实现天空盒效果,屏蔽天空穹,添加如下代码

  mSceneMgr->setSkyBox(true,"Examples/SpaceSkyBox",5000,false);//天空盒

  效果如下

  最后添加天空面的代码

     Plane plane1;
plane1.d = ;
plane1.normal = Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setSkyPlane( true, plane1, "Examples/SpaceSkyPlane", , ,true,1.5f,,);//天空面

  有必要解释一下setSkyPlane的参数,第四个参数是天空面的大小(在这里是1500x1500个单位)第五个参数是他重复的次数,第六个参数渲染顺序。第七个参数允许你设置天空面的弯曲度,最后两个是线段数量。

  第四,我们来实现雾的效果,雾分为线型雾和指数雾,线性雾“线性的”增浓,而指数雾“指数的”增浓(每个距离单位雾的浓度都会比上一个单位增加得更多)。

  首先是白天的雾,线型雾

     ColourValue fadeCoulour(0.1,0.1,0.1);//雾的颜色
mWindow->getViewport()->setBackgroundColour(fadeCoulour);//
mSceneMgr->setFog(FOG_LINEAR,fadeCoulour,0.0,,);//线型雾

  如图:

  然后我们看看指数雾:删除线型雾,添加如下代码 mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指数雾

  还有一种指数雾 mSceneMgr->setFog(FOG_EXP2,fadeCoulour,0.003);//指数雾,离摄像机越远它的雾更浓,不过这两种差不多,至少我没看出来明显差别

  第五,最后我们看看颜色更深的雾,如同在一个伸手不见五指的夜晚,你看向远方,想看清一切,却一片漆黑。

  我们改变一下雾的颜色,ColourValue fadeCoulour(0.1,0.1,0.1);

  然后我们看到效果

原码:

 #include "ExampleApplication.h"

 class TutorialApplication : public ExampleApplication
{
protected:
public:
TutorialApplication()
{
} ~TutorialApplication()
{
}
protected:
void chooseSceneManager(void)
{
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
} void createScene(void)
{
//mSceneMgr->setWorldGeometry("terrain.cfg");
mSceneMgr->setAmbientLight(ColourValue(,,));//设置环境光
//创建一个节点
Entity *ent2;
SceneNode *node;
ent2 = mSceneMgr->createEntity( "Knot1", "ogrehead.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node",Vector3( 0.0f, 0.0f, 0.0f ) );
node->setPosition(,,);
node->attachObject( ent2 );
//创建一个平面
Plane plane(Vector3::UNIT_Y, );//创建一个平面,法线为Y轴,与原点距离为0
MeshManager::getSingleton().createPlane("ground", //面板名称为“ground”
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
,,//平面尺寸
,,true,,,,Vector3::UNIT_Z);
Entity *ent = mSceneMgr->createEntity("GroundEntity", "ground");//创建实体面板
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);//将面板添加到场景管理器
ent->setMaterialName("Examples/Rockwall");//给面板添加材质
ent->setCastShadows(false);//本身不作为投射阴影体 mSceneMgr->setSkyDome( true, "Examples/CloudySky", , );//天空穹
//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);//天空面 //ColourValue fadeCoulour(0.9,0.9,0.9);
//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);
mWindow->getViewport()->setBackgroundColour(fadeCoulour);
mSceneMgr->setFog(FOG_EXP,fadeCoulour,0.005);//指数雾 mCamera->setPosition(50.0f, 250.0f, 250.0f );
mCamera->pitch( Degree(-45.0f) );
mCamera->yaw( Degree(-15.0f) );
}
};
#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h" INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
TutorialApplication app; try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
//MessageBox( NULL, e.getFullDescription().c_str(), L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
} return ;
}

Code

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

  

最新文章

  1. javascript 原型及原型链的初步理解
  2. python 列表 总结
  3. CentOS 7 下的LAMP实现以及基于https的虚拟主机
  4. spring理解
  5. HP QC IE11不支持( win7 64位 无法安装)解决方法
  6. 如何打开asp.net中的出错提示?在程序发布后
  7. php中调用用户自定义函数的方法:call_user_func,call_user_func_array
  8. Websocket和PHP Socket编程
  9. 让aspx页面也可以通过url路由进行访问
  10. nodejs实现单文件上传。
  11. html5与js关于input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的value点击全选状态onclick="select();"。做购物车页面时会要用到。
  12. C++_内部类
  13. ACdream 1007
  14. [PHP] PHP1 与 CGI
  15. centos6+cdh5.4.0 离线搭建cdh搭建
  16. TypeScript装饰器(decorators)
  17. 读headFirst设计模式 - 工厂模式
  18. [蓝桥杯]2015蓝桥省赛B组题目及详解
  19. WEB页获取串口数据
  20. mysql gtid 第一篇

热门文章

  1. windows安装ipython
  2. 详细讲解:使用tp3.2.3完成简单的注册登录功能
  3. spring-autowire机制
  4. [solr 管理界面] - 索引数据删除
  5. Jmeter模拟http请求
  6. x5webview 微信H5支付
  7. C语言字符,字符串,字节操作常用函数
  8. Linux学习记录(二)
  9. 对于无法激活的系统—使用rearm命令延长试用期
  10. axios获取后端数据