Detecção de superfície visível

Quando vemos uma imagem contendo objetos e superfícies não transparentes, não podemos ver os objetos que estão atrás dos objetos mais próximos do olho. Devemos remover essas superfícies ocultas para obter uma imagem de tela realista. A identificação e remoção dessas superfícies é chamadaHidden-surface problem.

Existem duas abordagens para remover problemas de superfície ocultos - Object-Space method e Image-space method. O método do espaço do objeto é implementado no sistema de coordenadas físicas e o método do espaço da imagem é implementado no sistema de coordenadas da tela.

Quando queremos exibir um objeto 3D em uma tela 2D, precisamos identificar as partes da tela que são visíveis de uma posição de visualização escolhida.

Método de Depth Buffer (Z-Buffer)

Este método é desenvolvido por Cutmull. É uma abordagem de espaço de imagem. A ideia básica é testar a profundidade Z de cada superfície para determinar a superfície mais próxima (visível).

Neste método, cada superfície é processada separadamente, uma posição de pixel de cada vez na superfície. Os valores de profundidade de um pixel são comparados e a superfície mais próxima (z menor) determina a cor a ser exibida no buffer de quadros.

É aplicado de forma muito eficiente em superfícies de polígono. As superfícies podem ser processadas em qualquer ordem. Para substituir os polígonos mais próximos dos mais distantes, dois buffers chamadosframe buffer e depth buffer, são usados.

Depth buffer é usado para armazenar valores de profundidade para a posição (x, y), conforme as superfícies são processadas (0 ≤ profundidade ≤ 1).

o frame buffer é usado para armazenar o valor da intensidade do valor da cor em cada posição (x, y).

As coordenadas z são normalmente normalizadas para o intervalo [0, 1]. O valor 0 para a coordenada z indica o painel de corte traseiro e o valor 1 para as coordenadas z indica o painel de corte frontal.

Algoritmo

Step-1 - Defina os valores do buffer -

Depthbuffer (x, y) = 0

Framebuffer (x, y) = cor de fundo

Step-2 - Processe cada polígono (um de cada vez)

Para cada posição de pixel projetada (x, y) de um polígono, calcule a profundidade z.

Se Z> depthbuffer (x, y)

Calcular a cor da superfície,

definir depthbuffer (x, y) = z,

framebuffer (x, y) = surfacecolor (x, y)

Vantagens

  • É fácil de implementar.
  • Reduz o problema de velocidade se implementado em hardware.
  • Ele processa um objeto por vez.

Desvantagens

  • Requer muita memória.
  • É um processo demorado.

Método Scan-Line

É um método de espaço de imagem para identificar a superfície visível. Este método possui informações de profundidade para apenas uma única linha de varredura. Para exigir uma linha de varredura de valores de profundidade, devemos agrupar e processar todos os polígonos que cruzam uma determinada linha de varredura ao mesmo tempo antes de processar a próxima linha de varredura. Duas tabelas importantes,edge table e polygon table, são mantidos para isso.

The Edge Table - Ele contém pontos finais de coordenada de cada linha na cena, a inclinação inversa de cada linha e ponteiros na tabela de polígonos para conectar as bordas às superfícies.

The Polygon Table - Ele contém os coeficientes de plano, propriedades do material de superfície, outros dados de superfície e podem ser indicadores da tabela de arestas.

Para facilitar a busca por superfícies cruzando uma determinada linha de varredura, uma lista ativa de arestas é formada. A lista ativa armazena apenas as arestas que cruzam a linha de varredura em ordem crescente de x. Além disso, um sinalizador é definido para cada superfície para indicar se uma posição ao longo de uma linha de varredura está dentro ou fora da superfície.

As posições dos pixels em cada linha de varredura são processadas da esquerda para a direita. Na intersecção à esquerda com uma superfície, a bandeira de superfície é ativada e à direita, a bandeira é desativada. Você só precisa realizar cálculos de profundidade quando várias superfícies têm seus sinalizadores ativados em uma determinada posição da linha de varredura.

Método de subdivisão de área

O método de subdivisão de área aproveita a localização das áreas de visualização que representam parte de uma única superfície. Divida a área de visualização total em retângulos cada vez menores até que cada pequena área seja a projeção de parte de uma única superfície visível ou nenhuma superfície.

Continue esse processo até que as subdivisões sejam facilmente analisadas como pertencentes a uma única superfície ou até que sejam reduzidas ao tamanho de um único pixel. Uma maneira fácil de fazer isso é dividir sucessivamente a área em quatro partes iguais em cada etapa. Existem quatro relações possíveis que uma superfície pode ter com um limite de área especificado.

  • Surrounding surface - Um que circunda completamente a área.

  • Overlapping surface - Um que esteja parcialmente dentro e parcialmente fora da área.

  • Inside surface - Um que esteja completamente dentro da área.

  • Outside surface - Um que está completamente fora da área.

Os testes para determinar a visibilidade da superfície dentro de uma área podem ser declarados em termos dessas quatro classificações. Nenhuma subdivisão adicional de uma área especificada é necessária se uma das seguintes condições for verdadeira -

  • Todas as superfícies são superfícies externas em relação à área.
  • Apenas uma superfície interna, sobreposta ou circundante está na área.
  • Uma superfície circundante obscurece todas as outras superfícies dentro dos limites da área.

Detecção de face posterior

Um método de espaço-objeto rápido e simples para identificar as faces posteriores de um poliedro é baseado nos testes "de dentro para fora". Um ponto (x, y, z) está "dentro" de uma superfície poligonal com parâmetros de plano A, B, C e D se Quando um ponto interno está ao longo da linha de visão da superfície, o polígono deve ser uma face posterior ( estamos dentro desse rosto e não podemos ver a frente dele de nossa posição de visualização).

Podemos simplificar este teste considerando o vetor normal N a uma superfície poligonal, que possui componentes cartesianos (A, B, C).

Em geral, se V é um vetor na direção de visualização da posição do olho (ou "câmera"), então este polígono é uma face posterior se

V.N > 0

Além disso, se as descrições dos objetos forem convertidas em coordenadas de projeção e sua direção de visualização for paralela ao eixo z de visualização, então -

V = (0, 0, V z ) e V.N = V Z C

Assim, só precisamos considerar o sinal de C a componente do vetor normal N.

Em um sistema de visualização para destros com direção de visualização ao longo do eixo $ Z_ {V} $ negativo, o polígono é uma face posterior se C <0. Além disso, não podemos ver nenhuma face cujo normal tenha componente z C = 0, pois seu a direção de visualização é em direção a esse polígono. Assim, em geral, podemos rotular qualquer polígono como uma face posterior se seu vetor normal tiver um valor de componente az -

C <= 0

Métodos semelhantes podem ser usados ​​em pacotes que empregam um sistema de visualização para canhotos. Nesses pacotes, os parâmetros do plano A, B, C e D podem ser calculados a partir das coordenadas do vértice do polígono especificadas no sentido horário (ao contrário do sentido anti-horário usado em um sistema destro).

Além disso, as faces posteriores têm vetores normais que apontam para longe da posição de visualização e são identificados por C> = 0 quando a direção de visualização está ao longo do eixo $ Z_ {v} $ positivo. Ao examinar o parâmetro C para os diferentes planos que definem um objeto, podemos identificar imediatamente todas as faces posteriores.

Método A-Buffer

O método A-buffer é uma extensão do método de buffer de profundidade. O método A-buffer é um método de detecção de visibilidade desenvolvido na Lucas film Studios para o sistema de renderização Renders Everything You Ever Saw (REYES).

O buffer A se expande no método do buffer de profundidade para permitir transparências. A estrutura de dados chave no buffer A é o buffer de acumulação.

Cada posição no buffer A tem dois campos -

  • Depth field - Armazena um número real positivo ou negativo

  • Intensity field - Ele armazena informações de intensidade de superfície ou um valor de ponteiro

Se a profundidade> = 0, o número armazenado nessa posição é a profundidade de uma única superfície sobreposta à área de pixel correspondente. O campo de intensidade então armazena os componentes RGB da cor da superfície naquele ponto e a porcentagem de cobertura de pixels.

Se a profundidade <0, indica contribuições de múltiplas superfícies para a intensidade do pixel. O campo de intensidade então armazena um ponteiro para uma lista vinculada de dados de superfície. O buffer de superfície no A-buffer inclui -

  • Componentes de intensidade RGB
  • Parâmetro de opacidade
  • Depth
  • Porcentagem de cobertura de área
  • Identificador de superfície

O algoritmo prossegue exatamente como o algoritmo do buffer de profundidade. Os valores de profundidade e opacidade são usados ​​para determinar a cor final de um pixel.

Método de classificação de profundidade

O método de classificação de profundidade usa operações de espaço de imagem e espaço de objeto. O método de classificação de profundidade executa duas funções básicas -

  • Primeiro, as superfícies são classificadas em ordem decrescente de profundidade.

  • Em segundo lugar, as superfícies são convertidas por varredura em ordem, começando com a superfície de maior profundidade.

A conversão de varredura das superfícies do polígono é realizada no espaço da imagem. Este método para resolver o problema da superfície oculta é frequentemente referido como opainter's algorithm. A figura a seguir mostra o efeito da classificação de profundidade -

O algoritmo começa classificando por profundidade. Por exemplo, a estimativa inicial de "profundidade" de um polígono pode ser considerada o valor z mais próximo de qualquer vértice do polígono.

Tomemos o polígono P no final da lista. Considere todos os polígonos Q cujas extensões z se sobrepõem aos P's. Antes de desenhar P, fazemos os seguintes testes. Se algum dos testes a seguir for positivo, podemos assumir que P pode ser obtido antes de Q.

  • As extensões x não se sobrepõem?
  • As extensões y não se sobrepõem?
  • P está inteiramente no lado oposto do plano de Q do ponto de vista?
  • Q está inteiramente do mesmo lado do plano de P que o ponto de vista?
  • As projeções dos polígonos não se sobrepõem?

Se todos os testes falharem, dividimos P ou Q usando o plano do outro. Os novos polígonos de corte estão sendo inseridos na ordem de profundidade e o processo continua. Teoricamente, esse particionamento poderia gerar O (n 2 ) polígonos individuais, mas, na prática, o número de polígonos é muito menor.

Árvores de partição de espaço binário (BSP)

O particionamento do espaço binário é usado para calcular a visibilidade. Para construir as árvores BSP, deve-se começar com polígonos e rotular todas as arestas. Lidando com apenas uma aresta de cada vez, estenda cada aresta de forma que divida o plano em dois. Coloque a primeira aresta da árvore como raiz. Adicione arestas subsequentes com base em se elas estão dentro ou fora. As arestas que abrangem a extensão de uma aresta que já está na árvore são divididas em duas e ambas são adicionadas à árvore.

  • Da figura acima, primeiro pegue A como uma raiz.

  • Faça uma lista de todos os nós na figura (a).

  • Coloque todos os nós que estão na frente da raiz A para o lado esquerdo do nó A e colocar todos os nós que estão atrás da raiz A para o lado direito conforme mostrado na figura (b).

  • Processe todos os nós da frente primeiro e depois os nós de trás.

  • Conforme mostrado na figura (c), vamos primeiro processar o nó B. Como não há nada na frente do nóB, colocamos NIL. No entanto, temos nóC na parte de trás do nó B, então nó C irá para o lado direito do nó B.

  • Repita o mesmo processo para o nó D.