Upload
internet
View
107
Download
0
Embed Size (px)
Citation preview
Computação Gráfica – Visibilidade
Profa. Mercedes Gonzales Márquez
Tópicos
Visibilidade Algoritmos de Visibilidade
O sistema de visão humana usa vários recursos para perceber a profundidade. Um deles é a oclusão de objetos, ou seja, objetos mais distantes em relação a um observador ao longo de um raio de visão são escondidos pelos objetos opacos mais próximos.
Na Figura, a superfície SA é visível em relação ao observador e as outras ficam escondidas, em inglês hidden.
Visibilidade
Visibilidade
Como diferenciar as distâncias das superfícies em relação ao seu centro de projeção, “limitando” à “visão” somente para as superfícies mais próximas?.
A essência dos algoritmos de visibilidade é muito simples: remover as partes que “não devem ser vistas” pelo computador na produção de uma imagem sintética.
Problema de Visibilidade
Quais primitivas transformadas e projetadas contribuem para os pixels da imagem?
Problema de Visibilidade
Problema de Visibilidade
Em geral resolve-se o problema oposto: Quais as superfícies invisíveis que:
estão fora do campo de visão são faces de trás num poliedro fechado estão ocultas por outras faces mais próximas da
câmara
São classificados em três grandes grupos: (a) técnicas baseadas em espaço de imagem,
(b) técnicas baseadas em espaço do objeto ou da cena e
(c) técnicas mistas.
Algoritmos de Visibilidade
A determinação de visibilidade por técnicas baseadas no espaço de imagem tem resolução a nível de pixels.
As baseadas em espaço da cena tem resolução a nível do espaço de representação das figuras geométricas.
Algoritmos de Visibilidade
Alguns métodos:– Detecção das faces de trás (back-face culling) - Técnica
baseada no espaço da cena.– Depth-buffer (z-buffer) – Técnica baseada no espaço da
imagem.– Painter’s algorithm (Algoritmo do Pintor) - Técnica baseada
no espaço da cena.
Algoritmos de Visibilidade
Backface Culling(Escolha das faces de trás) Este método pode ser aplicado em um único poliedro
convexo fechado na cena.
Não pode ser aplicado : - Em poliedros côncavos - ou quando existem mais objetos
Backface Culling
As faces cujas normais estão na direcção contrária ao observador não são visíveis. Elas estão numa parte do poliedro cuja visibilidade e bloqueada por outras faces mais próximas ao observador.
E
Usa-se o conceito de vetor normal da face apontando para fora do volume.
Backface Culling
Esse conceito não pode ser aplicado para um poliedro côncavo como o da figura, observe que a face pintada de vermelho tem vetor normal na mesma direção do observador.
E
Backface Culling
Como determinar se a face é da frente?
Fase da frente – Fase da frente – o ângulo o ângulo θθ formado pelo vetor formado pelo vetor da linha de vista E e o vetor normal N é menor ou da linha de vista E e o vetor normal N é menor ou igual a 90igual a 90o o
Backface Culling
Resumindo– E.N ≥ O → Face da
frente– E.N < O → Face de trás
ou E.N ≥ O
Backface Culling
Como determinar o vetor normal n da face com pontos P1, P2 e P3?
1232, PPvePPuondevun
P3
P2
P1
n
)23)(21()21)(23(
)23)(21()21)(23(
)23)(21()21)(23(
yyxxyyxxz
xxzzxxzzy
zzyyzzyyx
PPPPPPPPn
PPPPPPPPn
PPPPPPPPn
Backface Culling
Veja o programa visibilidade.c no qual cada vez que um cubo é rotacionado são exibidas somente as faces visíveis detetadas pelo algoritmo backface culling. Responda as seguintes perguntas:
– Como são construídas as faces do cubo?– Como são feitas as rotações do cubo, por quê não é usado o comando glRotatef?– Qual é o trecho de código que determina os vetores normais das faces do cubo?– Qual é o trecho de código que determina o vetor da direção de vista. Qual é a posição do observador?– Mude a posição do observador para cima do cubo e para um lado do cubo e observe os novos resultados de visibilidade.
Z-Buffer
• Método que opera no espaço da imagem• Mantém para cada pixel um valor de profundidade (z-buffer ou
depth buffer) • Ao início fazemos:
z-buffer = profundidade máxima Buffer de cor = cor de fundo
• Durante a rasterização de cada polígono, cada pixel passa por um teste de profundidade Se a profundidade do pixel for menor que a registrada no z-
buffer• Pintar o pixel (atualizar o buffer de cor)• Atualizar o buffer de profundidade
Caso contrário, ignorar
Z-Buffer
Z-Buffer
• OpenGL: Habilitar o z-buffer:
glEnable (GL_DEPTH_TEST);
Não esquecer de alocar o z-buffer → GLUT_DEPTH• Número de bits por pixel depende de implementação /
disponibilidade de memória
Ao gerar um novo quadro, limpar também o z-buffer:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Ordem imposta pelo teste de profundidade pode ser alteradaglDepthFunc(…)
• Veja os exemplos em OpenGL: hidplanes.c, planes.c e triangles.c
Z-Buffer
• Exercícios:
(1) As diferentes opções para o parâmetro do comando glDepthFunc estão na página 290 do livro Redbook. Teste cada uma das opções nos três programas (hidplanes.c, planes.c, triangles.c) e relate os resultados.
(2) Desenhe com polígonos (faces) o seguinte cenário mostrado na vista frontal e vista de topo. Aplique as duas técnicas de visibilidade (z-buffer e back face culling) e discuta os resultados visuais após observar o cenário de vários pontos de vista.
Algoritmo do Pintor
• Também conhecido como algoritmo de prioridade em Z (depth priority)
• Idéia é pintar objetos mais distantes (background) antes de pintar objetos próximos (foreground)
Técnica de pintores : as montanhas distantes foram pintadas em primeiro lugar, o gramado mais próximo foi adicionado e, finalmente, as árvores foram acrescidas.
Algoritmo do Pintor
Basicamente, o procedimento envolve três passos:
1. ordenar, de forma decrescente, os polígonos pelas distâncias, ou profundidades, em relação ao observador;
2. resolver as ambiguidades na ordenação, dividindo os polígonos; e
3. desenhar na memória de exibição os polígonos, dos mais distantes para os mais próximos, sendo os valores gravados anteriormente sempre sobrescritos pelos novos valores.
Algoritmo do Pintor
Exemplo de Ambiguidade na ordenação: (a) Sobreposição cíclica;
(b) solução
(a) (b)