Desenho de objetos em OpenGL -- Computação Gráfica |
jSSeção 4.4 |
4.4. Projeção Perspectiva |
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.
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.
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).
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.
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.
Da mesma forma, substituindo estes valores podemos simplificar a nossa matriz de projeção geral, construindo a matriz M'per (figura 4.4.7).
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.
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 ); 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)
O resultado do exemplo pode ser visto na figura 4.4.10.
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.
Efetuando
os cálculos devidos, teremos outros valores para (dx, dy, dz) e D,
conforme pode ser visto na figura 4.4.12:
Substituindo estes valores podemos simplificar a nossa matriz de projeção geral, construindo a matriz M'per (figura 4.4.13).
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.
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).
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
|
||||||||||||||||||
d |
[anterior] |
[próxima] |