Detección de superficie visible

Cuando vemos una imagen que contiene objetos y superficies no transparentes, no podemos ver esos objetos de la vista que están detrás de los objetos más cercanos al ojo. Debemos eliminar estas superficies ocultas para obtener una imagen de pantalla realista. La identificación y eliminación de estas superficies se denominaHidden-surface problem.

Hay dos enfoques para eliminar los problemas de superficies ocultas: Object-Space method y Image-space method. El método de espacio de objetos se implementa en un sistema de coordenadas físico y el método de espacio de imagen se implementa en un sistema de coordenadas de pantalla.

Cuando queremos mostrar un objeto 3D en una pantalla 2D, necesitamos identificar aquellas partes de una pantalla que son visibles desde una posición de visualización elegida.

Método de búfer de profundidad (búfer Z)

Este método es desarrollado por Cutmull. Es un enfoque de espacio de imagen. La idea básica es probar la profundidad Z de cada superficie para determinar la superficie más cercana (visible).

En este método, cada superficie se procesa por separado, una posición de píxel a la vez en la superficie. Se comparan los valores de profundidad de un píxel y la superficie más cercana (z más pequeña) determina el color que se mostrará en el búfer de fotogramas.

Se aplica de manera muy eficiente en superficies de polígono. Las superficies se pueden procesar en cualquier orden. Para anular los polígonos más cercanos de los lejanos, dos búferes denominadosframe buffer y depth buffer, son usados.

Depth buffer se utiliza para almacenar valores de profundidad para la posición (x, y), a medida que se procesan las superficies (0 ≤ profundidad ≤ 1).

los frame buffer se utiliza para almacenar el valor de intensidad del valor de color en cada posición (x, y).

Las coordenadas z normalmente se normalizan al rango [0, 1]. El valor 0 para la coordenada z indica el panel de recorte posterior y el valor 1 para las coordenadas z indica el panel de recorte frontal.

Algoritmo

Step-1 - Establecer los valores del búfer -

Depthbuffer (x, y) = 0

Framebuffer (x, y) = color de fondo

Step-2 - Procesar cada polígono (uno a la vez)

Para cada posición de píxel proyectada (x, y) de un polígono, calcule la profundidad z.

Si Z> búfer de profundidad (x, y)

Calcular el color de la superficie,

establecer el búfer de profundidad (x, y) = z,

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

Ventajas

  • Es fácil de implementar.
  • Reduce el problema de velocidad si se implementa en hardware.
  • Procesa un objeto a la vez.

Desventajas

  • Requiere mucha memoria.
  • Es un proceso que requiere mucho tiempo.

Método de línea de escaneo

Es un método de espacio de imagen para identificar la superficie visible. Este método tiene información de profundidad para una sola línea de exploración. Para requerir una línea de exploración de valores de profundidad, debemos agrupar y procesar todos los polígonos que cruzan una línea de exploración determinada al mismo tiempo antes de procesar la siguiente línea de exploración. Dos tablas importantes,edge table y polygon table, se mantienen para esto.

The Edge Table - Contiene los puntos finales de coordenadas de cada línea en la escena, la pendiente inversa de cada línea y punteros en la tabla de polígono para conectar los bordes a las superficies.

The Polygon Table - Contiene los coeficientes del plano, las propiedades del material de la superficie, otros datos de la superficie y pueden ser indicadores de la tabla de bordes.

Para facilitar la búsqueda de superficies que cruzan una línea de exploración determinada, se forma una lista activa de bordes. La lista activa almacena solo aquellos bordes que cruzan la línea de exploración en orden creciente de x. También se establece una bandera para cada superficie para indicar si una posición a lo largo de una línea de exploración está dentro o fuera de la superficie.

Las posiciones de los píxeles en cada línea de exploración se procesan de izquierda a derecha. En la intersección izquierda con una superficie, la bandera de superficie se enciende y en la derecha, la bandera se apaga. Solo necesita realizar cálculos de profundidad cuando varias superficies tienen sus indicadores encendidos en una determinada posición de línea de exploración.

Método de subdivisión de área

El método de subdivisión de áreas aprovecha la ubicación de las áreas de vista que representan parte de una sola superficie. Divida el área de visualización total en rectángulos cada vez más pequeños hasta que cada área pequeña sea la proyección de una parte de una sola superficie visible o ninguna superficie.

Continúe este proceso hasta que las subdivisiones se analicen fácilmente como pertenecientes a una sola superficie o hasta que se reduzcan al tamaño de un solo píxel. Una forma sencilla de hacerlo es dividir sucesivamente el área en cuatro partes iguales en cada paso. Hay cuatro posibles relaciones que puede tener una superficie con un límite de área específico.

  • Surrounding surface - Uno que encierra completamente el área.

  • Overlapping surface - Uno que esté en parte dentro y en parte fuera del área.

  • Inside surface - Uno que esté completamente dentro del área.

  • Outside surface - Uno que esté completamente fuera del área.

Las pruebas para determinar la visibilidad de la superficie dentro de un área se pueden establecer en términos de estas cuatro clasificaciones. No se necesitan más subdivisiones de un área específica si se cumple una de las siguientes condiciones:

  • Todas las superficies son superficies exteriores con respecto al área.
  • Solo hay una superficie interior, superpuesta o circundante en el área.
  • Una superficie circundante oscurece todas las demás superficies dentro de los límites del área.

Detección de cara trasera

Un método de espacio de objetos rápido y simple para identificar las caras posteriores de un poliedro se basa en las pruebas "de adentro hacia afuera". Un punto (x, y, z) está "dentro" de una superficie poligonal con los parámetros planos A, B, C y D si Cuando un punto interior está a lo largo de la línea de visión hacia la superficie, el polígono debe ser una cara posterior ( estamos dentro de esa cara y no podemos ver el frente desde nuestra posición de visualización).

Podemos simplificar esta prueba considerando el vector normal N a una superficie poligonal, que tiene componentes cartesianos (A, B, C).

En general, si V es un vector en la dirección de visualización desde la posición del ojo (o "cámara"), entonces este polígono es una cara posterior si

V.N > 0

Además, si las descripciones de los objetos se convierten en coordenadas de proyección y la dirección de visualización es paralela al eje z de visualización, entonces:

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

De modo que solo necesitamos considerar el signo de C como la componente del vector normal N.

En un sistema de visualización para diestros con dirección de visualización a lo largo del eje $ Z_ {V} $ negativo, el polígono es una cara posterior si C <0. Además, no podemos ver ninguna cara cuya normal tenga el componente z C = 0, ya que su La dirección de visualización es hacia ese polígono. Por lo tanto, en general, podemos etiquetar cualquier polígono como una cara posterior si su vector normal tiene un valor de componente az:

C <= 0

Se pueden utilizar métodos similares en paquetes que emplean un sistema de visualización para zurdos. En estos paquetes, los parámetros de plano A, B, C y D se pueden calcular a partir de las coordenadas de los vértices del polígono especificadas en el sentido de las agujas del reloj (a diferencia de la dirección en sentido contrario a las agujas del reloj utilizada en un sistema para diestros).

Además, las caras posteriores tienen vectores normales que apuntan en dirección opuesta a la posición de visualización y se identifican con C> = 0 cuando la dirección de visualización está a lo largo del eje $ Z_ {v} $ positivo. Al examinar el parámetro C para los diferentes planos que definen un objeto, podemos identificar inmediatamente todas las caras posteriores.

Método de tampón A

El método de búfer A es una extensión del método de búfer de profundidad. El método A-buffer es un método de detección de visibilidad desarrollado en Lucas Film Studios para el sistema de renderizado Renders Everything You Ever Saw (REYES).

El búfer A amplía el método del búfer de profundidad para permitir transparencias. La estructura de datos clave en el búfer A es el búfer de acumulación.

Cada posición en el búfer A tiene dos campos:

  • Depth field - Almacena un número real positivo o negativo

  • Intensity field - Almacena información sobre la intensidad de la superficie o un valor de puntero

Si profundidad> = 0, el número almacenado en esa posición es la profundidad de una sola superficie que se superpone al área de píxeles correspondiente. El campo de intensidad luego almacena los componentes RGB del color de la superficie en ese punto y el porcentaje de cobertura de píxeles.

Si la profundidad es <0, indica contribuciones de múltiples superficies a la intensidad del píxel. El campo de intensidad luego almacena un puntero a una lista vinculada de datos de superficie. El búfer de superficie en el búfer A incluye:

  • Componentes de intensidad RGB
  • Parámetro de opacidad
  • Depth
  • Porcentaje de cobertura de área
  • Identificador de superficie

El algoritmo procede como el algoritmo de búfer de profundidad. Los valores de profundidad y opacidad se utilizan para determinar el color final de un píxel.

Método de clasificación por profundidad

El método de clasificación de profundidad utiliza operaciones de espacio de imagen y espacio de objeto. El método de clasificación en profundidad realiza dos funciones básicas:

  • Primero, las superficies se clasifican en orden decreciente de profundidad.

  • En segundo lugar, las superficies se escanean y se convierten en orden, comenzando por la superficie de mayor profundidad.

La conversión de exploración de las superficies poligonales se realiza en el espacio de la imagen. Este método para resolver el problema de la superficie oculta a menudo se denominapainter's algorithm. La siguiente figura muestra el efecto de la clasificación en profundidad:

El algoritmo comienza ordenando por profundidad. Por ejemplo, la estimación de "profundidad" inicial de un polígono puede tomarse como el valor z más cercano de cualquier vértice del polígono.

Tomemos el polígono P al final de la lista. Considere todos los polígonos Q cuyas extensiones z se superponen a P. Antes de dibujar P, realizamos las siguientes pruebas. Si alguna de las siguientes pruebas es positiva, podemos suponer que P se puede dibujar antes que Q.

  • ¿No se superponen las extensiones x?
  • ¿No se superponen las extensiones y?
  • ¿Está P completamente en el lado opuesto del plano de Q desde el punto de vista?
  • ¿Está Q completamente en el mismo lado del plano de P que el punto de vista?
  • ¿No se superponen las proyecciones de los polígonos?

Si todas las pruebas fallan, entonces dividimos P o Q usando el plano del otro. Los nuevos polígonos de corte se insertan en el orden de profundidad y el proceso continúa. Teóricamente, esta partición podría generar O (n 2 ) polígonos individuales, pero en la práctica, el número de polígonos es mucho menor.

Árboles de partición de espacio binario (BSP)

La partición del espacio binario se utiliza para calcular la visibilidad. Para construir los árboles BSP, se debe comenzar con polígonos y etiquetar todos los bordes. Trabajando con solo un borde a la vez, extienda cada borde de modo que divida el plano en dos. Coloque el primer borde del árbol como raíz. Agregue aristas posteriores en función de si están adentro o afuera. Los bordes que abarcan la extensión de un borde que ya está en el árbol se dividen en dos y ambos se agregan al árbol.

  • De la figura anterior, primero tome A como raíz.

  • Haga una lista de todos los nodos en la figura (a).

  • Pon todos los nodos que están delante de root A al lado izquierdo del nodo A y poner todos esos nodos que están detrás de la raíz A hacia el lado derecho como se muestra en la figura (b).

  • Procese primero todos los nodos frontales y luego los nodos posteriores.

  • Como se muestra en la figura (c), primero procesaremos el nodo B. Como no hay nada frente al nodoB, hemos puesto NIL. Sin embargo, tenemos nodoC en la parte posterior del nodo B, entonces nodo C irá al lado derecho del nodo B.

  • Repite el mismo proceso para el nodo. D.