Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 12.3
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