Introdução
Este é o segundo trabalho da disciplina de Computação Gráfica, lecionada pelo professor Christian Azambuja Pagot.
O trabalho consiste em implementar todas as etapas do pipeline gráfico, ou seja, sera feito uma sequência de passos que vai desde o Espaço do objeto até o Espaço da tela, como mostra a imagem abaixo.
Cada passo desse pipeline será explicado ao longo deste trabalho, assim como a implementação do mesmo.
1- Espaço do Objeto -> Espaço do Universo
O Espaço do objeto é onde vão ser criados os objetos separadamente, ou seja, cada objeto terá seu próprio sistema de coordenadas. Para que possamos unir esses objetos em um mesmo sistema de coordenadas, sairemos do Espaço do Objeto e iremos para o Espaço do Universo através de transformações geométricas: Escala, Shear, Rotação e Translação.
1.1 - Escala
A escala modifica as dimensões do objeto, ou seja, o seu tamanho será aumentado ou diminuído, como ilustra a imagem abaixo.
Nesta transformação, cada coordenada (x,y) será multiplicada por um fator de escala:
Temos dois tipos de escalas: Isotrópicas e anisotrópica.
- Escalas Isotrópicas: Onde Sx = Sy;
- Escalas Anisotrópicas: Onde Sx != Sy;
Podemos espelhar o objeto invertendo as coordenadas:
- Espelhamento no eixo X: Sx=-1, Sy=1;
- Espelhamento no eixo Y: Sx=1, Sy=-1;
- Espelhamento em ambos os eixos: Sx=-1, Sy=-1;
Ilustração abaixo do espelhamento no eixo Y:
Note que, as imagens acima mostram as escalas sendo usadas em objetos que estão na origem dos eixos XY. Caso o objeto estiver fora da origem, o mesmo deverá ser levado à origem, podendo então ser aplicado a escala, e depois retorná-lo onde estava. Pois se for usado a escala fora da origem, seu objeto modificará de tamanho, mas mudará também de posicionamento, ou seja, ele será transladado, como ilustra a imagem abaixo:
1.2 - Shear
O shear faz com que o objeto tenha formato distorcido. Podemos ter a distorção do objeto em relação ao eixo X, ao eixo Y, ou em ambos os eixos. A imagem abaixo mostra um objeto distorcido.
Nesta transformação, será multiplicado uma constante na coordenada em que o objeto for distorcido:
Em ambas as coordenadas:
1.3 - Rotação
Nesta transformação, o objeto será rotacionado com um angulo theta. Para chegarmos a fórmula da rotação, os valores dos pontos originais (x,y) são:
Para os novos pontos (x',y'), vamos somar o valor de alpha com theta:
Tendo em vista que:
- cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b)
- sin(a+b) = sin(a)*cos(b) + sin(b)*cos(a)
Usaremos as fórmulas acima para encontrar (x',y'):
Onde tem r*cos(alpha) será substituído por x e onde tem r*sin(alpha) será substituído por y, pois como vimos acima, (x,y) correspondem a estes valores. Abaixo segue a fórmula da rotação.
Assim como a escala, para que a rotação seja feita o objeto deve estar na origem, caso não esteja, o mesmo será transladado implicitamente, abaixo segue rotações na origem e fora dela, respectivamente.
1.4 - Translação
Nesta transformação, o objeto será movido (transladado) de lugar.
A fórmula da translação consiste em adicionar quantidades inteiras as coordenas (x,y).
Temos como objetivo expressar todas as transformações geométricas através de matriz. Notemos que a translação não pode ser expressada através de matriz. Para resolver este problema, utilizaremos coordenadas homogêneas.
- Coordenadas Homogêneas
Um ponto (x,y), do espaço euclidiano, será representado no espaço homogêneo adicionando uma coordenada homogênea "w". Para irmos ao espaço homogêneo, cada coordenada do espaço euclidiano será multiplicado pela coordenada w, ou seja, (x,y) -> (xw, yw, w). Para voltarmos para o espaço euclidiano, dividimos todas as coordenadas do espaço homogêneo por w, ou seja, (xw, yw, w) -> (x/w, y/w), para todo w!=0.
Com isso, poderemos representar a translação em forma de matriz.
- Representação Matricial da Translação
Note que, saímos de matrizes 2x2 e agora iremos utilizar matrizes 3x3.
Vale ressaltar que usaremos w=1.
1.5 - Escala, Shear e Rotação com Coordenadas Homogeneas
- Rotação em torno do eixo X:
- Rotação em torno do eixo Y:
- Rotação em torno do eixo Z:
- Translação:
2 - Espaço do Universo -> Espaço da Câmera
Nesta etapa do pipeline, os vértices que estão no sistema de coordenadas do Universo serão levados para o sistema de coordenadas da câmera, onde a câmera será posicionada na origem deste sistema.
A câmera possui um vetor posição, um vetor direção e um vetor UP.
- Vetor Posição: p = (px, py, pz);
- Vetor Direção: d = (dx, dy, dz);
- Vetor UP: u = (ux, uy, uz);
Usaremos os vetores citados acima para encontrarmos o sistema de coordenadas da câmera, onde denotaremos seus eixos por Xc, Yc e Zc.
- Para calcularmos o Zc, dividimos o simétrico do vetor direção (-d) pela sua norma;
- Para calcularmos Xc, faremos o produto vetorial entre o vetor UP e o vetor Zc (calculado anteriormente) e dividimos pela sua norma;
- Para calcularmos Yc, faremos o produto vetorial entre o vetor Zc e o vetor Xc e dividimos pela sua norma;
A imagem abaixo ilustra o que foi dito anteriormente.
Agora que sabemos como encontrar os eixos do sistema de coordenadas da câmera, para que possamos levar os objetos do Espaço do Universo para o Espaço da Câmera, criaremos a Matriz View, que consiste de uma translação (T) e uma rotação (B), respectivamente.
A translação consiste em unir as origens do sistema de coordenadas do Universo com o sistema de coordenadas da câmera. A rotação será uma matriz formada por cada componente dos eixos da câmera, mas como essa matriz é ortogonal, usaremos sua transposta. Ilustração do que foi dito abaixo.
3 - Espaço da Câmera -> Espaço de Recorte
Nesta etapa do pipeline, sairemos do Espaço da câmera e iremos para o Espaço de Recorte, utilizando a matriz de projeção. Essa matriz fará com que os objetos tenham projeção perspectiva ou ortogonal. Na projeção perspectiva teremos uma sensação de profundidade dos objetos na tela, diferente da projeção ortogonal que preserva o paralelismo das retas. A imagem abaixo mostra ambas as projeções.
A matriz de projeção leva em conta apenas a distancia da câmera ao view plane, ou seja, é uma matriz de projeção simples. A matriz é mostrada abaixo.
A matriz de projeção leva em conta apenas a distancia da câmera ao view plane, ou seja, é uma matriz de projeção simples. A matriz é mostrada abaixo.
4 - Espaço de Recorte -> Espaço Canônico
Nesta etapa do pipeline sairemos do Espaço de Recorte e iremos para o Espaço Canônico, onde cada coordenada será dividida pela coordenada w. É neste espaço que teremos a distorção perspectiva.
5 - Espaço Canônico -> Espaço de Tela
No Espaço de Tela, os vértices que foram obtidos no Espaço Canônico serão rasterizados.
6 - Desenvolvimento do Trabalho
Faremos uma implementação do pipeline gráfico seguindo os passos que foram explicados anteriormente.
- Partiremos do Espaço do Objeto para o Espaço do Universo multiplicando os vértices do objeto pela matriz de modelagem (M_model);
- Sairemos do Espaço da Câmera para o Espaço de Recorte através da utilização da matriz de projeção (M_projection);
- Foi criado a matriz M_modelviewprojection que é a multiplicação das matrizes M_projection e M_modelview. Após a criação dessa matriz, multiplicaremos cada vértice do espaço do objeto por ela. Com os novos vértices encontrados, faremos a homogenização, ou seja, dividiremos as coordenadas de cada vértice por sua coordenada w. Sendo assim, chegaremos no Espaço Canônico;
- Agora iremos para a tela através da M_viewport, que é o resultado da multiplicação das três matrizes mostradas abaixo.
Dificuldades
A maior dificuldade foi na manipulação de matrizes.
Melhorias
Referências
- Slides do professor Christian Azambuja Pagot;
- http://www.lcad.icmc.usp.br/~rosane/CG/TransfGeomAndersonIcaro.pdf























































