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

index << >>



14.2 Adicionando iluminação

01.1 Visão geral
Já vimos que a DarkGdk adiciona uma luz default na sua cena, mas para melhores efeitos você pode adicionar e configurar novas luzes no ambiente criado. Na ilustração acima, o soldado está iluminado por uma luz vermelha. A luz está posicionada logo acima e atrás de sua cabeça e aponta para o entorno de seus pés. dbMakeLight(nLuz); Esta função adiciona uma luz (nLuz) na cena. Ex.: dbMakeLight(2); ------------------------------------------------------------------------------- void dbSetSpotLight ( int iLight, float fInner, float fOuter ); dbSetSpotLight(nLuz, nConeInterno, nConeExterno); Esta função configura a luz criada como um holofote (spot). Os argumentos nConeInterno e nConeExterno determinam respectivamente a área forte e a área fraca aonde luz começa a esmaecer. Ex.: dbSetSpotLight(2, 0, 90); ------------------------------------------------------------------------------- dbColorLight(nLuz, nCor); Esta função configura a luz indicada com a cor indicada. Ex.: const int vermelho = 0xFF0000; dbColorLight(2, vermelho); ------------------------------------------------------------------------------- dbPositionLight(nLuz, xpos, ypos, zpos); Esta função reposiciona a luz indicada (nLuz) na posição especificada (xpos, ypos, zpos). Você pode utilizar vários valores para a posição para criar animação de luz. Ex.: dbPositionLight(2, xfoco, yfoco + 250,zfoco); ------------------------------------------------------------------------------- dbPointLight(2, xfoco,yfoco,zfoco); Esta função focaliza a luz indicada no ponto indicado (xfoco, yfoco, zfoco). Esta função funciona apenas com a luz do tipo spot ou direcional. dbPointLight(2, xfoco,yfoco,zfoco); ------------------------------------------------------------------------------- dbSetNormalizationOn(); Esta função normaliza as 'normais' dos objetos 3d para receberem adequadamente a iluminação. A normal é um vector, linha ou raio que indica o lado da superfície que deve ser iluminado. Se este aspecto estiver invertido o objeto aparece com pontos escuros aonde devia ser iluminado. Ex.: dbSetNormalizationOn(); Veja agora nosso programa exemplo:
// luz02.cpp // Esse programa mostra como manipular uma luz #include "DarkGDK.h" #include "windows.h" // Protótipo das funções void initsys(); // inicializa o sistema void teclado(); // Interpreta o teclado void texturizar(); // Texturiza a matrix // Variáveis de trabalho int terminar = 0; float xfoco = 970, yfoco = 300, zfoco = -185; const int vermelho = 0xFF0000; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk // Carrega textura do terreno dbSetWindowTitle("Aguarde..."); dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1); // Carrega e texturiza objeto dbSetDir ("c:\\gameprog\\gdkmedia\\Modelos\\German"); dbLoadImage ("german.dds",2); dbLoadObject ("H-German-Idle.x",1); dbTextureObject (1,2); // Inicializa o sistema initsys(); // O objeto 10 é nosso cursor do apontamento da luz dbMakeObjectSphere(10,10); //O objeto 11 é nosso cursor da posição da luz //dbMakeObjectSphere (11,10); // Prepara o terreno dbMakeMatrix (1,2000,10000,10,50); dbPrepareMatrixTexture (1,1,2,2); texturizar(); // Posiciona o soldado na cena dbPositionObject (1,970, 300, -185); dbScaleObject (1,12000,12000,12000); dbFixObjectPivot(1); // Coloca nosso cursor na cena dbPositionObject (10,xfoco,yfoco,zfoco); // Objeto 11: Marcador da posição da luz de // dbPositionObject (11,xfoco,yfoco+250,zfoco); // Esconde a luz padrão dbHideLight(0); // Use esta função para que os modelos 3D sejam iluminados corretamente dbSetNormalizationOn(); // Criação e configuração de luz dbMakeLight(2); dbSetSpotLight(2, 0, 90); dbColorLight(2, vermelho); dbPositionLight(2, xfoco, yfoco + 250,zfoco); dbPointLight(2, xfoco,yfoco,zfoco); // Posiciona camera na cena dbPositionCamera (1005, 475, -600); dbSyncOn(); // Looping principal while ( LoopGDK ( ) ) { if (terminar == 0) teclado(); dbSync ( ); if (terminar == 1) { dbDeleteImage (1); dbDeleteMatrix (1); dbDeleteObject (1); return; } // endif } // fim do while return; } // fim da função: DarkGDK // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("luz02.cpp"); dbSetTextTransparent(); dbDisableEscapeKey(); dbSyncRate(60); } // initsys().fim // ---------------------------------------------------------------------------- // texturizar() - Aplica aleatóriamente a textura na matrix void texturizar() { int linha, coluna; for (coluna = 0; coluna < 10; coluna++) { for (linha = 0; linha < 50; linha++) { int tile = dbRnd(4) + 1; dbSetMatrixTile (1, coluna, linha, tile); } // linha } //coluna dbUpdateMatrix (1); } // texturizar().fim // ---------------------------------------------------------------------------- // teclado() - Lê o teclado e executa comandos do usuário void teclado() { char sinfo[255]; if (dbEscapeKey()) terminar = 1; // Movimentação do ponto de foco da luz if (dbUpKey())zfoco += 5; if (dbDownKey()) zfoco -= 5; if (dbLeftKey()) xfoco -= 5; if (dbRightKey()) xfoco += 5; if (dbKeyState(201)) yfoco += 5; if (dbKeyState(209)) yfoco -= 5; // Mostra informações na tela dbText (10,10, "Controles: <esc> terminar \t <setas> mover o foco de luz."); sprintf (sinfo, "xfoco:%f yfoco:%f zfoco:%f ", xfoco, yfoco, zfoco); dbText (10,30, sinfo); // Focaliza luz e marca posição do foco dbPositionObject(10, xfoco, yfoco, zfoco); dbPositionLight(2, xfoco,yfoco + 250,zfoco); dbPointLight(2, xfoco,yfoco,zfoco); } // teclado().fim

index << >>


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