Quarto tutorial sobre OpenGL, vou mostrar um pouco sobre matrizes e já poderemos contar com alguma movimentação na tela, diferente do triângulo estático do tutorial anterior. Se é a sua primeira vez nesse tutorial você pode visualizar o primeiro aqui, ou pode navegar pela tag OpenGL aqui.
Algo que é necessário saber sobre OpenGL antes de prosseguirmos o tutorial é sobre a forma (peculiar?) que são feitos os desenhos na tela. Diferente da maioria das linguagens de programação e API’s mais conhecidas, OpenGL funciona sobre uma máquina de estados, isso quer dizer que as operações feitas sobre ele alteram um determinado estado no seu programa (que nesse caso é a máquina de estados) e afetam todos os aspectos da execução, por isso é necessário tomar alguns cuidados extras na programação usando essa API.
Esse conceito foi sutilmente introduzido no terceiro tutorial, mais evidentemente nesse trecho de código.
glBegin (GL_TRIANGLES); glColor3ub (255, 0, 0); glVertex3f (0, 1, 0); glColor3ub (0, 255, 0); glVertex3f (-1, 0, 0); glColor3ub (0, 0, 255); glVertex3f (1, 0, 0); glEnd ();
Na chamada da função glColor3ub (255, 0, 0) acima, a cor dos desenhos feitos na tela foi alterada para vermelho. Se não houvesse as chamadas de função nas linhas 6 e 9, todos os vértices do triângulo seriam vermelhos (pode testar).
Uma forma de evitar esses “contratempos” é encapsular todo o desenho em uma única função e garantir que o estado da máquina OpenGL antes e depois da chamada seja o mesmo, um exemplo disso será visto no código. Claro que ainda há problemas com threads concorrentes e execução de operações desnecessárias, mas o comportamento do seu trecho de código será mais parecido com o esperado.
Com isso em mente fica mais fácil entender como funciona o esquema de matrizes em OpenGL.
Matrizes são as estruturas onde são feitos e manipuladas todas as formas que serão desenhadas na tela. As operações, como por exemplo criação, rotação e translação, são capazes de afetar somente uma matriz o que torna possível alterar áreas isolados da tela deixando outras intactas.
Ao iniciarmos o nosso programa há uma matriz principal onde, até agora, eram aplicadas todas as operações. Uma nova matriz pode ser carregada à pilha através da função glPushMatrix. Após as operações terem sido realizadas ela é descartada pela chamada de glPopMatrix. Essas operações devem ser usadas sempre que houver a necessidade de alterar um único objeto da tela, seguindo os passos: carregar uma nova matriz, rotacionar ou transladar, criar o desenho e por fim, descartar a matriz.
No exemplo de código são desenhados três triângulos, cada um sobre suas próprias matrizes. Se não fosse dessa forma as manipulações na imagem seriam feitas em todos os elementos que fossem desenhados posteriormente.
Abaixo um screenshot do programa de exemplo.
Screenshot Quarto Tutorial OpenGL
Nele há um triângulo central e rotacionando, e dois outros espalhados mais ao fundo.
A função glTranslatef (x, y, z), e suas variantes, deslocam as próximas imagens da matrix através do vetor passado. Por padrão OpenGL exibe na frente as imagens que são criadas por últimos, para permitir que seja calculada a posição da imagem basta usar glEnable (GL_DEPTH_TEST) na inicialização. Já glRotatef (angle, x, y, z) rotaciona a imagem usando o eixo de entrada.
O código do programa desse tutorial pode ser baixado aqui, foram adicionadas duas classes ao código anterior, uma delas para tratar vetores 3D e outra para tratar as formas do jogo, que por enquanto possui somente o triângulo.
No próximo tutorial vou adicionar uma câmera ao jogo e poderemos começar a fazer um precário FPS.

