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