terreno saiba o que usar para dados derivados (em tempo nao-real) mTerrainGlobals->setLightMapDirection(light->getDerivedDirection()); mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight()); mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());Ele usa a nossa luz para definir a direcao e a cor difusa e define a cor difusa para coincidir com a luz ambiente do gerenciador de cena (scene manager).Em seguida, definimos alguns valores de importacao:// Configure as configuracoes de importacao padrao para o uso de imagem importada Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings(); defaultimp.terrainSize = 513; defaultimp.worldSize = 12000.0f; defaultimp.inputScale = 600; // terrain.png eh 8 bpp defaultimp.minBatchSize = 33; defaultimp.maxBatchSize = 65;Nos nao vamos cobrir esses valores neste tutorial, mas terrainSize e worldSize sao definidos para coincidir com os tamanhos globais (o que foi dito em TerrainGroup) e inputScale decide como a imagem no mapa de alturas e escalonada. Nos estamos usando escala aqui porque as imagens tem uma precisao limitada. Um mapa de alturas bruto, por instancia, nao precisa normalmente de escala porque os valores sao armazenados como um array de floats nao-escalonados.A ultima parte e para nossas texturas:// texturas 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");Aqui nos definimos o numero de camadas de textura de terreno para 3, chamando defaultimp.layerList.resize(3). Entao nos inicializamos cada camada definindo o 'worldSize' e especificando os nomes de textura. 'worldSize' decide o quao grande cada porcao de texturas vai ser. Um valor menor aumentara a resolucao da camada de textura renderizada.O gerador padrao de materiais leva duas texturar por camada:1- diffuse_specular - textura difusa com um mapa especular no canal alpha2- normal_height - mapa normal com um mapa de alturas no canal alphaPara mais informacoes sobre como as texturas sao feitas, visite este link. Os arquivos usados aqui estao incluidos no diretorio de exemplos da distribuicao de origem do Ogre.Nossa funcao configureTerrainDefaults ficara assim:void TutorialBasico3::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");}defineTerrainEsta e a nossa funcao defineTerrain:void TutorialBasico3::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; }}Ela e simples, mas faz muita coisa:Primeiro, ela consulta o nosso TerrainGroup qual o nome do arquivo ele deve usar para gerar o terreno.Depois, ele verifica se ha um arquivo com aquele nome no grupo de recursos. Se houver, significa que nos ja geramos um arquivo binario de dados de terreno, entao nao ha necessidade de importar de uma imagem. Se nao houver um arquivo de dados, significa que nos temos que gerar nosso terreno, entao nos carregamos a imagem e utilizamos para definir.A funcao utiliza uma pequena funcao utilitaria chamada getTerrainImage(), explicada a seguir.getTerrainImageComo esta funcao e