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

index << >>



15.3 Colisão de objetos 3D

1 Visão geral
A detecção da colisão de objetos é um processo fundamental na programação de jogos,
pois é através desse processo que você determina uma reação inteligente ao seu
personagem conforme ele se depara com um outro objeto. O cálculo para se detectar
uma colisão em um mundo 3D é complexo, porém é importante saber que ele é feito
baseado na coordenada do objeto e no raio que o objeto ocupa ao redor dessa
coordenada, logo se houver uma intersecção de coordenadas ou de raios com um outro
objeto houve então uma colisão.

1)Colisão de um objeto com outro objeto particular


dbSetObjectCollisionOn(nObjeto);
Esta função aciona a detecção de colisão do objeto (nObjeto)
especificado com qualquer outro objeto.

nBool = dbObjectCollision(nObjeto,nObjetoAlvo)
Esta função retorna o valor um caso o objeto nObjeto colidiu com o objeto alvo.
Caso você queira detectar a colisão do objeto com qualquer outro objeto, configure
nObjetoAlvo para zero.

Exemplo: 
dbSetObjectCollisionOn (1);
if (dbObjectCollision(1,2) > 0)
{
 dbPlaySound (som_arrastar);
  for (int ncx=1; ncx < 20; ncx++) 
  {
   zbox++; dbPositionObject (2,xbox,ybox,zbox)
  } //endfor
 } // endif
 


Veja agora o programa exemplo completo:	

// colisao3d.cpp // Esse programa ilustra o uso de detecção de colisão da DarkGdk #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; const int som_arrastar = 1; //coordenada dos objetos float xpos = 400, ypos = 10, zpos = 300; float xbox = 400, ybox = 10, zbox = 350; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk // Carrega textura do terreno dbSetWindowTitle("Aguarde..."); dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1); dbLoadSound ("c:\\gameprog\\gdkmedia\\som\\arrastar.wav",som_arrastar); // Inicializa o sistema initsys(); // Prepara o terreno dbMakeMatrix (1,2000,10000,10,50); dbPrepareMatrixTexture (1,1,2,2); texturizar(); //preparando os objetos dbMakeObjectSphere (1,10); dbPositionObject (1,xpos,ypos,zpos); dbMakeObjectCube (2,30); dbPositionObject (2,xbox,ybox,zbox); dbTextureObject (2,1); // Posiciona camera na cena dbPositionCamera (400, 50, 250); // Liga detecção de colisão para o objeto 1 dbSetObjectCollisionOn (1); 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("colisao3d.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())zpos += 5; if (dbDownKey()) zpos -= 5; if (dbLeftKey()) xpos -= 5; if (dbRightKey()) xpos += 5; // Mostra informações na tela dbText (10,10, "Controles: <esc> terminar \t <setas cima,baixo> mover a esfera"); sprintf (sinfo, "xbox:%f ybox:%f zbox:%f ", xbox, ybox, zbox); dbText (10,30, sinfo); if (dbObjectCollision(1,2) > 0) { dbPlaySound (som_arrastar); for (int ncx=1; ncx < 20; ncx++) { zbox++; dbPositionObject (2,xbox,ybox,zbox); } } // endif //movendo os objetos dbPositionObject (1,xpos,ypos,zpos); dbPositionObject (2,xbox,ybox,zbox); } // teclado().fim

index << >>

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