mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2));Nos tambem definimos uma luz ambiente para suavizar a iluminacao.Configurando nosso terrenoPrimeiro, nos criaremos um conjunto de de opcoes de terreno global. Para esta tarefa, a classe TerrainGlobalOptions e usada. Ela somente armazena as opcoes padrao para todos os terrenos que nos vamos criar e fornece alguns gets e sets.mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();Entao construimos o nosso objeto TerrainGroup, que e uma classe auxiliar para o gerenciamento de uma grade de terrenos.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);O construtor da classe TerrainGroup pega nossa instancia do SceneManager, opcoes de alinhamento do terreno, tamanho do terreno e tamanho do mundo do terreno como parametros. Nos dizemos ao TerrainGroup que nome nos gostariamos de usar ao salvar nosso terreno, atraves da funcao setFilenameConvention. E por ultimo, definimos a origem do TerrainGroup.Agora e a hora de configurar o nosso terreno.configureTerrainDefaults(light);Nos veremos essa funcao posteriormente, mas por enquanto, observe que estamos passando a nossa luz direcional como parametro.E entao, nos definimos nossos terrenos e instruimos ao TerrainGroup para carrega-los: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);Como nos so temos um terreno, nos so estaremos chamando a funcao defineTerrain uma vez, mas se tivessemos varios terrenos, teriamos que definir cada um deles.Agora que ja temos nossos terrenos importados, nos vamos calcular os blendmaps para cada terreno (veremos isso mais adiante):if (mTerrainsImported) { Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator(); while(ti.hasMoreElements()) { Ogre::Terrain* t = ti.getNext()->instance; initBlendMaps(t); } }Tudo o que nos resta fazer agora e liberar os recursos apos a criacao inicial dos terrenos:mTerrainGroup->freeTemporaryResources();A funcao TutorialBasico3::createScene deve estar assim por enquanto:void BasicTutorial3::createScene(void){ 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); // ativa a distancia de recorte minima infinita, se for possivel } Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::TFO_ANISOTROPIC); Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(7); Ogre::Vector3 lightdir(0.55, -0.3, 0.75); lightdir.normalise(); 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); } } mTerrainGroup->freeTemporaryResources();}Nao tente compilar agora! Nao ira funcionar ate que nos implementemos as funcoes utilitarias de terreno, que e o nosso proximo topico.Funcoes utilitarias de TerrenoconfigureTerrainDefaultsO componente de terreno do Ogre e bastante configuravel. O mTerrainGlobals e a nossa instancia do Ogre::TerrainGlobalOptions.Va ate a funcao configureTerrainDefaults e adicione o seguinte codigo a ele: mTerrainGlobals->setMaxPixelError(8); mTerrainGlobals->setCompositeMapDistance(3000);Primeiro nos configuramos duas funcoes globais: MaxPixelError e CompositeMapDistance. MaxPixelError decide o quao preciso o nosso terreno vai ser. Um numero menor significa um terreno mais preciso, ao custo de desempenho (por causa do numero de vertices). CompositeMapDistance decide o quao distante o terreno do Ogre vai renderizar um terreno ilumninadoAgora, usando a nossa luz direcional, vamos configurar a iluminacao:// Eh importante definir estes parametros para que o