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