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 originaisglTranslatef(10,10,10);
DesenhaObjeto(); // Desenha o objeto descolado de 10
// unidades em cada eixoglTranslatef(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 originaisglRotatef(20,1,0,0);
DesenhaObjeto(); // Gira o objeto 20 graus ao redor do eixo XglRotatef(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 originaisglScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianlglScalef(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 originaisglScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianlglLoadIdentity(); // 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 originaisglPushMatrix(); // salva as transformações atuais na pilha
glScalef(0,0.5,0);
DesenhaObjeto(); // Diminui a altura do objeto à metade do origianlglPopMatrix(); // 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.