`
- 浏览:
12889449 次
- 性别:
- 来自:
大连
-
OGRE中的Terrain,sky和fog
1. 为了处理Terrain场景,首先要选择相应类型的SceneManager,这里选择了“ST_EXTERIOR_CLOSE”类型。这个操作是通过Root::createSceneManager()完成的。此操作创建并返回了一个TerrainSceneManager指针,同时创建了一个HeightmapTerrainPageSource对象。
2. 加载地形是通过:mSceneMgr->setWorldGeometry( "terrain.cfg" );语句来完成的。
3. 天空是通过SceneManager::setSkyBox()等函数完成的;
4. Fog是通过SceneManager::setFog()完成。
主要的几个函数
void TutorialApplication::destroyScene(void)
{
OGRE_DELETE mTerrainGroup;
OGRE_DELETE mTerrainGlobals;
}
void getTerrainImage(bool flipX,bool flipY,Ogre::Image& img)
{
img.load("terrain.png", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
if (flipX)
img.flipAroundY();
if (flipY)
img.flipAroundX();
}
void TutorialApplication::initBlendMaps(Ogre::Terrain *terrain)
{
Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1);
Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2);
Ogre::Real minHeight0 = 70;
Ogre::Real fadeDist0 = 40;
Ogre::Real minHeight1 = 70;
Ogre::Real fadeDist1 = 15;
float* pBlend0 = blendMap0->getBlendPointer();
float* pBlend1 = blendMap1->getBlendPointer();
for (Ogre::uint16 y = 0; y < terrain->getLayerBlendMapSize(); ++y)
{
for (Ogre::uint16 x = 0; x < terrain->getLayerBlendMapSize(); ++x)
{
Ogre::Real tx, ty;
blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty);
Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty);
Ogre::Real val = (height - minHeight0) / fadeDist0;
val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
*pBlend0++ = val;
val = (height - minHeight1) / fadeDist1;
val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
*pBlend1++ = val;
}
}
blendMap0->dirty();
blendMap1->dirty();
blendMap0->update();
blendMap1->update();
}
//-------------------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{
//创建雾
Ogre::ColourValue fadeColour(0.9, 0.9, 0.9);
mSceneMgr->setFog(Ogre::FOG_LINEAR, fadeColour, 0.0, 10, 1200);
mWindow->getViewport(0)->setBackgroundColour(fadeColour);
//设置摄像机
mCamera->setPosition(Ogre::Vector3(1683, 50, 2116));
mCamera->lookAt(Ogre::Vector3(1963, 50, 1660));
mCamera->setNearClipDistance(0.1);
mCamera->setFarClipDistance(50000);
if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE))
{
mCamera->setFarClipDistance(0); // enable infinite far clip distance if we can
}
//设置灯光
Ogre::Vector3 lightdir(0.55, -0.3, 0.75);
lightdir.normalise();
//mSceneMgr->setAmbientLight(Ogre::ColourValue(0.1, 0, 0));
Ogre::Light* light = mSceneMgr->createLight("tstLight");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(lightdir);
light->setDiffuseColour(Ogre::ColourValue::White);
light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2));
mTerrainGlobals= OGRE_NEW Ogre::TerrainGlobalOptions();
mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
mTerrainGroup->setFilenameConvention(Ogre::String("BasicTutorial3Terrain"), Ogre::String("dat"));
mTerrainGroup->setOrigin(Ogre::Vector3::ZERO);
configureTerrainDefaults(light);
for (long x = 0; x <= 0; ++x)
for (long y = 0; y <= 0; ++y)
defineTerrain(x, y);
// sync load since we want everything in place when we start
mTerrainGroup->loadAllTerrains(true);
if (mTerrainsImported)
{
Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
while(ti.hasMoreElements())
{
Ogre::Terrain* t = ti.getNext()->instance;
initBlendMaps(t);
}
//创建天空
Ogre::Plane plane;
plane.d = 100;
plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setSkyPlane(true, plane, "Examples/CloudySky", 500, 20, true, 0.5, 150, 150);
}
mTerrainGroup->freeTemporaryResources();
}
void TutorialApplication::createFrameListener(void)
{
BaseApplication::createFrameListener();
mInfoLabel = mTrayMgr->createLabel(OgreBites::TL_TOP, "TInfo", "", 350);
}
void TutorialApplication::configureTerrainDefaults(Ogre::Light *light)
{
// Configure global
mTerrainGlobals->setMaxPixelError(8);
// testing composite map
mTerrainGlobals->setCompositeMapDistance(3000);
// Important to set these so that the terrain knows what to use for derived (non-realtime) data
mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());
mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());
mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
// Configure default import settings for if we use imported image
Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings();
defaultimp.terrainSize = 513;
defaultimp.worldSize = 12000.0f;
defaultimp.inputScale = 600;
defaultimp.minBatchSize = 33;
defaultimp.maxBatchSize = 65;
// textures
defaultimp.layerList.resize(3);
defaultimp.layerList[0].worldSize = 100;
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");
defaultimp.layerList[1].worldSize = 30;
defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");
defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");
defaultimp.layerList[2].worldSize = 200;
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");
}
void TutorialApplication::defineTerrain(long x, long y)
{
Ogre::String filename = mTerrainGroup->generateFilename(x, y);
if (Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), filename))
{
mTerrainGroup->defineTerrain(x, y);
}
else
{
Ogre::Image img;
getTerrainImage(x % 2 != 0, y % 2 != 0, img);
mTerrainGroup->defineTerrain(x, y, &img);
mTerrainsImported = true;
}
}
bool TutorialApplication::frameRenderingQueued(const Ogre::FrameEvent &evt)
{
bool ret = BaseApplication::frameRenderingQueued(evt);
if (mTerrainGroup->isDerivedDataUpdateInProgress())
{
mTrayMgr->moveWidgetToTray(mInfoLabel, OgreBites::TL_TOP, 0);
mInfoLabel->show();
if (mTerrainsImported)
{
mInfoLabel->setCaption("Building terrain, please wait...");
}
else
{
mInfoLabel->setCaption("Updating textures, patience...");
}
}
else
{
mTrayMgr->removeWidgetFromTray(mInfoLabel);
mInfoLabel->hide();
if (mTerrainsImported)
{
mTerrainGroup->saveAllTerrains(true);
mTerrainsImported = false;
}
}
return ret;
}
最终效果:
2012-7-15
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
最新版本的OGRE-SDK,强大的3D开源引擎
OGRE-草地的制作 OGRE-草地的制作 OGRE-草地的制作 OGRE-草地的制作
ogre-1.12.11.zip
This is an earth demo using ogre-es. Study mobile program.
Ogre开发包,版本:ogre-sdk-1.11.1-vc15-x64,三维图形引擎源代码。
ogre的sdk,我从官网下载的,版本1.12.10,vc15,64位
1. 类似于Ogre-wiki上的set up your first application with CMake(没成功过下载和编译过) 2. Ogre是binary的形式, 不用下载ogre源代码和依赖库 3. 可以在此基础上,学习ogre及编写新的程序 4. 基于《Ogre 3d 1.7...
Pro-Ogre-3D-Programming
This is a 3D car demo using ogre-es. To study mobile programing.
ogre-1.12.1.tar.gz 源代码,Ogre渲染引擎三维开发开源代码
Ogre1.7的地形、天空与雾。源码哦。不要白不要啊!
最新版本的OGRE-SDK,强大的3D开源引擎
这个是我自己总结的OGRE-API,很多都不是很好,但是希望对你会有帮助。
OGRE3D(面向对象的图形渲染引擎) Ogre是3D图形渲染引擎。不要与提供网络,声音,物理等功能的游戏引擎混淆。 Ogre 2.3进行了大刀阔斧的改革,以使用面向数据的设计将高性能图形聚焦于以下方面: 缓存友好的实体...
在 Linux/OS X 上安装比如你要创建ogre-myapp1 ,大致步骤如下: git clone https://github.com/rafis/ogre-sample.gitcp -ar ogre-sample ogre-myapp1cd ogre-myapp1sed -i 's/ogre-sample/ogre-myapp1/g' CMa
Ogre-1.12.1源代码。OGRE引擎,是开源3D游戏制作引擎。OGRE能被用于开发游戏,但是OGRE被设计成只提供一个世界级的图形解决方案;对于其他的特性,如:音效、网络、人工智能、碰撞检测、物理等子系统,你则需要将其...
最新版本的OGRE-SDK,强大的3D开源引擎
ogre-1.11.6源代码集合 OGRE是一个开源图形渲染引擎,它是面向对象的,并且高效,抽象化了不同的API和平台,这样可以以场景为对象来使用物体,支持多种场景 请注意LGPL的使用规则 自用
最新版本的OGRE-SDK,强大的3D开源引擎,总共四部分
详细解析Ogre官网BasicTutorial3地形模块代码.并结合两篇参考资料了解了Ogre地形基本知识.