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

index << >>



11.1 Posicionamento e rotação

11.1.1 Posicionando a camera

Posicionando a camera
Na ilustração acima a camera foi posicionada com essa configuração:	
dbPositionCamera (1005, 475, -600); O terreno está posicionado na
posição (0,0,0).

dbPositionCamera ( x, y, z) - posiciona a camera na posição (x,y,z) especificada.
(x,y,z) são argumentos do tipo float.

11.1.2 Rotacionando a camera

Na imagem acima a camera foi rotacionada em seus três eixos com a função 
dbRotateCamera(rx, ry, rz). Os argumentos rx, ry, rz representam ângulos em
graus e são do tipo float. Os seguintes valores foram usados (13, -23, 39).

11.1.3 Avançando a camera
A função dbMoveCamera (float nPassos) faz a camera avançar adiante na quantidade
de passos definida em nPassos. A camera é movida na direção que está apontando. 

11.1.4 Programa exemplo
Rode o programa exemplo e teste as funções dbPositionCamera() e dbRotateCamera() 
para assimilar o efeito delas no mundo 3D. Utilize as teclas de direção para
isso junto com as teclas Page-Up e Page-Down. 
	
// camera01.cpp // Esse programa mostra como manipular a camera default #include "DarkGDK.h" // Protótipo das funções void initsys(); // inicializa o sistema void teclado(); // Interpreta o teclado void texturizar(); // Texturiza a matrix // Configuração da camera float xcam = 1005, ycam = 475, zcam = -555; float xcam_rot = 0, ycam_rot = 0, zcam_rot = 0; // Configuração dos modos int modo = 1; int modo_mover = 0; int modo_cam = 1; int modo_cam_rot = 4; int terminar = 0; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk initsys(); // Criação básica de um terreno com o posicionamento da câmera para visualizá-lo dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1); dbMakeMatrix (1,2000,10000,10,50); dbPrepareMatrixTexture (1,1,2,2); texturizar(); // Looping principal while ( LoopGDK ( ) ) { if (terminar == 0) teclado(); dbSync ( ); if (terminar == 1) { dbDeleteImage (1); dbDeleteMatrix (1); return; } // endif } // fim do while return; } // fim da função: DarkGDK // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("camera01.cpp"); dbSetTextOpaque(); dbDisableEscapeKey(); } // 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); dbPositionCamera (1005, 475, -600); } // texturizar().fim // ---------------------------------------------------------------------------- // teclado() - Lê o teclado e executa comandos do usuário void teclado() { char sinfo[255]; // Lê o teclado char *stecla="??"; stecla = dbInKey(); if (dbEscapeKey()) terminar = 1; // Troca de modo if (!strcmp(stecla, "0")) modo = modo_mover; if (!strcmp(stecla, "c")) modo = modo_cam; if (!strcmp(stecla, "r")) modo = modo_cam_rot; // Movimentação dos objetos if (dbUpKey()) { if (modo == modo_cam) zcam++; if (modo == modo_cam_rot) zcam_rot++; } // endif if (dbDownKey()) { if (modo == modo_cam) zcam--; if (modo == modo_cam_rot) zcam_rot--; } // endif if (dbLeftKey()) { if (modo == modo_cam) xcam--; if (modo == modo_cam_rot) xcam_rot--; } // endif if (dbRightKey()) { if (modo == modo_cam) xcam++; if (modo == modo_cam_rot) xcam_rot++; } // endif if (dbKeyState(201)) { if (modo == modo_cam) ycam++; // page_up; if (modo == modo_cam_rot) ycam_rot++; } // endif if (dbKeyState(209)) { if (modo == modo_cam) ycam--; // page_down; if (modo == modo_cam_rot) ycam_rot--; } // endif // Testando função de movimento if (!strcmp(stecla, "u")) modo = 0; if (!strcmp(stecla, "u")) dbMoveCamera (5.0f); // Mostra informações na tela if (modo == modo_cam) { dbText (10,10, "modo = modo_cam - (r) para modo rotacionar - (u) - mover"); sprintf (sinfo, "xcam:%f ycam:%f zcam:%f", xcam, ycam, zcam); dbText (10,30, sinfo); if (!strcmp(stecla, "m")) dbWriteToClipboard(sinfo); } // endif if (modo == modo_cam_rot) { dbText (10,10, "modo = modo_cam_rot - (c) para modo posicionar camera"); sprintf (sinfo, "xcam_rot:%f ycam_rot:%f zcam_rot:%f", xcam_rot, ycam_rot, zcam_rot); dbText (10,30, sinfo); if (!strcmp(stecla, "m")) dbWriteToClipboard(sinfo); } // endif // Resseta o teclado strcpy(stecla,"??"); if (modo > modo_mover) dbPositionCamera (xcam, ycam, zcam); dbRotateCamera (xcam_rot, ycam_rot, zcam_rot); } // teclado().fim

index << >>


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