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