ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙。
第一,还是框架,我们依然使用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
总结:本来打算设置地面的,但是出现了一些莫名其妙的问题,所有就设置了一个简单的面板,下次再设置地面。
最新文章
- javascript 原型及原型链的初步理解
- python 列表 总结
- CentOS 7 下的LAMP实现以及基于https的虚拟主机
- spring理解
- HP QC IE11不支持( win7 64位 无法安装)解决方法
- 如何打开asp.net中的出错提示?在程序发布后
- php中调用用户自定义函数的方法:call_user_func,call_user_func_array
- Websocket和PHP Socket编程
- 让aspx页面也可以通过url路由进行访问
- nodejs实现单文件上传。
- html5与js关于input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的value点击全选状态onclick=";select();";。做购物车页面时会要用到。
- C++_内部类
- ACdream 1007
- [PHP] PHP1 与 CGI
- centos6+cdh5.4.0 离线搭建cdh搭建
- TypeScript装饰器(decorators)
- 读headFirst设计模式 - 工厂模式
- [蓝桥杯]2015蓝桥省赛B组题目及详解
- WEB页获取串口数据
- mysql gtid 第一篇