Computação Gráfica – Visibilidade
Profa. Mercedes Gonzales
Márquez
Tópicos


Visibilidade
Algoritmos de Visibilidade
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
Problema de Visibilidade

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




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
Algoritmos de Visibilidade

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.
Backface Culling
(Escolha das faces de trás)


Usa-se o conceito de vetor normal da face apontando para
fora do volume.
As faces cujas normais estão na direcção contrária ao
observador não são visíveis (faces de trás). Elas estão
numa parte cuja visibilidade e bloqueada por outras faces
Faces não
mais próximas ao observador.
visíveis
E
Backface Culling

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
(Por simplicidade estamos mostrando nas ilustrações
polígonos no lugar de poliedros).
Backface Culling

Observe o poliedro côncavo da figura. Veja que a face
pintada de vermelho tem vetor normal na mesma direção
do observador e portanto o algoritmo considera
erradamente como face visível ou face da frente.
E
Backface Culling


Como determinar se a face é da frente ou visível?
Face da frente – o ângulo θ formado pelo vetor da
linha de vista E e o vetor normal N é menor ou igual a
90o
Backface Culling
ou E.N ≥ O

Resumindo
– E.N ≥ O → Face da frente
– E.N < O → Face de trás
Backface Culling

Como determinar o vetor normal n da face com pontos
P1, P2 e P3?
P3
n
P2
P1
n  u  v, onde u  P2P3 e v  P2P1
nx  ( P3 y  P 2 y )(P1z  P 2 z )  ( P1y  P 2 y )(P3 z  P 2 z )
n y  ( P3z  P 2 z )(P1x  P 2 x )  ( P1z  P 2 z )(P3 x  P 2 x )
nz  ( P3x  P 2 x )(P1y  P 2 y )  ( P1x  P 2 x )(P3 y  P 2 y )
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 zbuffer
• Pintar o pixel (atualizar o buffer de cor)
• Atualizar o buffer de profundidade
 Caso contrário, ignorar
Z-Buffer
Exemplo
2 polígonos e o
Buffer
Profundidade
Exemplo
4 polígonos e o Buffer de cor
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 alterada
glDepthFunc(…)
• 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
(a)
(b)
Exemplo de Ambiguidade na ordenação: (a) Sobreposição cíclica;
(b) solução

Download

CG-visibilidade