// 设置环境光
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2));
// 创建全局的地形配置信息
mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();
// 创建TerrainGroup对象,以管理地形
// 第一参数为场景管理器,第二个参数为地形的的排布,第三个参数为地形的大小,第四个参数为整个地块的大小
mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
// 如果要保存改地形(序列化),那么使用BasicTutorial3Terrain文件名来保存,后缀为dat
mTerrainGroup->setFilenameConvention(Ogre::String(\Ogre::String(\
// 设置其位置
mTerrainGroup->setOrigin(Ogre::Vector3::ZERO);
// 配置地形
configureTerrainDefaults(light);
// 定义地形
for (long x = 0; x <= 0; ++x) for (long y = 0; y <= 0; ++y) defineTerrain(x, y);
// 同步载入所有的地形,这样我们一启动就可以得到所有的一切了 mTerrainGroup->loadAllTerrains(true);
// 如果只是单纯的载入地形,将所有已存在的地形调用initBlendMaps if (mTerrainsImported) {
Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
while(ti.hasMoreElements()) {
Ogre::Terrain* t = ti.getNext()->instance; initBlendMaps(t); } }
// 清理临时资源
mTerrainGroup->freeTemporaryResources(); }
默认地形配置
Terrain组件是非常灵活很容易配置的。mTerrainGlobals变量存储了全局的地形配置信息。
在configureTerrainDefaults函数中添加如下代码:
[cpp] view plaincopy // 配置MaxPixelError为8
// 本配置决定了地形的精度,这个值越小则地形越精细,但需要更大的开销 mTerrainGlobals->setMaxPixelError(8);
// 配置CompositeMapDistance为3000
// 本配置决定了多远的距离内,地形才会被渲染出来 mTerrainGlobals->setCompositeMapDistance(3000);
做了2个配置,具体见代码注释说明。然后我们需要使用有向光,处理地形的光照贴图:
[cpp] view plaincopy
// 设置其环境光和漫反射光,这样在光照下才能够反衬出自身的纹理 mTerrainGlobals->setLightMapDirection(light->getDerivedDirection()); mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight()); mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
然后我们再设置“载入配置”的信息:
[c-sharp] view plaincopy
// 当我们载入地形时,其默认的配置如下:
Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings(); defaultimp.terrainSize = 513;
defaultimp.worldSize = 12000.0f; defaultimp.inputScale = 600; defaultimp.minBatchSize = 33; defaultimp.maxBatchSize = 65;
这些值的意义暂时不讲,后续中我们再来详细解释。最后一件事情是设置纹理贴图:
[cpp] view plaincopy // 纹理信息
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\
我们设置了地形有3层,每一层我们初始化了其大小、材质。默认情况下,材质生成器为每层提供了2个纹理贴图:
1、diffuse_specular
2、normal_height
这里先不展开讨论,知道有这么回事就行。至此,我们的代码如下:
[cpp] view plaincopy // 默认的地形配置信息
void BasicTutorial4::configureTerrainDefaults(Ogre::Light* light) {
// 配置MaxPixelError为8
// 本配置决定了地形的精度,这个值越小则地形越精细,但需要更大的开销 mTerrainGlobals->setMaxPixelError(8);
// 配置CompositeMapDistance为3000
// 本配置决定了多远的距离内,地形才会被渲染出来 mTerrainGlobals->setCompositeMapDistance(3000);
// 设置其环境光和漫反射光,这样在光照下才能够反衬出自身的纹理 mTerrainGlobals->setLightMapDirection(light->getDerivedDirection()); mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight()); mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
// 当我们载入地形时,其默认的配置如下:
Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings(); defaultimp.terrainSize = 513;