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

index << >>



11.2 Outras funções de rotação

11.2.1 Rotação de câmera em um eixo apenas

Através da função dbRotateCamera() que usamos no capítulo anterior nós conseguimos
rodar a camera nos três eixos simultâneamente. Há três funções que rodam a camera
em cada eixo isoladamente:

dbXRotateCamera (rx) - Roda a camera no eixo x
dbYRotateCamera (ry) - Roda a camera no eixo y
dbZRotateCamera (rz) - Roda a camera no eixo z

Os argumentos representam ângulos e são do tipo float. Os valores podem ser também
negativos.

11.2.2 Outras funções de rotação de câmera
Há outro grupo de funções que especificam ainda mais o trabalho de rodar a
camera:	

dbTurnCameraLeft( nAngulo )
dbTurnCameraRight( nAngulo )
Estas funções giram a camera para a esquerda e direita. São semelhantes a uma rotação
no eixo y.

dbPitchCameraUp( nAngulo )
dbPitchCameraDown( nAngulo ) 
Estas funções giram a camera para cima e para baixo. São semelhantes a uma rotação
no eixo x.	

dbRollCameraLeft( nAngulo )
dbRollCameraRight( nAngulo ) 
Estas funções giram a camera para esquerda e direita aplicando um efeito-parafuso na
visualização. São semelhantes a uma rotação no eixo z.

O grupo de funções acima vai sempre somando nAngulo à rotação anterior da
camera de forma que estas funções em um looping com o valor de nAngulo fixo
vão rodar a camera continuamente.	

11.2.3 Programa exemplo
Veja nosso programa que testa as funções apresentadas. É basicamente o mesmo 
programa do capítulo anterior que faz a mesma coisa com funções diferentes:	
// camera02.cpp // Esse programa mostra como manipular a camera default // O modo_cam testa as funções dbTurnCameraLeft, dbTurnCameraRight, // dbRollCameraLeft, dbRollCameraRight, dbPitchCameraDown, dbPitchCameraUp #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 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("camera02.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) dbRollCameraLeft(5); if (modo == modo_cam_rot) zcam_rot--; if (modo == modo_cam_rot) dbZRotateCamera (zcam_rot); } // endif if (dbDownKey()) { if (modo == modo_cam) dbRollCameraRight(5); if (modo == modo_cam_rot) zcam_rot++; if (modo == modo_cam_rot) dbZRotateCamera (zcam_rot); } // endif if (dbLeftKey()) { if (modo == modo_cam) dbPitchCameraUp(1); if (modo == modo_cam_rot) xcam_rot--; if (modo == modo_cam_rot) dbXRotateCamera(xcam_rot); } // endif if (dbRightKey()) { if (modo == modo_cam) dbPitchCameraDown(1); if (modo == modo_cam_rot) xcam_rot++; if (modo == modo_cam_rot) dbXRotateCamera(xcam_rot); } // endif if (dbKeyState(201)) { if (modo == modo_cam) dbTurnCameraLeft(5); if (modo == modo_cam_rot) ycam_rot++; if (modo == modo_cam_rot) dbYRotateCamera(ycam_rot); } // endif if (dbKeyState(209)) { if (modo == modo_cam) dbTurnCameraRight(5); // page_down; if (modo == modo_cam_rot) ycam_rot--; if (modo == modo_cam_rot) dbYRotateCamera(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"); dbText (10,30, "cima/baixo - esquerda/direita - page_up/page_down"); } // 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,"??"); } // teclado().fim

index << >>


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