<< Voltar Índice Próxima >>

TERRAIN, SKY E FOG

Terrain

Um terreno(terrain) na Ogre pode ser adicionado a cena utilizando uma só linha de código, como veremos a seguir, através de uma imagem chamada de heightmap. A imagem é em tons de cinza, onde as regiões escuras são as mais profundas enquanto que as mais claras são as altas, a variação do cinza determina a elevação.

Objetivando evitar problemas de visualização, defina a luz do ambiente como branca e depois remova o trecho de código criado na parte de iluminação, caso você esteja estudando os tutoriais em sequencia.

    scene_mgr->setWorldGeometry("terrain.cfg");

 

A linha de código acima insere um terreno no ambiente 3D, o arquivo passado como parâmetro é onde se encontra as configurações do terreno. Este arquivo encontra-se na pasta media (OgreSDK\media), e pode ser aberto por qualquer editor, como o bloco de notas(notepad).

Alguns dos elementos de configuração são explicados a seguir:

WorldTexture: nesse parâmetro é definido a imagem que será usada como textura. As imagens utilizadas estão na pasta \OgreSDK\media\materials\textures. Lembrando que poderiam ser criados outros diretórios para uma melhor organização das imagens do jogo, bastando para isso serem incluídos no arquivo resources.cfg contido nas pasta \bin\release.

DetailTexture: é uma imagem que tem como objetivo tornar a textura aplicada no terreno mais realística, deixando o terreno com uma melhor qualidade.

DetailTile: indica o número de vezes que a DetailTexture será repetida em um tile do terreno. Um tile é uma divisão do terreno, como se fosse um metro quadrado. Esse parâmetro também influência na qualidade da textura do terreno.

PageSource: define a fonte do Heightmap.

Heightmap.image: é a imagem que será utilizada para a criação do terreno. Essa imagem deve ser em tons de cinza, pode ser criada diretamente em um editor de imagem como o Paint ou o Photoshop, mas para uma melhor elaboração do terreno deve-se utilizar algum gerador ou mesmo um editor de terreno.

Na wiki da Ogre existe esta página com alguns editores e no wikipedia também encontra-se uma pequena lista de programas que podem ajudar. A imagem deve ter uma dimensão nxn, onde n = 2*y+1, com y um valor inteiro. Um exemplo do valor de n é 513, 1025, etc.

Heightmap.raw.size: utilizada para formatos de arquivos do tipo .raw gerado por alguns dos editores. Esse parâmetro determina o tamanho do lado do terreno, onde o valor deve seguir a fórmula 2*y+1.

Heightmap.raw.bpp: também para arquivos .raw, esse parâmetro determina a quantidade de bytes por pixel no tile.

PageSize: específica o tamanho dos vértices do terreno. Na prática esse valor deve ser o mesmo de um dos lados da imagem utilizada para gerar o terreno, caso contrário a Ogre mostrará uma mensagem de erro antes da execução.

TileSize: determina a quantidade de divisões que o terreno terá em suas dimensões. Por exemplo, com TileSize igual a 65 significa que o lado do terreno será dividido em 65 partes iguais. Esse valor deve obedecer a f´rrmula 2*y+1 e ser MENOR que PageSize.

MaxPixelError: o valor de erros permitidos na geração do terreno. Isso influência principalmente na geração de regiões que estão mais afastadas da câmera. Quanto menor o valor maior a qualidade do terrain.

PageWorldX e PageWorldZ: são as dimensões do terreno na direção X e Z respectivamente. A origem é a mesma do ambiente 3D, ou seja, (0,0,0).

MaxHeight: é a altura máxima do terreno.

Visite a está página do wiki da Ogre para uma descrição completa dos parâmetros configuraveis no arquivo terrain.cfg.

Coloque a câmera na posição (750,75,750) para uma melhor visualização inicial. Compile o programa, você deverá ver algo semelhante a figura abaixo.

SkyBox

O SkyBox é um cubo gigante que envolve todo o ambiente 3D, é como se tudo estivesse dentro de uma caixa(SkyBox). Serve para adicionar um fundo, uma paisagem ao ambiente.

    scene_mgr->setSkyBox(true, "Examples/SpaceSkyBox");

 

Um SkyBox é adicionado utilizando o função acima, onde o primeiro parâmetro indica se ele estará habilitado e o segundo informa o material, a textura que irá determinar a imagem do SkyBox. Esse material esta no arquivo "Example.material".

O terceiro parâmetro define a que distância da câmera o SkyBox ficará, o padrão é 5000. O quarto indica se o SkyBox será desenhado na cena antes dos outros elementos, o padrão é true. Caso o SkyBox fique a uma distância de 250 e seja desenhado após os outros elementos ele irá sobrepor a todos eles. Para exemplificar coloque a função "setSkyBox()" como no código abaixo.

    scene_mgr->setSkyBox(true, "Examples/SpaceSkyBox", 250, false);

 

SkyDome

O SkyDome é uma imensa cúpula que cobre toda a cena. Na Ogre o SkyDome é um SkyBox, mas com a textura aplicada de tal forma que pareça ser uma esfera. O box não possui a parte de baixo. A textura é movimentada para simular a locomoção das nuvens.

    scene_mgr->setSkyDome(true, "Examples/CloudySky",2,8);

 

A função "setSkyDome()" acrescenta o SkyDome. O primeiro parâmetro específica se ele estará habilitado ou nao, o segundo o material a ser aplicado. O terceiro o grau de curvatura do SkyDome, esse valor varia de 2 à 65, um valor baixo é melhor para uma visualização mais distante, um número alto aumenta a suavização e aumenta um pouco a qualidade da textura.

O quarto parâmetro indica a quantidade de vezes que a textura é repetida em um tile. O oitavo e nono são a quantidade de segmentos, divisões que o SkyDome terá na direção X e Y respectivamente, o padrão é 16. Compile o programa e uma cena semelhante a figura abaixo deverá aparecer.

SkyPlane

O SkyPlane é mais simples que os "céus" anteriores, ele é apenas um plano colocado acima do ambiente 3D, dessa forma ele exige menor processamento para ser utilizado.

    Plane plane;
    plane.d = 1000;
    plane.normal = Vector3::NEGATIVE_UNIT_Y

 

Inicialmente criamos o plano que será utilizado, ele estará voltado para baixo, dessa forma sua normal deve estar para o eixo negativo de Y.

    scene_mgr->setSkyPlane(true, plane, "Examples/CloudySky", 1500, 75);

 

Depois adicionamos o Skyplane a cena com a função acima, o primeiro parâmetro define se ele estará habilitado, o segundo o plano a ser usado, o terceiro o material da textura. O quarto parâmetro específica a dimensão nxn do Skyplane, no exemplo ele será 1500x1500, o quinto é quantidade de vezes que a textura será repetida. Compile o programa.

Observe que o Skyplane não preenche totalmente o horizonte, ficando um espaço entre o céu e o terreno. Esse problema pode ser contornado adicionando uma curvatura ao SkyPlane, para isso acrescente os parâmetros como no trecho de código abaixo:

    scene_mgr->setSkyPlane(true, plane, "Examples/CloudySky", 1500, 50, true, 1.5, 150, 150);

 

O sexto parâmetro indica se o Skyplane será renderizado primeiro. O sétimo a curvatura do terreno, e o oitavo e nono parâmetros, que devem ser adicionados caso o terreno seja curvo, são a quantidade de segmentos do céu nos eixos X e Y respectivamente. Execute o programa e verá que o horizonte não ficará mais incompleto.

Fog

A neblina(fog) é um recurso que ajuda a compor o ambiente 3D, dando um ar de suspense a cena. Pode ser utilizado também para ocultar elementos da cena, diminuindo o custo computacional de renderização da mesma. É um recurso útil para máquinas menos potentes.

Existem dois tipos de Fog na Ogre:

LINEAR: é o tipo mais simples, cria uma neblina em um intervalo de espaço em relação a câmera.

EXPONENTIAL: a densidade da neblina é aumentada com o aumento da distância da câmera.

    ColourValue cor(0.9, 0.9, 0.9);
    window->getViewport(0)->setBackgroundColour(cor);

 

Primeiramente retire o código de criação dos Skys. E no método "CarregaMalhas()" adicione o trecho de código acima ANTES da função "setWorldGeometry()". Cria-se uma cor quase branca e a define como cor de fundo da cena(setBackgroundColour).

    scene_mgr->setFog(FOG_LINEAR, cor, 0.0, 50, 500);

 

A neblina é adicionada ao ambiente 3D com a função "setFog()", onde o primeiro parâmetro é o tipo de fog, o segundo a cor, o terceiro é específico para o tipo Exponential. O quarto parâmetro é a distância em relação a câmera que a neblina começará e o quinto a distância para o seu fim. Compile e veja como está a cena.

    scene_mgr->setFog(FOG_EXP, cor, 0.005);

 

O outro tipo de fog é a Exponential criada como no código acima, onde o terceiro parâmetro é a densidade da neblina. Observe que esse tipo não encobre tanto o terreno mas sim outros elementos, como por exemplo o robô(que espero não ter sido retirado do código ainda). Existem uma variação que é FOG_EXP2 um pouco mais densa, modifique o primeiro parâmetro e teste.

Italo Mendes
italo.ribeiro@gmail.com

<< Voltar Índice Próxima >>