quarta-feira, 19 de outubro de 2016

Implementação do Pipeline Gráfico

Definição do trabalho:

Para este trabalho, deveríamos implementar todos os passos do pipeline gráfico usando um objeto importado, no caso, o macaco do Blender. Para isso, nos foi passado um exemplo sobre qual deveria ser o resultado final.

Resultado do programa fornecido pelo professor para ser usado como base

O programa para importar o objeto também foi fornecido pelo professor.

O Pipeline:

O pipeline gráfico é o processo pelo qual transformamos imagens para serem exibidas na tela.

Esquema do Pipeline gráfico retirado daqui.

O Pipeline gráfico consiste de etapas que podem ser descritas pela mudança de espaços. O primeiro é o espaço do objeto, que define apenas as coordenadas do objeto com relação a origem de uma base xyz genérica. O segundo, é o espaço do universo, que define o comportamento do objeto no espaço da cena. O terceiro é o espaço da câmera, onde são definidos os parâmetros de visualização da cena. O quarto é o espaço de recorte, onde é definido o que será visto, então, temos o espaço canônico responsável pela projeção e, por fim, o espaço de tela, onde os objetos tridimensionais são transformados para bidimensionais para poderem ser exibidos na tela.

Implementação:

Espaço do objeto - universo:

O primeiro passo, era transformar o objeto para o espaço do universo e definir o seu comportamento, como o objeto foi colocado na origem, a matriz transformação era composta apenas pela matriz identidade, porém, como foi aplicada uma rotação, essa matriz identidade foi multiplicada por uma matriz rotação do modelo

Matrizes de rotação retiradas daqui.

Como a rotação foi ao redor de y, usamos a segunda matriz (Ry), para manter a rotação constante com efeito de animação, criamos uma variável que era incrementada a cada quadro e usamos as funções da biblioteca math para calcular senos e cosenos.

Espaço do universo - câmera:

Para transformar o objeto do espaço do universo para o espaço da câmera, era necessário fazer uma rotação e uma translação, mas, primeiramente, deveríamos definir as configurações da câmera. Seguindo o modelo do programa auxiliar, coloquei a minha câmera também na posição (0, 0, 4) olhando para o ponto (0, 0, 0) e com o vetor "up" em y. Tendo as configurações da minha câmera no espaço do universo, eu precisava gerar o espaço da câmera. Pelo posicionamento da minha câmera, eu não precisei aplicar uma rotação, pois os vetores do espaço do universo e os vetores do espaço da câmera tinham a mesma direção. A translação foi contrária a da câmera, ou seja, -4 em z.

Modelo de matriz de rotação para o espaço da câmera retirado dos slides de aula do professor Christian Pagot.

Modelo de matriz de translação para o espaço da câmera retirado dos slides de aula do professor Christian Pagot.

No modelo das matrizes acima, as coordenadas x, y e z da matriz de rotação são dos vetores do espaço da câmera e, na matriz de translação, as coordenadas p são da posição da câmera. Para esse caso, a matriz de rotação era a matriz identidade e a matriz de translação possuia apenas pz diferente de 0.

Espaço da câmera - recorte:

A próxima etapa era calcular a distorção de projeção na visualização do objeto, para isso, usamos uma matriz do tipo

Modelo de matriz de projeção para o espaço da câmera retirado dos slides de aula do professor Christian Pagot.

Para esse caso, assumimos d=1.

Espaço de recorte - canônico:

Esta transformação consiste em dividir as coordenadas dos vértices pela sua coordenada homogênea, causando uma distorção na cena.

Espaço canônico - tela:

Para essa transformação, usaremos matrizes desse molde:

Matrizes retiradas do script auxiliar do octave feito pelo professor Christian Pagot.
A matriz que transforma para o espaço de tela é composta por duas escalas e uma translação. Os parâmetros w e h são relativos à largura e altura da janela. Nesse caso, usei uma janela de tamanho 600x600. Em seguida, usei o algoritmo de rasterização implementado no trabalho anterior para exibir a imagem.

Resultados:

Print do objeto exibido pelo programa criado nesse trabalho.
Objeto gerado pelo programa criado nesse trabalho.


Problemas apresentados:

Tive alguns problemas ao relacionar o programa de rasterização e esse, bem como para ler diferentes objetos, algumas funções das bibliotecas também me causaram alguns problemas. Eu perdi um pouco de tempo no FOV, mas foi por estar interpretando errado os parâmetros da câmera do openGL.

Possíveis melhorias:

Seria interessante poder carregar outros objetos, mesmo os que não são compostos apenas por triângulos. Achei alguns modelos interessantes, mas possuiam faces com mais vértices e eu não consegui editar a biblioteca para poder usá-los.

Diferentes modelos:

Também achei alguns modelos interessantes que eu consegui carregar.

Um anão do filme Branca de Neve

Referências:

https://en.wikipedia.org/wiki/Graphics_pipeline
https://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
http://goanna.cs.rmit.edu.au/~gl/teaching/rtr&3dgp/notes/pipeline.html
Notas de Aula e Material complementar do professor Christian Pagot.
http://www.turbosquid.com/FullPreview/Index.cfm/ID/671354 (Modelo do anão)
http://www.turbosquid.com (Mais modelos em 3D)
http://blender.stackexchange.com/questions/8322/understanding-3d-transforms-and-rotations

Nenhum comentário:

Postar um comentário