Neste tutorial, aprenderemos a criar, renderizar e configurar o terreno de um ambiente dentro do Ogre 3D. Devido a extensao dessa parte do tutorial, dividi ele em duas partes, de forma que nessa primeira parte nos sejamos capazes de criar um terreno. O projeto feito nessa parte sera necessario para a proxima parte do tutorial.Este tutorial foi traduzido e adaptado do Tutorial Basico 3 da Wiki do Ogre 3D. Link: http://www.ogre3d.org/tikiwiki/Basic+Tutorial+3Preparando o projetoAbra o Visual Studio 2010, crie um novo projeto com o nome TutorialBasico3 e do tipo OGRE Application. Selecione as opcoes Standard application e Postbuild Copy e clique em Finish.Quando o projeto terminar de ser criado, abra o arquivo TutorialBasico3.h e adicione o seguinte codigo no arquivo (nao exclua o que ja estiver no arquivo):#include <Terrain/OgreTerrain.h>#include <Terrain/OgreTerrainGroup.h>#include "BaseApplication.h" class TutorialBasico3 : public BaseApplication{private: Ogre::TerrainGlobalOptions* mTerrainGlobals; Ogre::TerrainGroup* mTerrainGroup; bool mTerrainsImported; void defineTerrain(long x, long y); void initBlendMaps(Ogre::Terrain* terrain); void configureTerrainDefaults(Ogre::Light* light);public: TutorialBasico3(void); virtual ~TutorialBasico3(void); protected: virtual void createScene(void);};Da mesma forma, abra o arquivo TutorialBasico.cpp e adicione o seguinte codigo (nao exclua o que ja estiver la):#include "TutorialBasico3.h" TutorialBasico3::TutorialBasico3(void){}TutorialBasico3::~TutorialBasico3(void){}void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img){}void TutorialBasico3::defineTerrain(long x, long y){}void TutorialBasico3::initBlendMaps(Ogre::Terrain* terrain){}void TutorialBasico3::configureTerrainDefaults(Ogre::Light* light){}void TutorialBasico3::createScene(void){}Nao esqueca de manter o metodo createScene vazio!Para que seja possivel compilar o codigo, e necessario vincular o componente de Terreno do Ogre ao projeto do Visual Studio. Adicione 'OgreTerrain.lib' (release) e 'OgreTerrain.d.lib' (debug) as bibliotecas de entrada do seu projeto no Windows. Elas podem ser adicionadas na janela de Propriedades do Projeto, em suas respecitivas configuracoes (release e debug), na secao Vinculador (Linker), Entrada (Input) e Dependencias Adicionais (additional references).TerrenoO projeto deste tutorial se baseia em dois componentes principais: TerrainGroup e Terrain. Tambem ha o TerrainGlobalOptions, mas ele so e usado como componente suplementar. O TerrainGroup pode ser imaginado como uma zona moderada, como um prado, clareira ou um campo. O TerrainGroup pode agregar varias pecas de Terrain.Essa subdivisao e usada para a renderizacao de nivel de detalhe (LOD), que e baseada na distancia da camera para cada um dos elementos do tipo Terrain. O Terrain consiste em "lajotas" (tiles) com algum material estampado neles.TerrainGroups permitem a configuracao de paginacao. Quando um TerrainGroup e paginado, somente a parte visivel pela camera e processada. Sem paginacao, todo o TerrainGroup e processado, mesmo se nao estiver visivel. Por enquanto, nos usaremos um TerrainGroup simples sem paginacao.Definindo a cameraPrimeiro, modificaremos o objeto camera para visualizar o nosso terreno. Adicione o seguinte codigo a funcao TutorialBasico3::createScene: 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 }O que estamos fazendo, alem de definir a posicao e orientacao da camera, e configurar as distancias de recorte maxima e minima (far e near). Como o nosso terreno vai ser grande, queremos que ela veja a uma distancia maxima.Definindo as luzes direcional e ambienteO componente Terrain utiliza uma luz direcional para computar o mapa de luz do terreno, entao vamos por uma luz direcional na cena (createScene): 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));