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

jSSeção 4.4  

 

 

         4.4. Projeção Perspectiva


   
Em uma projeção perspectiva, a partir da definição matemática, temos que o valor de zp pode assumir diversos valores, ou seja, o plano de projeção pode estar a qualquer distância da origem. A direção do vetor unitário (dx, dy, dz) e o valor de D (distância do ponto (0, 0, zp) ao centro de projeção) pode ser calculada da seguinte forma:

   

   

4.4.1 - Fórmulas para se determinar o valor de D e a direção de projeção.

        

Observe que D representa o comprimento do segmento de reta que vai do centro de projeção ao ponto (0, 0, zp). D é chamado de norma de (dx, dy, dz). Note também que para que a direção de projeção seja definida dessa forma, é necessário se conhecer o valor de (xc, yc, zc), ou seja, as coordenadas do centro de projeção e o valor de zp.

Para exemplificar, vamos criar uma matriz que vai se chamar Mper, que será uma matriz que irá definir uma projeção perspectiva onde o centro de projeção está na origem (logo xc=0, yc=0 e zc=0), veja isto na figura 4.4.2. 

      

   

4.4.2 - Projeção Perspectiva onde o centro de projeção está na origem.

 

Como o plano de projeção intercepta o eixo z no ponto (0, 0, D), teremos então dx=0, dy=0 e dz=-1, observe que esta direção de projeção é ortogonal ao plano de projeção. Dessa forma podemos resumir os parâmetros para nossa projeção conforme a figura 4.4.3.

  

  

4.4.3 - Parâmetros para se definir a matriz de projeção Mper.

  

Substituindo estes valores podemos simplificar a matriz de projeção geral (definida na seção 4.3), construindo a matriz Mper (figura 4.4.4).

   

   

4.4.4 - Matriz de Projeção Perspectiva onde o centro de projeção está na origem.

  

Veja que com a simplificação da matriz geral, para este caso especial de projeção perspectiva, precisamos conhecer somente a distância que o plano de projeção se encontra da origem em relação ao eixo z.

  

Uma variação dessa projeção, cuja matriz chamaremos de M'per, é uma projeção onde o plano de projeção está em z = 0 (logo, zp = 0), ou seja (0, 0, 0),  e o centro de projeção está em (0, 0, -D), veja isto na figura 4.4.5.    

   

  

4.4.5 - Projeção Perspectiva onde o centro de projeção está 

em (0, 0, -D) e o plano de projeção está em (0, 0, 0).

  

Dessa forma podemos calcular, como no exemplo anterior, o valor de (dx, dy, dz) obtendo o seguinte resultado (0, 0 –1), observe que esta direção de projeção também é ortogonal ao plano de projeção. Dessa forma podemos resumir os parâmetros para nossa projeção conforme a figura 4.4.6.

   

   

4.4.6 - Parâmetros para se definir a matriz de projeção M'per.

   

Da mesma forma, substituindo estes valores podemos simplificar a nossa matriz de projeção geral, construindo a matriz M'per (figura 4.4.7).

   

   

4.4.7 - Matriz de Projeção Perspectiva onde o centro de projeção 

está em (0, 0, -D) e o plano de projeção está em (0, 0, 0).

   

Veja que novamente com a simplificação da matriz geral, para este caso especial de projeção perspectiva, precisamos conhecer somente a distância que o plano de projeção se encontra da origem em relação ao eixo z.

   

Neste dois casos especiais de projeção perspectiva, a direção de projeção é ortogonal ao plano de projeção. Dessa forma se fossemos projetar um cubo através de M'per, por exemplo, iríamos visualizar apenas um quadrado, conforme pode se visto na figura 4.4.8. Não entraremos em detalhes sobre o código deste exemplo e de outros exemplos onde construímos nossa própria matriz de projeção , pois já foi mostrado na seção 4.3 (Definição Matemática de uma Projeção Genérica) como utilizar uma matriz de projeção em OpenGl. A única diferença no código em relação aos exemplos mostrados aqui, são os valores passados a matriz mprojecao.  

 

4.4.8 - Visualização da projeção de um cubo utilizando M'per.

  

  

       

Em OpenGL existe uma matriz de projeção com direção ortogonal default. Para realizar uma projeção deste tipo em OpenGL (utilizando esta matriz default) é necessário se definir apenas o volume visível (figura 4.4.9). Isto é apenas uma simplificação utilizada em OpenGl para se definir uma projeção perspectiva com direção de projeção ortogonal.

   

4.4.9 - Volume visível de uma Projeção Perpectiva.

   

Na figura acima o volume visível é definido pelo tronco de pirâmide. Observe que é especificado os valores de X máximo e mínimo assim como os valores de Y máximo e mínimo. O valor de Near é igual a -Z min e o valor de Far é igual a - Z max. Somente será visualizado o que estiver dentro deste volume visível.

   

A partir destas informações já se torna possível fazer um projeção perspectiva utilizando a matriz default. Esta projeção deve ser definida pelos seguintes comandos:

    >> glMatrixMode( GL_PROJECTION ); 
    >> glLoadIdentity(); 
    >> glFrustum
(X min, X max, Y min, Y max, Near, Far);

Você deve ter notado que GL_PROJECTION é uma constante definida no OpenGL, neste caso ela especifica que a matriz que sofrerá as subseqüentes operações é a matriz de projeção. É importante ressaltar que nesse caso não está sendo especificado nenhuma matriz de projeção. O comando glFrustum define uma matriz de projeção que deixa a câmera alinhada ao eixo z e com direção de projeção ortogonal ao plano de projeção (default do OpenGL). 

Para ilustrar esta projeção perspectiva usaremos um exemplo simples da projeção de duas pirâmides. Neste exemplo, o procedimento Render nada mais faz do que especificar coordenadas e primitivas geométricas para se obter o desenho dos objetos, diferenciando em pouca coisa do exemplo básico. A grande diferença está na maneira de como os objetos são projetados. Isso pode ser observado no evento Reshape conforme abaixo:  

static void Reshape(int width, int height)
{
    glViewport(0,0,width,height);     
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity(); 
    glFrustum(-10, 10, -10, 10, 1.8, 7);   // define o volume visível da projeção perspectiva
}

 

O resultado do exemplo pode ser visto na figura 4.4.10.

  

   

4.4.10 - Projeção Perspectiva utilizando a matriz default.

 

 

   

O próximo exemplo mostrará uma projeção perspectiva em que a direção de projeção não é ortogonal ao plano de projeção, iremos construir a nossa própria matriz de projeção, como foi feito em Mper e M'per. 

 

Para este exemplo, cuja matriz chamaremos de M1, teremos que o plano de projeção é o plano z = 0, como no exemplo de M'per, e o centro de projeção estará em (2, 2, -2), veja isto na figura 4.4.11. 

    

   

4.4.11 - Projeção Perspectiva onde o centro de projeção 

está em (2, 2, -2) e o plano de projeção está em (0, 0, 0).

 

Efetuando os cálculos devidos, teremos outros valores para (dx, dy, dz) e D, conforme pode ser visto na figura 4.4.12:

  

   

4.4.12 - Parâmetros para se definir a matriz de projeção M1.

 

Substituindo estes valores podemos simplificar a nossa matriz de projeção geral, construindo a matriz M'per (figura 4.4.13).

  

   

4.4.13 - Matriz da Projeção Perspectiva onde o centro de projeção 

está em (2, 2, -2) e o plano de projeção está em (0, 0, 0).

  

O resultado da projeção de um cubo utilizando M1 pode ser vista na figura 4.4.14. Você pode ver nesta figura que quando a direção de projeção não é ortogonal, a projeção dá uma idéia melhor da forma do objeto projetado, neste caso, um cubo. Nos exemplos anteriores, quando o mesmo cubo era projetado utilizando uma direção de projeção ortogonal, sua projeção não fornecia a idéia da forma do cubo projetado, visto que a projeção era um quadrado.

   

   

4.4.14 - Projeção Perspectiva utilizando a matriz M1.

   

   

   

Existe uma função presente na GLU (utilitária da OpenGL) que fornece uma outra maneira de se realizar um projeção perspectiva em OpenGL. Ela permite que seja especificado o ângulo de visão (ou field of vision) da projeção (figura 4.4.15). 

   

   

4.4.15 - Ângulo de Visão.

  

  

    

Esta função recebe como uns dos parâmetro o valor do ângulo de visão. Sua sintaxe é descrita abaixo:

     >> gluPerspective (ângulo, aspecto, near, far),  onde:

ângulo -> é o ângulo de visão
aspecto -> Tamanho (w na figura) / Altura (h na figura)  da janela de visualização.
near e far -> idênticos aos parâmetros do comando Frustum.    

   

 

     

d

[principal]

[anterior]

[próxima]