INF01009
- Trabalho Complementar Nº 3
Definição:
Data
de Divulgação: 24/03/2008
Data
para Entrega : 31/03/2008
Relatório:
Bom, em suma, o 3º trabalho complementar consiste em um visualizador 3D do espaço projetivo. Para entender melhor isso, seria interessante um resumo do que é o plano projetivo.
O
plano projetivo é resultante do uso de coordenadas homogêneas. As
coordenadas homogêneas foram idealizadas para que a matriz de
transformação de vértices fosse quadrada, o que permitiria achar a sua
inversa, tornando assim o trabalho de um redo ou um undo muito mais fácil de se
implementar. As coordenadas homogêneas consistem em adicionar mais uma
dimensão na definição das coordenadas dos vértices. Convencionou-se
atribuir como valor para a coordenada extra, o valor 1. Pode-se ver nas
imagens abaixo isso ilustrado:
Porém ao
se colocar uma dimensão a mais, ganhou-se mais do
que apenas uma matriz quadrada. Entre os vários ganhos, podemos denotar
as operações sobre retas e vértices em alguns exemplos. Se
considerarmos os vértices com suas 3 coordenadas como vetores e
fizermos um cross product(produto
vetorial) entre dois vértices, obtemos um resultado bem interessante.
Por exemplo, baseado nas figuras, se considerarmos os vetores V1 e V3,
fazendo V1xV3 = <a, b, c>. Este vetor <a, b, c>, embora
ainda meio nebuloso de se enxergar, é o vetor normal do plano formado
pelos vetores V1 e V3. Tá, e para que serve isso? Eis a mágica: se
considerarmos a reta entre os V1 e V3 pela equação ax + by + c = 0,
advinhem quem são estes a, b e c? Exatamente, são as componentes do
vetor normal! \o/
Antes de dizer o porquê disso, vamos a mais uma
propriedade interessante. Se considerarmos V1xV3 como o vetor R1 e
V2xV4 como o vetor R2, lembrando que R1 e R2 definem as retas entre
V1|V3 e V2|V4, se fizermos R1xR2 = (cx, cy, cz). Dividindo todos os
elementos por cz, temos Cx = cx/cz e Cy = cy/cz, e com isso, temos como
resultante o vetor <Cx, Cy, 1>. Mais nebulosamente ainda, este
vetor, se considerado como um ponto em coordenadas homogêneas, é o
ponto de interseção entre as retas R1 e R2. Legal, não?
Tá,
mas e por que diabos isso acontece? Eis que entra o visualizador 3D do
espaço projetivo ;). Pensemos assim: Se considerarmos a 3ª coordenada
que adicionamos como a distância que o plano está da origem, podemos
então imaginar que existem infinitos planos 2D e que o 3D, nesse caso,
é composto por uma sobreposição de todos estes planos, como se fossem
"fatias". Pois bem, considerando o plano 1, um ponto neste plano,
definido como <x, y, 1>, pode ser considerado como a interseção
do vetor <x, y> que corta o plano 1. Pensando assim, podemos
dizer que todos os vetores <x*p, y*p, p> podem ser considerados projetivamente equivalentes, ou
seja, todos são definidos pelo mesmo vetor que sai da origem e cruza
todos os planos.
Sendo assim, se tomarmos V1 e V3 como dois vetores
que saem da origem e cruzam o plano 1, podemos dizer que, se eles são
linearmente independentes, existe um plano que contém tanto V1 quanto
V2. Este plano é definido pela sua normal, que é, neste caso, V1xV3.
Logo, se considerarmos apenas o plano 1, a única parte deste plano
V1xV3 que se enxerga é a interseção
entre o plano 1 e o plano V1xV3, que é uma reta. Ou
seja, a reta que liga a interseção de V1 e a interseção de V3 no plano
1 é uma parte do plano V1xV3, porém apenas enxergado no plano 1.
Agora, sabendo que R1 e R2, descritos anteriormente,
são os vetores normais dos planos formados por V1|V3 e V2|V4,
respectivamente, e que cada um deles define, no plano 1, a reta entre
seus vértices, o que é R1xR2? Considerando os dois como vetores, R1xR2
é o vetor normal entre os planos R1 e R2. E porquê isso define o ponto
de interseção entre as duas retas? O vetor normal entre os dois planos
define quais pontos pertencem tanto a R1 quanto a R2, ao mesmo tempo.
Descendo um nível de abstração, temos o ponto entre as duas retas, em
um plano qualquer.
Óbvio que explicando assim fica muito difícil de
enxergar, por isso o visualizador 3D é importante.
Ok,
com isso, podemos passar para a parte do visualizador 3D. Ele foi feito
utilizando a Glut, em C++ e o executável, junto com as dlls
necessárias, pode ser pego aqui.
A dinâmica de construção do visualizador foi bem
simples: Criar planos, vetores, retas e pontos de forma a mostrar para
o usuário como se comporta o espaço projetivo. Para isso, foram
utilizadas primitivas básicas do OpenGL para a criação de poligonos e
retas. Também foi utilizada uma função de Blend para deixar os planos com
alguma transparência e assim melhorar a visualização.
No visualizador existem alguns pontos principais.
Primeiro, dois vetores principais (vetores amarelos e azul) , que são
simétricos. A posição deles pode ser modificada pelo usuário. É
mostrado também um plano semi-transparente (azul claro) que é formado
pelos vetores principais. Segundo, existem 2 planos semi-transparentes
equivalentes aos planos z(vermelho escuro) e z/2(azul escuro) do plano
projetivo. Este z pode ser alterado (ver teclas de interação abaixo).
Estes planos também mostram onde os vetores principais os cortam. E,
por fim, podem ser observados dois vetores auxiliares (verde e
vermelho), que criam um plano que intersecta o plano dos vetores
principais (amarelo).
Para
interação, foi mantida a função de interação com mouse do primeiro
trabalho complementar e adicionadas as seguintes funções:

Voltar
para Trabalhos
Complementares