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

index << >>



15.4 Manipulando sub-objetos

1 Visão geral

Os melhores modelos 3D são formados da união de pequenas peças 3d.
Dentro da DarkGdk essas peças são chamadas  limbs ou  membros  no
idioma português.

Tal como ocorre com outros objetos dentro da DarkGdk, existe
um conjunto de funções para manipular esses membros e outro
conjunto para obter  os  estados desses  membros. Há funções
para escalar, mover e rotacionar  os  limbs  e  naturalmente
há as funções para obter o valor  dessas  configurações.  Há
também funções para texturizar os membros.

Geralmente os limbs possuem nomes e números pelos quais
podem ser identificados e manipulados. O limb de número
0 é a raiz do objeto e não é nomeado.


1. Identificando os membros
dbPerformChecklistForObjectLimbs(nObjeto);
nqtd = dbChecklistQuantity();
snome = dbChecklistString( nIndex); 

Através das funções acima você verifica e coleta a
quantidade de limbs e os seus respectivos nomes
de dentro de um objeto 3D.

Exemplo:
// ver_membros() - Verifica membros de um objeto 3d void ver_membros() { // Variáveis para a coleta de informações char sinfo[255]; int nqtd = 0; char *snome = NULL; // Verifica a quantidade de limbs (membros) no objeto dbPerformChecklistForObjectLimbs(1); nqtd = dbChecklistQuantity(); // Configurar curso de impressão dbSetCursor (1,10); // Obtém o número e nome dos membros for (int ncx=0; ncx < nqtd; ncx++) { snome = dbChecklistString(ncx+1); sprintf(sinfo, " %d.%s", ncx, snome); dbPrint ( sinfo ); } // for.end } // ver_membros().fim
2. Manipulando os membros ------------------------------------------------------------------------------- void dbScaleLimb ( int iID, int iLimbID, float fX, float fY, float fZ ); dbScaleLimb(nObjeto, nMembro, sx, sy, sz); Essa função aplica uma escala no membro do objeto especificado. Os parâmetros sx, sy, sz representam os fatores de escala dos eixos x,y,z. Exemplo: dbScaleLimb(1, 10, 200, 200, 200); // cabeça ------------------------------------------------------------------------------- void dbRotateLimb ( int iID, int iLimbID, float fX, float fY, float fZ ); dbRotateLimb (nObjeto, nMembro, ax,ay,az); Essa função aplica uma rotação no membro do objeto especificado. Os parâmetros ax, ay, az representam os ângulos nos eixos x,y,z. Exemplo: dbRotateLimb (1, 10, 0,15,0); // cabeça ------------------------------------------------------------------------------- void dbOffsetLimb ( int iID, int iLimbID, float fX, float fY, float fZ ); dbOffsetLimb(nObjeto, nMembro, dx,dy,dz); Essa função modifica a posição do membro do objeto especificado. Os parâmetros dx, dy, dz representam o deslocamento relativo do membro em relação aos membros anteriores, geralmente os membros que lhe antecem na hierarquia de ligações. Exemplo: dbOffsetLimb(1, 18, 2,2,2); // arma ------------------------------------------------------------------------------- void dbHideLimb ( int iID, int iLimbID ); dbHideLimb (nObjeto, nMembro); Essa função esconde o membro do objeto especificado. Exemplo: dbHideLimb (1, 19); // cinto Veja agora o programa exemplo completo:
// sub0bj01.cpp // Esse programa mostra como manipular subojetos #include "DarkGDK.h" // Protótipo das funções void initsys(); // inicializa o sistema void ver_membros(); // Verifica membros do objeto 3d // Posição do modelo 3d float xobj_pos = 970, yobj_pos = 300, zobj_pos = -185; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk // Fixa o diretório de trabalho e carrega textura do modelo 3D dbSetDir ("c:\\gameprog\\gdkmedia\\Modelos\\German"); dbLoadImage ("german.dds",2); // Carrega modelo 3d com animação de ocioso dbLoadObject ("H-German-Idle.x",1); // Textura o modelo 3d 1 com a segunda imagem dbTextureObject (1,2); dbScaleLimb(1, 10, 200, 200, 200); // cabeça dbScaleLimb(1, 4, 200, 200, 200); // pé esquerdo dbScaleLimb(1, 7, 200, 200, 200); // pé direito dbRotateLimb (1, 10, 0,15,0); // cabeça dbOffsetLimb(1, 18, 2,2,2); // arma dbHideLimb (1, 19); // cinto // Configuração inicial de exibição initsys(); // Criação básica de um terreno dbMakeMatrix (1,2000,10000,10,50); // Posiciona e escala o objeto dbPositionObject (1,xobj_pos,yobj_pos, zobj_pos); dbScaleObject (1,15000,15000,15000); // Posiciona a camera dbPositionCamera (1005, 475, -600); dbSyncOn(); ver_membros(); // Looping principal while ( LoopGDK ( ) ) { dbSync ( ); ver_membros(); } // fim do while dbDeleteImage (1); dbDeleteMatrix (1); dbDeleteObject (1); return; } // fim da função: DarkGDK // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("subobj01.cpp"); dbSetTextOpaque(); dbSetAmbientLight(100); } // initsys().fim // ver_membros() - Verifica membros de um objeto 3d void ver_membros() { // Variáveis para a coleta de informações char sinfo[255]; int nqtd = 0; char *snome = NULL; // Verifica a quantidade de limbs (membros) no objeto dbPerformChecklistForObjectLimbs(1); nqtd = dbChecklistQuantity(); // Configurar curso de impressão dbSetCursor (1,10); // Obtém o número e nome dos membros for (int ncx=0; ncx < nqtd; ncx++) { snome = dbChecklistString(ncx+1); sprintf(sinfo, " %d.%s", ncx, snome); dbPrint ( sinfo ); } // for.end } // ver_membros().fim

index << >>

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