Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 18.2

index << >>



18.2 Terreno simples

1.1 Construindo um terreno simples


Bem, agora vamos conhecer melhor as funções que possibilitaram a construção
do terreno acima que fizemos esforço para parecer-se com um campo de futebol.


dbSetupTerrain();
void dbSetupTerrain ( void );
Essa função inicializa o processo de criação do terreno, realizando processos
internos. Você deve começar sempre o processo de criação com essa função e 
aplicar as outras funções numa ordem lógica para obter o resultado correto.
---------------------------------------------------------------------------


dbMakeObjectTerrain( nTerreno )
void  dbMakeObjectTerrain( int iID ); 	
Essa função registra um handle de identificação para o terreno que deverá ser
utilizado em funções subsequentes para manipulá-lo.
---------------------------------------------------------------------------


dbSetTerrainHeightMap( nTerreno, sArquivoMapa)
void  dbSetTerrainHeightMap ( int iID, char* dwHeightMap ); 
Essa função configura o mapa de altura no terreno especificado. Para melhor
resultado utilize uma imagem formato BMP a partir de 8 bits (256 cores),
tamanho 256x256 com tons entre o preto e o branco. Lembrando que o branco
e o preto representam respectivamente a elevação máxima e nenhuma elevação
com os diversos tons de cinza ocasionando alturas diversas.

Exemplo: 
// Determinando o mapa de altura
dbSetTerrainHeightMap ( nTerreno, "mapa_altura.bmp" ); 
	
---------------------------------------------------------------------------



dbSetTerrainTexture(nTerreno, nImagemCor, nImagemDetalhe);
void dbSetTerrainTexture( int iID, int iBase, int iDetail );
Essa função define a imagem de difusão e a imagem de detalhe do terreno
especificado. 

Veja na ilustração abaixo que a imagem de cor é projetada sobre o terreno 
imprimindo ao mesmo tempo sua cor e seu desenho sobre ele. 

A imagem de detalhe dá textura ao ao terreno replicando-se em cada segmento
do mesmo. Sem essa imagem de detalhe o terreno fica com um aspecto liso.

Nosso exemplo não replica exatamente as cores  do  mapa  de  cor  porque 
projetamos uma luz esverdeada sobre o terreno para reforçar  o  verde  do
gramado e dessa forma as demais cores também sofrem esse efeito esverdeante 
da luz.
	
Veja abaixo o cenário de uso da função dbSetTerrainTexture(): 
// (...) procedimentos anteriores necessários... // Vamos nomear os números para ficar mais legível nosso programa #define nTerreno 1 // identificação do terreno sendo trabalhado #define img_textura 1 // textura ou mapa de cor do terreno #define img_detalhe 2 // textura de detalhamento // Carregando as imagens de trabalho dbSetDir("c:\\gameprog\\gdkmedia\\bitmap"); dbLoadImage ( "mapa_cor.jpg", img_textura ); dbLoadImage ( "detalhes.jpg", img_detalhe ); // Determinando a textura difusa e a textura de detalhe dbSetTerrainTexture ( nTerreno, img_textura, img_detalhe );
--------------------------------------------------------------------------- dbSetTerrainScale(nTerreno, sx, sy, sz); void dbSetTerrainScale ( int iID, float fXScale, float fYScale, float fZScale ); Essa função aplica uma merecida escala no terreno. Use essa função para expandir o tamanho do terreno pelos três eixos. Exemplo: // (...) procedimentos anteriores necessários... // Vamos nomear os números para ficar mais legível nosso programa #define nTerreno 1 // identificação do terreno sendo trabalhado // Vamos ajustar a escala do terreno // ...mais largo no eixo X e Z; menor no eixo Y float escala_x, escala_y, escala_z; escala_x = 3.0f; escala_y = 0.6f; escala_z = 3.0f; dbSetTerrainScale ( nTerreno, escala_x, escala_y, escala_z ); --------------------------------------------------------------------------- dbSetTerrainLight ( nTerreno, xluzdir, yluzdir, zluzdir, luzred, luzgreen, luzblue, luz_intensidade ); void dbSetTerrainLight ( int iID, float fX, float fY, float fZ, float fRed, float fGreen, float fBlue, float fScale ); Essa função define cor, direção e a intesidade da luz sobre o terreno. Exemplo: // (...) procedimentos anteriores necessários... // Vamos nomear os números para ficar mais legível nosso programa #define nTerreno 1 // identificação do terreno sendo trabalhado // Ajustando a iluminação do terreno com uma luz esverdeante float xdir, ydir, zdir; float red, green, blue, intensidade; xdir = 1.0f; ydir = -0.25f; zdir = 0.0f; red = 0.55f; green = 1.0f; blue = 0.0f; intensidade = 0.2f; dbSetTerrainLight ( nTerreno, xdir, ydir, zdir, red, green, blue, intensidade ); --------------------------------------------------------------------------- dbBuildTerrain(nTerreno); void dbBuildTerrain ( int iID ); Essa função constrói o terreno e mostra-o na tela. Essa função deve fechar o bloco de funções de terreno. --------------------------------------------------------------------------- dbUpdateTerrain(); void dbUpdateTerrain ( void ); Essa função atualiza os dados internos do terreno permitindo assim uma renderização atualizada do mesmo. Você deve usar essa função antes de dbSync(). ---------------------------------------------------------------------------
1.2 Programa exemplo Veja agora o programa exemplo integralmente:
// terrain01.cpp - Esse programa mostra como construir um simples terreno #include "DarkGDK.h" void initsys(void); // inicializa o sistema void construir_terreno(void); // configura e mostra o terreno // Faz a leitura do teclado e atualiza a visualização void atualizar_visao(void); #define nTerreno 1 // handle do terreno void DarkGDK ( void ) { initsys(); construir_terreno(); // Ajustando a camera dbPositionCamera ( 385, 23, 100 ); // Looping principal while ( LoopGDK ( ) ) { atualizar_visao(); // Atualize a tela dbSync ( ); }// endwhile }// endfunction: darkgdk //----------------------------------------------------------------------------- void initsys(void) { dbSyncOn ( ); dbSyncRate ( 60 ); dbSetWindowTitle("terrain01.cpp"); }// endfunction: initsys() //----------------------------------------------------------------------------- void construir_terreno(void) { // Vamos nomear os números para ficar mais legível nosso programa #define img_textura 1 // textura ou mapa de cor do terreno #define img_detalhe 2 // textura de detalhamento // Carregando as imagens de trabalho dbSetDir("c:\\gameprog\\gdkmedia\\bitmap"); dbLoadImage ( "mapa_cor.jpg", img_textura ); dbLoadImage ( "detalhes.jpg", img_detalhe ); // inicializando o processo de construção de terreno dbSetupTerrain ( ); // Obtendo o handle para o terreno dbMakeObjectTerrain ( nTerreno ); // Determinando o mapa de altura dbSetTerrainHeightMap ( nTerreno, "mapa_altura.bmp" ); // Ajustando a escala do terreno // Mais largo no eixo X e Z; menor no eixo Y float escala_x, escala_y, escala_z; escala_x = 3.0f; escala_y = 0.6f; escala_z = 3.0f; dbSetTerrainScale ( nTerreno, escala_x, escala_y, escala_z ); // Ajustando a iluminação do terreno float xdir, ydir, zdir; float red, green, blue, intensidade; xdir = 1.0f; ydir = -0.25f; zdir = 0.0f; red = 0.55f; green = 1.0f; blue = 0.0f; intensidade = 0.2f; dbSetTerrainLight ( nTerreno, xdir, ydir, zdir, red, green, blue, intensidade ); // Determinando a textura difusa e a textura de detalhe dbSetTerrainTexture ( nTerreno, img_textura, img_detalhe ); // Tudo pronto, agora mostre o terreno dbBuildTerrain ( nTerreno ); }// endfunction: construir_terreno() //----------------------------------------------------------------------------- void atualizar_visao() { // Vamos controlar a camera com as setas float nVelocidade = 2.0f; float nVelocidadeGiroLateral = 2.0f; int nCamera = 0; // Camera default dbControlCameraUsingArrowKeys ( nCamera, nVelocidade, nVelocidadeGiroLateral ); // Encontre a altura do terreno na posição da camera float xcam, zcam, nAltura; xcam = dbCameraPositionX(); zcam = dbCameraPositionZ(); nAltura = dbGetTerrainGroundHeight ( nTerreno, xcam, zcam); // Vamos recolocar a camera um pouco acima do chão nAltura = nAltura + 10.0f; dbPositionCamera ( xcam, nAltura, zcam); // Atualize o terreno dbUpdateTerrain ( ); } // endfunction: atualizar_visao()

index << >>


Produzido por Gameprog: Jair Pereira - Setembro/2013 © gameprog.br@gmail.com http://www.gameprog.com.br http://www.nucleoararat.com.br