Desenho de objetos em OpenGL -- Computação Gráfica

jSSeção 3.3  

 

 

         3.3. Transformações Geométricas

 

Em muitas aplicações de computação gráfica, há necessidade de alterar e manipular o conteúdo de uma cena. Animações,por exemplo, são produzidas pelo movimento da câmera ou dos objetos presentes na cena. Mudanças em orientação,tamanho e formato estão ligadas às transformações geométricas. 

As transformações geométricas básicas são translação, rotação e escala. 

TRANSLAÇÃO

A translação, quando aplicada a um objeto, reposiciona o mesmo mudando suas coordenadas (x,y,z) no espaço tridimensional, por fatores Tx, Ty e Tz, respectivamente. Dessa forma, considerando, inicialmente, um objeto com coordenadas espaciais (x,y,z), sua nova posição (x',y',z') após uma operação de translação será: 

    >> x'= x + Tx  
    >> y'= y + Ty  
    >> z'= z + Tz  


Em OpenGL para se aplicar uma translação em um objeto é necessário utilizar o comando Translate . Abaixo segue a sintaxe para o mesmo:

    >> Translate {f,d}  ( Tx, Ty, Tz ), onde:

Tx -> é o quanto se quer transladar o objeto em relação ao eixo X 
Ty -> é o quanto se quer transladar o objeto em relação ao eixo Y
Tz -> é o quanto se quer transladar o objeto em relação ao eixo Z

Vamos ao exemplo básico até o procedimento Render . Antes de mandar desenhar o triângulo é necessário fazer uma translação para ilustrar o Translate. Veja abaixo: 

     glTranslatef(0.0f,0.5f,0.0f); 

     glBegin(GL_POLYGON); 
          glVertex2f( 0.0f, 0.0f); 
          glVertex2f( 0.25f, 0.50f); 
          glVertex2f( 0.50f, 0.0f); 
     glEnd(); 


Neste caso, o triângulo será transladado 0.5 em relação ao eixo Y.
Verifique os resultados abaixo:

 

Desenho inicial

d

Desenho após translação


 


d

 

ROTAÇÃO

Rotacionar um objeto significa girar o mesmo em torno de um eixo de acordo com determinado ângulo. 

Em OpenGL, basta você utilizar o comando Rotate. Abaixo segue a sintaxe para o mesmo:

    >> Rotate {f,d}  (Angulo, x, y, z ), onde:

Angulo -> é o angulo de rotação
x,y,z -> definem o eixo onde o objeto será rotacionado

Vamos ao exemplo básico até o procedimento Render . Adicione um comando Rotate. Veja abaixo: 

     glRotatef(45.0f,0.0f,0.0f,1.0f);// roda 45 graus no eixo z 

     glBegin(GL_POLYGON); 
          glVertex2f( 0.0f, 0.0f); 
          glVertex2f( 0.25f, 0.50f); 
          glVertex2f( 0.50f, 0.0f); 
     glEnd(); 


Neste exemplo o triângulo será rotacionado 45 graus em relação ao eixo Z (entrando ou saindo da tela ).Verifique o resultado abaixo:

 

Desenho Inicial

d

Desenho Após Rotação


 




Para rodar em X , basta passar como parâmetro o ângulo e em seguida (1.0,0.0,0.0). No caso do Y, passa-se o parâmetro o ângulo e em seguida (0.0,1.0,0.0). No caso de um eixo qualquer é necessário passar um parâmetro que será o ângulo e em seguidas os valores (x,y,z) desse eixo.

ESCALA

O escalamento altera o tamanho dos objetos, multiplicando as coordenadas (x,y,z,) usadas para definí-los, por fatores Sx, Sy e Sz, respectivamente. Supondo, por exemplo, um vértice de um polígono definido pelas coordenadas (x,y,z), as novas coordenadas (x',y',z') deste vértice após uma operação de escalamento seria: 

    >> x'= x.sx 
    >> y'= y.sy 
    >> z'= z.sz 

Os fatores Sx, Sy e Sz podem assumir quaisquer valores positivos, sendo que para valores menores que 1, o tamanho do objeto é reduzido, para valores maiores que 1, o aumenta-se o tamanho do objeto e para valores iguais a 1, o tamanho original do objeto é mantido. 


Em OpenGL essa transformação geométrica pode ser realizada através do comando Scale . Abaixo segue a sintaxe para o mesmo:

    >> Scale {f,d}  ( Sx, Sy,Sz ), onde:

Sx -> é o fator de escala em relação a X.
Sy -> é o fator de escala em relação a Y.
Sz -> é o fator de escala em relação a Z.

Vamos ao exemplo básico até o procedimento Render . Faça conforme abaixo: 

     glScalef(1.0f,1.3f,1.0f);// aumenta a o tamanho do objeto numa escala 
                                    // de 1.3 em relação a Y.
     glBegin(GL_POLYGON); 
          glVertex2f( 0.0f, 0.0f); 
          glVertex2f( 0.25f, 0.50f); 
          glVertex2f( 0.50f, 0.0f); 
     glEnd(); 


Verifique o resultado abaixo:

 

Desenho Inicial

f

Desenho Após Escala


 


[principal]

[anterior]

[próxima]