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

index << >>



12.1 Criação e manipulação de formas 3D primitivas

12.1.1 Visão geral

Na ilustração acima nós vemos algumas formas primitivas 3D: o cubo, a caixa, 
o piso, a esfera, o cone e o cilindro. A DarkGdk apresenta funções para 
criação e manipulação dessas formas básicas como colorimento, texturização,
rotação, movimentação, posicionamento, escala entre outras coisas.

No exemplo acima utilizamos as funções de criação, colorimento, posicionamento, 
escala e rotação.

12.1.2 Funções de criação
Em todas as funções que criam e manipulam objeto nObj representa um handle
obrigatório que identifica o objeto que está sendo criado ou manipulado. 	

dbMakeObjectCube(nObj, nTamanho) 
Esta função cria um cubo.

dbMakeObjectSphere(nObj, nTamanho)
Esta função cria uma esfera

dbMakeObjectBox( nObj, nLargura, nComprimento, nAltura)
Esta função cria uma caixa

dbMakeObjectCone ( nObj, nAltura)
Esta função cria um cone

dbMakeObjectCylinder (nObj, nAltura)
Esta função cria um cilindro	

dbMakeObjectPlain (nObj , nLargura, nComprimento) 
Esta função cria um piso ou um plano.

dbDeleteObject(obj)
Esta função deleta o objeto especificado. Delete os objetos quando não for 
mais usá-los ou na finalização de sua aplicação.		

12.1.3 Transformações básicas
dbScaleObject (nObj, sx, sy, sz)
Esta função amplia ou reduz o objeto nObj nos eixos  x, y, z.

dbRotateObject (nObj, rx,ry, rz)
Esta função gira o objeto nObj nos eixos  x, y, z.	

dbPositionObject (nObj, xpos, ypos, zpos)
Esta função posiciona o objeto nObj nos eixos x, y, z.

12.1.4 Colorimento
dbColorObject (nObj, nColor);
dbColorObject (1, dbRGB(255,0,0)); 
A função acima define a cor do objeto. Geralmente essa cor é chamada
cor difusa do objeto.

12.1.5 Programa exemplo
Veja o programa que exemplifica o uso das funções apresentadas cima.

// primitivas.cpp // Esse programa mostra a criação e manipulação básica de formas 3D primitivas. #include "DarkGDK.h" // Protótipo das funções void initsys(); // inicializa o sistema void primitivas(); // Cria formas primitivas void teclado(); // Leitura do teclado int terminar = 0; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk initsys(); primitivas(); // 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 obj=0; obj <= 6; obj++) dbDeleteObject(obj); return; } // endif } // fim do while return; } // DarkGDK().fim // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("primitivas.cpp"); } // 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 e posicionamento dos objetos 3D primitivos dbMakeObjectCube(1,50); dbPositionObject(1,590,220,182); dbMakeObjectSphere(2,50); dbPositionObject(2,702,220,175); dbMakeObjectBox(3,50,200,200); dbPositionObject(3,816,200,175); dbMakeObjectCone (4,100); dbPositionObject (4,1005, 220, 175); dbMakeObjectCylinder (5,100); dbPositionObject (5,1205, 220, 175); dbMakeObjectPlain (6,2800,2500); dbPositionObject (6,800,-220,175); // Aplicando cor nesses objetos dbColorObject (1, dbRGB(255,0,0)); dbColorObject (2, dbRGB(0,255,0)); dbColorObject (3, dbRGB(0,0,255)); dbColorObject (4, dbRGB(255,255,0)); dbColorObject (5, dbRGB(255,0,255)); dbColorObject (6, dbRGB(0,64,0)); // Aplicando escala no cilindro e rodando o box dbScaleObject (5,100,200,100); dbRotateObject (3,0,-25,0); // Vamos rodar o piso dbRotateObject (6,0,90,90); } // primitivas().fim
Conceito de culling A imagem que abre esse capítulo tem um defeito: o cilindro não está com a visualização correta, está faltando a tampa. Isso ocorre por conta do efeito de culling que remove da renderização tudo que não vai contribuir para a imagem final tal como objetos e partes que estão totalmente obstruídos por outros. Na imagem acima, a geometria de trás do cilindro não foi renderizada. Para corrigir algum problema que o culling pode causar você pode desligá-lo individualmente para cada objeto da cena com a função dbSetObjectCull( nObjeto, nCull). Exemplo: const int obj_cilindro = 6; dbSetObjectCull (obj_cilindro, 0); Para ligar de volta o culling, coloque 1 no argumento nCull. O culling aumenta a performance de uma aplicação 3d evitando o desperdício de processamento com geometria escondida.
index << >>


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