Transformações geométricas em OpenGL

 

        A biblioteca gráfica OpenGL é capaz de executar tranformações de translação, rotação e escala.

        A idéia central as transformações em OpenGL é que elas são cumulativas, ou seja, podem ser aplicadas umas sobre as outras.

        Uma transformação geométrica de OpenGL é armazenada internamente em uma matriz. A cada tranformação esta matriz é alterada e usada para desenhar os objeto a aprtir daquele momento, até que seja novamente alterada.


Translação

         Para efetuar uma translação há o comando glTranslatef(tx, ty, tz) que move todas as coordenadas dos objetos ao longo dos eixos coordenados.

Exemplo

DesenhaObjeto();// Desenha o objeto na posição
                // correspondente às suas coordenadas originais                

glTranslatef(10,10,10);
DesenhaObjeto(); // Desenha o objeto descolado de 10
                 // unidades em cada eixo

glTranslatef(10,10,10);
DesenhaObjeto(); // Desenha o objeto descolado de 20
                 // unidades em cada eixo
                 // LEMBRE-SE, AS TRANSFORMAÇÕES SÃO
                 // CUMULATIVAS


Rotação

         Para efetuar uma rotação há o comando glRotatef(Angulo, x, y, z) que gira o objeto ao redor do vetor (x,y,z). O giro é de Angulo graus, no sentido anti-horário.

Exemplo

DesenhaObjeto();// Desenha o objeto na posição
                // correspondente às suas coordenadas originais                

glRotatef(20,1,0,0);
DesenhaObjeto(); // Gira o objeto 20 graus ao redor do eixo X

glRotatef(30,1,0,0);
DesenhaObjeto(); // Gira o objeto mais 30 graus ao redor do eixo X
                 // LEMBRE-SE, AS TRANSFORMAÇÕES SÃO
                 // CUMULATIVAS. Neste caso o giro total será de 50 graus


Escala

         Para efetuar uma escala há o comando glScalef(ex, ey, ez) que altera a escala do objeto ao logo dos eixos coordenados.

Exemplo

DesenhaObjeto();// Desenha o objeto na posição
                // correspondente às suas coordenadas originais                

glScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianl

glScalef(0,2.0,0);
DesenhaObjeto(); // Desenha outro objeto no seu tamanho original
                 // LEMBRE-SE, AS TRANSFORMAÇÕES SÃO
                 // CUMULATIVAS.


Reinicializando as Tranformações

        Para permitir que a transformação atual seja reinicializada há o comando glLoadIdentity().

Exemplo

DesenhaObjeto();// Desenha o objeto na posição
                // correspondente às suas coordenadas originais                

glScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianl

glLoadIdentity(); // reinicializa as transformações

glScalef(0,2.0,0);
DesenhaObjeto(); // Desenha o outro objeto com o dobro do tamanho original
                 // LEMBRE-SE, AS TRANSFORMAÇÕES SÃO
                 // CUMULATIVAS.


limitando o escope das Tranformações

        Para permitir que uma transformação valha somente em um certo trecho de prograam e assim não altere o que está sendo desenhado depois, há os comados glPushMatrix() e glPopMatrix().

        A idéia é que o glPushMatriz armazene as transformações atuais em um pilha interna do OpenGL e que estas transformações possam ser retiradas depois por um glPopMatriz.

Exemplo

DesenhaObjeto();// Desenha o objeto na posição
                // correspondente às suas coordenadas originais                

glPushMatrix(); // salva as transformações atuais na pilha

glScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianl

glPopMatrix(); // restaura as transformações anteriores

glScalef(0,2.0,0);
DesenhaObjeto(); // Desenha o outro objeto com o dobro do tamanho original
                 // LEMBRE-SE, AS TRANSFORMAÇÕES SÃO
                 // CUMULATIVAS.