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

index << >>



12.3 Texturas

1. Visão geral

Comparando-se as duas imagens na ilustração acima percebe-se que a textura
adiciona um grande grau de realismo a uma cena 3d.

Para texturizar um objeto basicamente é necessário carregar uma imagem de
textura e usar uma função para aplicá-la no objeto. Pode ser que o resultado
não fique muito bom, então é necessário o uso de outras funções para ajustar
a textura no objeto como escalar, mover ou rotacionar a textura.

2.Funções de textura

-------------------------------------------------------------------------------
void dbTextureObject ( int iID, int iImage );
void dbTextureObject ( nObjeto, nImagem );
Esta função aplica uma textura ao objeto.

Exemplo: 
// Identificação dos objetos
const int obj_piso = 1;
// Identificação das texturas
const int txt_piso = 1;
dbMakeObjectPlain (obj_piso,2800,2500); 
dbLoadImage ("grass3.jpg", txt_piso);
dbTextureObject(obj_piso, txt_piso);


-------------------------------------------------------------------------------
void dbScaleObjectTexture ( int iID, float fU, float fV );
dbScaleObjectTexture( nObjeto , uFatorx, vFatory);
Essa função aplica escala à  textura  de  um  objeto.  É semelhante ao
processo de tiling ou azulajamento de uma aplicação 3d como Blender ou
3D Studio Max,  na qual a textura se repete pelos eixos horizontal(x),
e vertical (y) da image. 

No   vocabulário   de  textura  chama-se (u) o eixo horizontal da textura, 
enquanto o eixo vertical chama-se (v).    A textura é 'forrada' no objeto
deitando o eixo u da textura sobre o eixo x do objeto e o eixo u cobrindo
o eixo y do objeto. Segue abaixo a descrição dos argumentos dessa função:

	uFatorx		- fator de escala do eixo u da textura
	vFatory		- fator de escala do eixo v da textura

Exemplo: 
// Identificação dos objetos
const int obj_piso = 1;
// Identificação das texturas
const int txt_piso = 1;
dbMakeObjectPlain (obj_piso,2800,2500); 
dbLoadImage ("grass3.jpg", txt_piso);
dbTextureObject(obj_piso, txt_piso);
// Corrigindo a textura do piso
dbScaleObjectTexture(obj_piso, 5.0f, 5.0f);


Veja agora o programa completo:
// textura.cpp // Esse programa ilustra como texturizar os objetos #include "DarkGDK.h" // Protótipo das funções void initsys(); // inicializa o sistema void primitivas(); // Cria formas primitivas void teclado(); // Leitura do teclado void carregar_textura(); // Carrega imagens de textura void texturizar(); // Texturiza os objetos int terminar = 0; // Identificação dos objetos const int obj_piso = 1; const int obj_esfera = 2; const int obj_retangulo = 3; const int obj_caixa = 4; const int obj_cilindro = 5; const int obj_cone = 6; // Identificação das texturas const int txt_piso = 1; const int txt_esfera = 2; const int txt_retangulo = 3; const int txt_caixa = 4; const int txt_cilindro = 5; const int txt_cone = 6; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk initsys(); carregar_textura(); primitivas(); texturizar(); // Configuração da camera dbPositionCamera (979.0f, 475.0f, -254.0f); dbRotateCamera (29.0f, -3.0f, -6.0f); // Looping principal while ( LoopGDK ( ) ) { teclado(); dbSync ( ); if (terminar == 1) { // Vamos deletar os objetos for (int ncx=1; ncx <= 6; ncx++) { dbDeleteObject(ncx); dbDeleteImage(ncx); } // endfor (deletar objetos) return; } // endif } // fim do while return; } // DarkGDK().fim // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("textura.cpp"); dbSetAmbientLight(100); dbSetDisplayMode(640,480,32); dbSetWindowSize(640,480); } // initsys().fim // Leitura do teclado void teclado() { char *stecla = "??"; stecla = dbInKey(); // Vamos encerrar se a tecla "q" for pressionada if (strcmp(stecla, "q") == 0) terminar = 1; strcpy (stecla,"??"); dbText (10,10, "Pressione 'q' para sair"); } // teclado().fim // ---------------------------------------------------------------------------- void primitivas() { // Criação dos objetos 3D primitivos dbMakeObjectCube(obj_caixa,50); dbMakeObjectSphere(obj_esfera,50); dbMakeObjectBox(obj_retangulo,50,200,200); dbMakeObjectCone (obj_cone,100); dbMakeObjectCylinder (obj_cilindro,100); dbMakeObjectPlain (obj_piso,2800,2500); // Posicionamento dos objetos dbPositionObject(obj_caixa,590,220,182); dbPositionObject(obj_esfera,702,220,175); dbPositionObject(obj_retangulo,816,200,175); dbPositionObject (obj_cone,1005, 220, 175); dbPositionObject (obj_cilindro,1205, 220, 175); dbPositionObject (obj_piso,800,-220,175); // Corrigindo a visualização do cilindro dbSetObjectCull (obj_cilindro, 0); // Corrigindo a textura do piso dbScaleObjectTexture(obj_piso, 5.0f, 5.0f); // Aplicando escala no cilindro e rodando a caixa dbScaleObject (obj_cilindro,100,200,100); dbRotateObject (obj_caixa,0,-25,0); // Vamos rodar o piso dbRotateObject (obj_piso,0,90,90); } // primitivas().fim void carregar_textura() { dbSetDir ("c:\\gameprog\\gdkmedia\\textura"); dbLoadImage ("grass3.jpg", txt_piso); dbLoadImage ("pjbasesky.jpg", txt_esfera); dbLoadImage ("archpart7.jpg", txt_retangulo); dbLoadImage ("x_support.tga", txt_caixa); dbLoadImage ("concrete.jpg", txt_cilindro); dbLoadImage ("ceilingtech02.jpg", txt_cone); } // carregar_textura().end void texturizar() { dbTextureObject(obj_piso, txt_piso); dbTextureObject(obj_esfera, txt_esfera); dbTextureObject(obj_retangulo, txt_retangulo); dbTextureObject(obj_caixa, txt_caixa); dbTextureObject(obj_cilindro, txt_cilindro); dbTextureObject(obj_cone, txt_cone); } // texturizar().end

index << >>

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