Partición de espacio binario

Ajustar Compartir Imprimir Citar
Método para subdividir recursivamente un espacio en dos subconjuntos utilizando hiperplanos
El proceso de hacer un árbol BSP

En informática, la partición de espacio binario (BSP) es un método de partición de espacio que subdivide de forma recursiva un espacio euclidiano en dos conjuntos convexos mediante el uso de hiperplanos como particiones. Este proceso de subdivisión da lugar a una representación de objetos dentro del espacio en forma de una estructura de datos de árbol conocida como árbol BSP.

La partición del espacio binario se desarrolló en el contexto de los gráficos 3D por computadora en 1969. La estructura de un árbol BSP es útil en la representación porque puede brindar información espacial de manera eficiente sobre los objetos en una escena, como los objetos que se ordenan desde el frente. espalda con respecto a un espectador en un lugar dado. Otras aplicaciones de BSP incluyen: realizar operaciones geométricas con formas (geometría sólida constructiva) en CAD, detección de colisiones en robótica y videojuegos 3D, trazado de rayos y otras aplicaciones que involucran el manejo de escenas espaciales complejas.

Resumen

La partición de espacio binario es un proceso genérico de dividir recursivamente una escena en dos hasta que la partición satisfaga uno o más requisitos. Puede verse como una generalización de otras estructuras de árboles espaciales, como los árboles k-d y los árboles cuádruples, uno en el que los hiperplanos que dividen el espacio pueden tener cualquier orientación, en lugar de estar alineados con los ejes de coordenadas como están en k-d árboles o quadtrees. Cuando se utiliza en gráficos por computadora para renderizar escenas compuestas por polígonos planos, los planos de partición se eligen con frecuencia para que coincidan con los planos definidos por los polígonos en la escena.

La elección específica del plano de partición y el criterio para finalizar el proceso de partición varía según el propósito del árbol BSP. Por ejemplo, en la representación de gráficos por computadora, la escena se divide hasta que cada nodo del árbol BSP contiene solo polígonos que se pueden representar en un orden arbitrario. Cuando se utiliza la selección de cara posterior, cada nodo, por lo tanto, contiene un conjunto convexo de polígonos, mientras que cuando se representan polígonos de dos lados, cada nodo del árbol BSP contiene solo polígonos en un solo plano. En la detección de colisiones o el trazado de rayos, una escena se puede dividir en primitivas en las que las pruebas de colisión o intersección de rayos son sencillas.

La partición del espacio binario surgió de la necesidad de gráficos por computadora para dibujar rápidamente escenas tridimensionales compuestas de polígonos. Una forma sencilla de dibujar este tipo de escenas es el algoritmo del pintor, que produce polígonos en orden de distancia desde el espectador, de atrás hacia adelante, pintando sobre el fondo y los polígonos anteriores con cada objeto más cercano. Este enfoque tiene dos desventajas: el tiempo necesario para ordenar los polígonos de atrás hacia adelante y la posibilidad de errores en los polígonos superpuestos. Fuchs y sus coautores demostraron que la construcción de un árbol BSP resolvía ambos problemas al proporcionar un método rápido para ordenar los polígonos con respecto a un punto de vista dado (lineal en el número de polígonos en la escena) y al subdividir los polígonos superpuestos para evitar errores que puede ocurrir con el algoritmo del pintor. Una desventaja de la partición del espacio binario es que generar un árbol BSP puede llevar mucho tiempo. Normalmente, por lo tanto, se realiza una vez en geometría estática, como un paso de cálculo previo, antes del renderizado u otras operaciones en tiempo real en una escena. El costo de construir un árbol BSP hace que sea difícil e ineficiente implementar directamente objetos en movimiento en un árbol.

Los árboles BSP se utilizan a menudo en videojuegos 3D, en particular en los juegos de disparos en primera persona y en aquellos con ambientes interiores. Los motores de juego que utilizan árboles BSP incluyen los motores Doom (id Tech 1), Quake (variante id Tech 2), GoldSrc y Source. En ellos, los árboles BSP que contienen la geometría estática de una escena a menudo se usan junto con un búfer Z para fusionar correctamente objetos móviles como puertas y personajes en la escena de fondo. Si bien la partición del espacio binario proporciona una forma conveniente de almacenar y recuperar información espacial sobre los polígonos en una escena, no resuelve el problema de la determinación de la superficie visible.

Generación

El uso canónico de un árbol BSP es para renderizar polígonos (que son de doble cara, es decir, sin eliminar la cara posterior) con el algoritmo del pintor. Cada polígono se designa con un anverso y un reverso que pueden elegirse arbitrariamente y solo afectan la estructura del árbol pero no el resultado requerido. Dicho árbol se construye a partir de una lista desordenada de todos los polígonos de una escena. El algoritmo recursivo para la construcción de un árbol BSP a partir de esa lista de polígonos es:

  1. Elija un polígono P de la lista.
  2. Hacer un nodo N en el árbol BSP, y añadir P a la lista de polígonos en ese nodo.
  3. Para el otro polígono en la lista:
    1. Si ese polígono está totalmente delante del plano que contiene P, mover ese polígono a la lista de nodos delante de P.
    2. Si ese polígono está completamente detrás del plano que contiene P, mover ese polígono a la lista de nodos detrás P.
    3. Si ese polígono está intersectado por el plano que contiene P, dividirlo en dos polígonos y moverlos a las respectivas listas de polígonos detrás y delante de P.
    4. Si ese polígono se encuentra en el plano que contiene P, añadirlo a la lista de polígonos en nodo N.
  4. Aplica este algoritmo a la lista de polígonos delante de P.
  5. Aplicar este algoritmo a la lista de polígonos detrás P.

El siguiente diagrama ilustra el uso de este algoritmo para convertir una lista de líneas o polígonos en un árbol BSP. En cada uno de los ocho pasos (i.-viii.), el algoritmo anterior se aplica a una lista de líneas y se agrega un nuevo nodo al árbol.

Comience con una lista de líneas, (o en 3D, polígonos) formando la escena. En los diagramas de árboles, las listas son denotadas por rectángulos redondeados y nodos en el árbol BSP por círculos. En el diagrama espacial de las líneas, la dirección elegida para ser la "frontera" de una línea se denota por una flecha. Example of BSP tree construction - step 1.svg
i.Siguiendo los pasos del algoritmo anterior,
  1. Escogemos una línea, A, de la lista y...
  2. ... se lo dio a un nodo.
  3. Dividimos las líneas restantes de la lista en las que están delante de A (es decir, B2, C2, D2), y las que están detrás (B1, C1, D1).
  4. Primero procesamos las líneas delante de A (en pasos ii-v),...
  5. ...seguida por aquellos detrás (en pasos vi-vii).
Example of BSP tree construction - step 2.svg
ii.Ahora aplicamos el algoritmo a la lista de líneas delante de A (contiene B2, C2, D2). Elegimos una línea, B2, añadirla a un nodo y dividir el resto de la lista en aquellas líneas que están delante de B2 (D2), y las que están detrás de ella (C2, D3).Example of BSP tree construction - step 3.svg
iii.Elige una línea, D2, de la lista de líneas delante de B2 y A. Es la única línea de la lista, así que después de añadirla a un nodo, nada más debe hacerse. Example of BSP tree construction - step 4.svg
iv.Hemos terminado con las líneas delante de B2, así que considere las líneas detrás de B2 (C2 y D3). Elija uno de estos (C2), agréguelo a un nodo, y ponga la otra línea en la lista (D3) en la lista de líneas delante de C2. Example of BSP tree construction - step 5.svg
v.Ahora mira la lista de líneas delante de C2. Sólo hay una línea (D3), por lo que añadir esto a un nodo y continuar. Example of BSP tree construction - step 6.svg
vi.Ahora hemos añadido todas las líneas delante de A al árbol BSP, así que ahora empezamos en la lista de líneas detrás de A. Elegir una línea (B1) de esta lista, agregamos B1 a un nodo y dividimos el resto de la lista en líneas delante de B1 (es decir, D1), y líneas detrás de B1 (es decir, C1).Example of BSP tree construction - step 7.svg
vii.Procesar primero la lista de líneas delante de B1, D1 es la única línea en esta lista, por lo que añadir esto a un nodo y continuar.Example of BSP tree construction - step 8.svg
viii.Mirando al lado de la lista de líneas detrás de B1, la única línea en esta lista es C1, así que agrega esto a un nodo, y el árbol BSP está completo.Example of BSP tree construction - step 9.svg

La cantidad final de polígonos o líneas en un árbol suele ser mayor (a veces mucho mayor) que la lista original, ya que las líneas o polígonos que cruzan el plano de partición deben dividirse en dos. Es deseable minimizar este aumento, pero también mantener un equilibrio razonable en el árbol final. Por lo tanto, la elección de qué polígono o línea se utiliza como plano de partición (en el paso 1 del algoritmo) es importante para crear un árbol BSP eficiente.

Transversal

Un árbol BSP se recorre en un tiempo lineal, en un orden determinado por la función particular del árbol. Nuevamente, usando el ejemplo de renderizar polígonos de dos lados usando el algoritmo del pintor, para dibujar un polígono P correctamente se requiere que todos los polígonos detrás del plano P se encuentren en dibujarse primero, luego el polígono P, luego finalmente los polígonos delante de P. Si este orden de dibujo se cumple para todos los polígonos de una escena, la escena completa se renderiza en el orden correcto. Este procedimiento se puede implementar atravesando recursivamente un árbol BSP usando el siguiente algoritmo. Desde una ubicación de visualización determinada V, para representar un árbol BSP,

  1. Si el nodo actual es un nodo de hoja, render los polígonos en el nodo actual.
  2. De lo contrario, si el lugar de visualización V está delante del nodo actual:
    1. Render al niño árbol BSP que contiene polígonos detrás del nodo actual
    2. Render los polígonos en el nodo actual
    3. Render el niño árbol BSP que contiene polígonos delante del nodo actual
  3. De lo contrario, si el lugar de visualización V está detrás del nodo actual:
    1. Render el niño árbol BSP que contiene polígonos delante del nodo actual
    2. Render los polígonos en el nodo actual
    3. Render al niño árbol BSP que contiene polígonos detrás del nodo actual
  4. De lo contrario, la ubicación de visualización V debe estar exactamente en el avión asociado con el nodo actual. Entonces:
    1. Render el niño árbol BSP que contiene polígonos delante del nodo actual
    2. Render al niño árbol BSP que contiene polígonos detrás del nodo actual
Example of BSP tree traversal.svg

Aplicar este algoritmo recursivamente al árbol BSP generado anteriormente da como resultado los siguientes pasos:

El árbol se recorre en tiempo lineal y representa los polígonos en un orden de lejos a cerca (D1, B1, C1, A, D2, B2, C2, D3) adecuado para el pintor&# 39;s algoritmo.

Cronología

Referencias adicionales

  • Naylor, B.; Amanatides, J.; Thibualt, W. (agosto de 1990). "Merging BSP Trees Yields Polyhedral Set Operations". ACM SIGGRAPH Computer Graphics. 24 (4): 115–124. CiteSeerX10.1.1.69.292. doi:10.1145/97880.97892.
  • Naylor, B. (mayo de 1993). "Construyendo buenos árboles de separación" (PDF). Interfaz gráfica. CiteSeerX10.1.1.16.4432.
  • Chen, S.; Gordon, D. (septiembre de 1991). "Front-to-Back Display of BSP Trees". Gráficos informáticos de IEEE & Algoritmos. 11 (5): 79–85. doi:10.1109/38.90569. S2CID 19056967.
  • Radha, H.; Leoonardi, R.; Vetterli, M.; Naylor, B. (1991). "Binary space spliting tree representation of images". Journal of Visual Communications and Image Processing. 2 (3): 201–221. doi:10.1016/1047-3203(91)90023-9.
  • Radha, H.M.S. (1993). Representación de imagen eficiente utilizando árboles de separación espacial binario (PhD). Universidad de Columbia. OCLC 30775044.
  • Radha, H.M.S. (1994). "Eficiente representación de imagen utilizando árboles de partición espacial binarios". Procesamiento de señales. 35 (2): 174–181. doi:10.1016/0165-1684(94)90047-7.
  • Radha, H.; Vetterli, M.; Leoonardi, R. (diciembre de 1996). "Comprasión de imagen utilizando árboles de partición espacial binaria". Transacciones IEEE en procesamiento de imágenes. 5 (12): 1610–24. Código:1996ITIP....5.1610R. doi:10.1109/83.544569. PMID 18290079.https://ui.adsabs.harvard.edu/abs/1996ITIP....5.1610R/abstract
  • Winter, A.S. (abril de 1999). "Una investigación sobre la producción en tiempo real de polígono 3d utilizando árboles bsp". University of Wales Swansea. CiteSeerX10.1.1.11.9725. {{cite journal}}: Cite journal requires |journal= (Ayuda)
  • de Berg, M.; van Kreveld, M.; Overmars, M.; Schwarzkopf, O. (2000). "§12: Particiones espaciales binarias". Geometría computacional (2a edición). Springer-Verlag. pp. 251–265. ISBN 978-3-540-65620-3. Describe un Algoritmo de Pintor aleatorizado..
  • Ericson, Christer (2005). "8. Jerarquías de árboles BSP". Detección de colisión en tiempo real. Serie Morgan Kaufmann en Tecnología 3D interactiva. Morgan Kaufmann. pp. 349–382. ISBN 1-55860-732-3.