sexta-feira, 6 de maio de 2016

Pipeline Gráfico - CG Atividade 2 

Em Computação gráfica 3D, o pipeline gráfico é uma sequência de passos para criar uma representação 2D de uma cena 3D.


A representação  do modelo 3D passa por 5 espaços:

  • Espaço do objeto
  • Espaço do universo
  • Espaço da câmera
  • Espaço projetivo (recorte)
  • Espaço canônico
Espaço do objeto
Cada objeto esta contido em seu próprio espaço tridimensional, onde são definidos suas dimensões(descrição dos vértices dos triângulos que dão forma ao objeto). Neste espaço poderemos aplicar qualquer transformação sobre o objeto: rotação, translação, shear e/ou escala.

Espaço do universo
O espaço do universo é onde esta descrito todos os vértices dos triângulos de todos os objetos, para isso, os objetos precisam passar por uma transformação, e os seus vértices que eram descritos nas coordenadas do espaço do objeto, neste espaço são descritos no sistema de coordenadas do universo.

Espaço da câmera
No espaço da câmera todos os objetos descritos no Espaço do universo serão descritos em um novo sistema de coordenadas, este sistema é criado levando em conta a posição da câmera.
 

Para ser feita a passagem do espaço do objeto para o espaço do universo nós devemos levar em consideração a aplicação de algumas transformações geométricas , sendo estas a Escala, Translação e Rotação.


Todas as transformações são aplicadas usando multiplicação de matrizes e vetores.

Matriz essa que será a MYVIEW, após essa criação poderemos unir essa matriz com a Model, 
criando a MYMODELVIEW.
Após a criação dos valores de base da câmera poderemos criar as matrizes necessárias para a criação da View.
Serão estas as matrizes BT e T.

BT
{ Xcx, Xcy, Xcz, 0},
{ Ycx, Ycy, Ycz, 0},
{ Zcx, Zcy, Zcz , 0},
{   0,      0,      0,     1}

T
{1,  0,  0,  -posx}
{0,  1,  0,  -posy}
{0,  0,  1,  -posz}
{0,  0,  0,      1   }

MYVIEW = BT * T;




Nessa aplicação que irei demonstrar utilizamos uma matriz de projeção mais simples que leva em conta somente o valor da distância entre a câmera e o near plane.

Matriz Projeção
https://www4c.wolframalpha.com/Calculate/MSP/MSP6971b35a6gf14h36357000032547655d847dd55?MSPStoreType=image/gif&s=47

Após essas transformações poderemos realizar a primeira aplicação nos vetores, através da matriz resultante gerada até o momento, a MYMODELVIEWPROJECTION, resultado das multiplicações entre essas matrizes.


translateVIEW
https://www5b.wolframalpha.com/Calculate/MSP/MSP150020aha3dih9174i9i000053i88b5d8dh332h0?MSPStoreType=image/gif&s=60
scaleVIEW
https://www5b.wolframalpha.com/Calculate/MSP/MSP25271cag46geb1c1gg80000039ge880ec9a4h332?MSPStoreType=image/gif&s=51


Após todas essas multiplicações e transformações aplicadas nós conseguimos obter nosso modelo 3D.

Esqerda: modelo gerado pipiline grafico. Direita: Modelo Gerado Pelo Objet Loader







Por fim os códigos,
Main         >> http://pastebin.com/J1szvE0h
Matrix.H   >> http://pastebin.com/tXeHez7P

 

quinta-feira, 10 de março de 2016

Rasterização de Pontos, Retas e Triângulos.

Descrição:


Este poste faz parte de um trabalho da disciplina Introdução a Computação Gráfica. Nele será abordado o conceito de rasterização, com exemplos de rasterização de pontos, retas e triângulos.

Utilizarei um framework desenvolvido por Christian Azambuja Pagot , professor da disciplina a que se vincula este trabalho. Este framework foi desenvolvido em C++ e contém os seguintes arquivos: • definitions.h, • main.cpp, • main.h, • Makefile, • mygl.h. O framework ira simular o acesso a memória de vídeo para escrita direta pois os sistemas operacionais modernos não permitem acesso direto a esta.

Será criada três funções de rasterização, listadas abaixo:

PutPixel: Função que rasteriza um pixel na tela.
DrawLine: Função que rasteriza um conjunto de pixel na tela, formando linhas.
DrawTriangle: Função que rasteriza três linhas, formando triângulos.
Estas funções serão criadas no arquivo mygl.h.

Dependências A compilação do projeto exige que os cabeçalhos do OpenGL e a GLUT (The OpenGL Toolkit) estejam instalados.

Definições:


Rasterização: 

O processo de converter uma imagem vetorial em uma imagem raster (pontos ou píxel) para a saída em vídeo.

Framebuffer:

Região da memória responsável por armazenar os dados da imagem que será representada no monitor.


Estrutura:

typedef struct{
    int R;
    int G;
    int B;
    int A
}color;

typedef struct{
    color cor;
    int x;
    int y;
}ponto;

Funções:

- void putpixel(ponto p, color cor);

O putpixel() é responsável por acender um pixel na tela, tem como parâmetros as coordenadas x e y que localizam o pixel na tela e os inteiros r,g,b,a que são responsáveis por darem cor ao ponto.

- void drawLine(ponto p1, ponto p2);

DrawLine usa o algoritmo de Bresenham para calcular onde serão pintados os pixels , usa o putpixel para pintar os pixels, formando uma linha do ponto inicial até o ponto final.

void drawTriangle(ponto x1,ponto x2, ponto x3);
DrawTriangle chama o algoritimo drawLine() para formas as linhas que formarão o triangulo.