defaultimp.worldSize = 12000.0f; defaultimp.inputScale = 600; defaultimp.minBatchSize = 33; defaultimp.maxBatchSize = 65;
// 纹理信息
defaultimp.layerList.resize(3);
defaultimp.layerList[0].worldSize = 100;
defaultimp.layerList[0].textureNames.push_back(\lar.dds\
defaultimp.layerList[0].textureNames.push_back(\.dds\
defaultimp.layerList[1].worldSize = 30;
defaultimp.layerList[1].textureNames.push_back(\01_diffusespecular.dds\
defaultimp.layerList[1].textureNames.push_back(\01_normalheight.dds\
defaultimp.layerList[2].worldSize = 200;
defaultimp.layerList[2].textureNames.push_back(\03_diffusespecular.dds\
defaultimp.layerList[2].textureNames.push_back(\03_normalheight.dds\}
defineTerrain
本函数的代码如下:
[cpp] view plaincopy // 定义一个地形
void BasicTutorial4::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; } }
本函数的工作比较简单也比较灵巧,具体见代码注释。他使用了函数:getTerrainImage。
getTerrainImage
本函数的代码如下:
[cpp] view plaincopy // 取得地形图片
void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img) {
// 载入图片并做适当的裁切
img.load(\
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if (flipX)
img.flipAroundY(); if (flipY)
img.flipAroundX(); }
initBlendMaps
本函数的完整代码如下至于他如何工作暂时不讨论,:
[cpp] view plaincopy // 混合地形
void BasicTutorial4::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* 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);
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(); } 编译运行
尝试编译和运行下,看到一个渲染得挺好的地面了吧?不过呢,我们可以做3个改进:
1、地形生成进度指示
2、地形保存
3、自我清除
首先,我们在BasicTutorial4类声明中,加入如下变量:
[cpp] view plaincopy
OgreBites::Label* mInfoLabel;
然后,在本类中重载3个函数:
1、frameRenderingQueued - 用于显示地形载入进度