8 Projeções e trackball virtual
Em síntese de imagens, utilizamos técnicas de projeção gráfica para converter objetos tridimensionais (3D) em representações bidimensionais (2D). Em particular, estamos interessados em projeções planares, pois desejamos projetar objetos 3D sobre o plano de imagem de uma câmera sintética.
No capítulo 4, vimos que é comum supor que a câmera sintética é uma câmera pinhole ideal. Nesse modelo, o plano de imagem está posicionado à frente da câmera, e a imagem é formada através da projeção de objetos tridimensionais sobre o plano, em direção à posição da câmera/olho (figura 8.1).
As linhas tracejadas que saem de cada vértice do objeto 3D e atravessam o plano de imagem são chamadas de projetores. Quando os projetores convergem em um centro de projeção, o resultado é uma projeção perspectiva (figura 8.2).
A projeção perspectiva produz o efeito de diminuição do tamanho aparente dos objetos mais distantes, que é o que percebemos no mundo real. Assim, a projeção perspectiva é o tipo de projeção mais adequada para simular a visão de um observador em um cenário virtual.
Quando os projetores são paralelos, temos uma projeção paralela (figura 8.3). Na projeção paralela, é como se o centro de projeção estivesse a uma distância infinita do plano de projeção.
Projeções paralelas são frequentemente utilizadas em desenhos técnicos, pois segmentos paralelos em 3D continuam paralelos quando projetados.
Projeções paralelas podem ser classificadas em dois grandes grupos segundo o ângulo formado entre os projetores e o plano de projeção. Se os projetores formam um ângulo de \(90^{\circ}\) com o plano de projeção, temos uma projeção ortográfica. Caso contrário, temos uma projeção oblíqua.
Projeções ortográficas e oblíquas podem ainda ser classificadas segundo os ângulos formados entre os eixos principais após a projeção, e a forma como as distâncias são preservadas.
A seguir é apresentada uma classificação hierárquica das principais projeções planares. Exemplos correspondentes são mostrados na figura 8.4:
- Projeção perspectiva: projetores convergem em um centro de projeção.
- Projeção paralela: projetores são paralelos entre si.
- Projeção ortográfica: projetores são perpendiculares ao plano de projeção.
- Projeção multivista: é o uso de diferentes pontos de vista de projeção ortográfica, cada um em uma direção paralela a um dos eixos \(x\), \(y\) e \(z\), compondo um conjunto de imagens chamadas de planos e elevações. Na projeção multivista, é comum desenhar o objeto de frente (elevação frontal), de lado (elevação lateral) e de cima (plano).
- Projeção axonométrica: projeção ortográfica em uma vista que não é paralela a nenhum dos eixos principais.
- Isométrica: os três eixos projetados formam um ângulo comum de \(120^{\circ}\) entre si.
- Dimétrica: dois dos eixos projetados formam um ângulo comum com outro eixo.
- Trimétrica: não há ângulo em comum entre os eixos projetados.
- Projeção oblíqua: projetores não são perpendiculares ao plano de projeção.
- Cavalier: dois dos eixos projetados formam um ângulo comum entre si, e as distâncias são preservadas nas três direções.
- Cabinet: similiar à projeção cavalier, mas a distância na profundidade é metade da distância nas outras direções.
- Outras: variações da projeção cavalier.
- Projeção ortográfica: projetores são perpendiculares ao plano de projeção.
Neste capítulo, abordaremos a construção de duas matrizes de projeção no OpenGL:
Essas matrizes serão utilizadas para converter coordenadas do espaço da câmera para coordenadas do espaço de recorte no pipeline de renderização. A partir da matriz de projeção perspectiva e de projeção ortográfica é possível gerar qualquer tipo de projeção planar da classificação anterior.
Nosso foco será no uso da projeção perspectiva. Entretanto, descreveremos primeiramente a projeção ortográfica por ser mais simples e por ser a projeção padrão adotada pelo pipeline quando a matriz de projeção não é utilizada.
As projeções multivista e axonométricas utilizam a mesma matriz de projeção ortográfica que iremos construir. A diferença entre cada subtipo de projeção é determinada pela orientação da câmera, isto é, pela matriz de visão. Por exemplo, para que tenhamos uma projeção isométrica, podemos usar uma matriz de projeção ortográfica associada com uma matriz de visão criada através de uma câmera LookAt com parâmetros tais que
\[ \begin{align} P_{\textrm{at}}-P_{\textrm{eye}}&=(\pm c,\pm c, \pm c). \end{align} \]
com \(c \neq 0\). Por exemplo, os parâmetros
\[ \begin{align} c &= \sqrt{1/3},\\ P_{\textrm{eye}}&=(c, c, c),\\ P_{\textrm{at}}&=(0, 0, 0),\\ \mathbf{v}_{\textrm{up}}&=(0,1,0) \end{align} \] resultam em uma visão isométrica com a câmera posicionada a uma unidade de distância da origem.
Projeções oblíquas podem ser obtidas através da concatenação de uma matriz adicional de transformação de cisalhamento à matriz de projeção ortográfica. Uma matriz de transformação de cisalhamento tem a forma
\[ \mathbf{H(\theta,\phi)}= \begin{bmatrix} 1 & 0 & -\cot \theta & 0\\ 0 & 1 & -\cot \phi & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}, \]
onde \(\theta\) e \(\phi\) determinam os ângulos entre os projetores e os eixos \(x\) e \(y\), respectivamente (figura 8.5).
Se \(\mathbf{M}_{orth}\) é a matriz de projeção ortográfica, então a concatenação \(\mathbf{M}_{orth}\mathbf{H(\theta,\phi)}\) produz uma projeção oblíqua se \(\theta\) ou \(\phi\) forem diferentes de \(\pm\frac{\pi}{2}\). Por exemplo:
- Na projeção cavalier, \(\theta=\phi=\frac{\pi}{4}=45^{\circ}\).
- Na projeção cabinet, \(\theta=\frac{\pi}{4}=45^{\circ}\) e \(\phi=arctan(2)\approx63.4^{\circ}\).
Além do conteúdo sobre projeções, este capítulo também apresenta a teoria (seção 8.3) e prática (seção 8.4) da implementação de uma técnica de interação chamada de trackball virtual. Essa técnica permite que o usuário use o mouse para realizar rotações livres de objetos tridimensionais.
O capítulo é concluído com a seção 8.5, que apresenta um passo a passo de implementação de um efeito visual que explora a diminuição do tamanho dos objetos projetados como resultado da transformação perspectiva.