UNIVERSIDAD SIMÓN BOLÍVAR DPTO. DE COMPUTACIÓN Y TECNOLOGÍA DE LA INFORMACIÓN CI-4321. COMPUTACIÓN GRÁFICA I ABRIL-JULIO 2000 RENDERING. Determinación de superficies visibles Frananger E. Salazar R. 95-27960 Kenyer P. Dominguez M. 95-27367 INTRODUCCIÓN Una parte importante de la generación de despliegues de gráficas realistas (rendering) es la identificación de las partes de una escena que son visibles desde un punto de vista determinado. Hay muchos planteamientos que se pueden manejar para solucionar este problema y se han desarrollado algunos algoritmos a fin de identificar con eficiencia objetos visibles para diferentes tipos de aplicaciones. Algunos métodos requieren mucha memoria, algunos implican mucho tiempo de procesamiento y otros sólo se aplican en objetos específicos. Seleccionar un método para una aplicación en particular puede depender de factores como la complejidad de la escena, el tipo de objetos a desplegar, el equipo del que se dispone y la necesidad de generar despliegues gráficos animados o estáticos. Los diversos métodos de algoritmos se conocen como métodos de detección de superficie visible ó, como métodos de eliminación de superficies ocultas (a pesar de que puede ser diferente identificar superficies visibles y eliminar superficies ocultas). En este trabajo, se analizan algunos de los métodos más comunes para detectar superficies visibles en una escena tridimensional. RENDERING Los algoritmos de detección de superficies visibles se pueden clasificar en dependiendo de si manejan definiciones de objetos de manera directa o con sus imágenes proyectadas. Estos planteamientos se denominan métodos de objeto-espacio y métodos de imagen-espacio, respectivamente. Un método de objeto-espacio compara objetos y partes de objetos con cada uno de los mismos en la definición de la escena a fin de determinar qué superficies, como un todo, debemos designar como visibles. Es decir, compara cada una de las n caras con las restantes n-1 caras para eliminar caras o partes de éstas que no son visibles. Los algoritmos de despliegue de líneas, por lo general emplean métodos de objeto-espacio para identificar líneas visibles en despliegues de armazón, pero muchos algoritmos de superficie visible de imagen-espacio se pueden adaptar con facilidad para detectar líneas visibles. En un algoritmo de imagen-espacio, la visibilidad se decide punto por punto en cada posición de pixel en el plano de proyección. En éste enfoque se ven los objetos como una colección de n caras poligonales y decidir qué cara es visible en cada punto a desplegar. La mayor parte de los algoritmos de superficie visible utilizan métodos de imagen-espacio, aunque algunos métodos de objeto-espacio pueden servir para localizar con eficiencia superficies visibles en algunos casos. A pesar de que hay importantes diferencias en el planteamiento básico que se utiliza en los diversos algoritmos de detección de superficie visible, la mayoría de éstos usan métodos de clasificación y coherencia para mejorar el resultado. La clasificación sirve para hacer comparaciones de la profundidad al ordenar las superficies visibles en una escena de acuerdo con su distancia desde el plano de visión. Método de Línea de Rastreo (Scan Line) Este es un método de imagen-espacio que permite eliminar superficies ocultas, es una extensión del algoritmo de línea de rastreo para llenar interiores de polígonos (scan line poligon fill). En lugar de llenar sólo una superficie, ahora se rellenan múltiples superficies. A medida que se procesa cada línea de rastreo, se analizan todas las superficies de polígono que intersectan esa línea para determinar cuáles son visibles. A lo largo de cada línea de rastreo, se hacen los cálculos de profundidad para cada superficie que se traslapa a fin de determinar cuál está más cerca del plano de visión. Al determinar la superficie visible, se captura el valor de intensidad para esa posición en el buffer de enfriamiento. En el algoritmo de línea de rastreo para rellenar interiores de polígonos se usan coordenadas de pantalla sin pasar a enteros (números reales), el número de intersecciones de un scan con el polígono es par y sólo se barre desde coordenada Y mínima a la máxima de los vértices del polígono. Algoritmo (ej: polígono cualquiera A B C D E): i. Se ordenan aristas según la coordenada Y mínima de cada arista: Lista: AB, EA, CD, DE, BC ii. Se guarda un apuntador (p) a la primera arista que no corte a scan (ymin > scan) Inicialmente: pout = AB (la primera) iii. Para cada arista se almacena: i. coordenadas Y mínima y máxima: ymin , ymax ii. cambio (delta) en la coordenada X al cambiar a siguiente scan: dx iii. coordenada X de intersección con scan actual: xint iv. Se calculan los límites del barrido: smin = ceil( min( ymin ) ) smax = floor( max( ymax ) ) v. Para cada scan s (línea de barrido en pantalla): i. Miro aristas que dejan de cortar: Barro desde la primera hasta pout a. Si ymax < s, elimino la arista de la lista (ya no cortará a ningún otro scan) ii. Miro las aristas que pasan a cortar a scan: Barro desde pout hasta el final a. Si ymin <= s (corta a scan), pout se incrementa b. Se continúa hasta que deja de ser cierto (si una arista no corta, las siguientes de la lista tampoco) iii. Se actualizan las coordenadas de intersección de las aristas que cortan al scan: xint = xint + dx iv. Se ordenan las aristas que cortan al scan según su valor de xint v. Se pinta por parejas Desde (round() de) xint de primera arista hasta el de la segunda, de la tercera a la cuarta, etc. Cálculo de dx para la arista de (x1, y1) a (x2, y2) : dx x1 x 2 y1 y 2 Cálculo de xint inicial de una arista: 1. Scan previo a la arista: sinicial int (ymin) floor(ymin) 2. Si ymin sinicial , xint xymin - dx (ymin - sinicial) 3. Si ymin sinicial , xint xymin - dx 4. Recuérdese que la primera vez que la arista entra para ser pintada, xint es incrementado en dx Cálculo de distancias 1. Ecuación del plano de la cara i. Plano definido por tres puntos P1 P2 P3 ii. Normal al plano: N P1 P 2 P 2 P 3 iii. Un punto P pertenece al plano si y solo si: N P1 P 0 iv. Ecuación del plano Ax By Cz D 0 ( (A,B,C) es vector normal) A y1 z 2 z3 y2 z3 z1 y3 z1 z 2 B z1 x2 x3 z 2 x3 x1 z3 x1 x2 C x1 y2 y3 x2 y3 y1 x3 y1 y2 D x1 y2 z3 y3 z 2 x2 y3 z1 y1 z3 x3 y1 z 2 y2 z3 2. Obtención de coordenadas de punto en mundo real (tras prewarping) a partir de coordenadas de pantalla: i. Transformación de pantalla a NDC: 1 MaxX T SC NDC 0 0 0 R 0 MaxY R 1 0 ii. Transformación de NDC a mundo real: T NDC RW wR wL vR vL 0 wL v L wR wL vR vL iii. Se tiene entonces: x rw 0 wT wB vT v B wT wB wB v B vT v B 0 0 1 x sc wR wL w wL wL v L R MaxX v R v L vR vL R w wB w wB vB T y rw wB R y sc T MaxY vT v B vT v B 3. Obtención de pseudodistancia: coordenada Z del punto de la cara i. Primer punto del scan z x rw y rw A x rw B y rw D C ii. Al hacer barrido: xSC xSC 1 x SC x SC q , z zq q 1 wR wL MaxX v R v L A C iii. Sólo se calcula la primera z del scan; el resto, por incremento de una constante iv. Se puede hacer algo análogo al cambiar de scan, y calcular la z por incrementos (en x e y) Supongamos que se establecen las tablas para las diversas superficies, las cuales incluyen tanto una tabla de aristas como una tabla de polígonos: - La tabla de aristas va a contener los extremos de las coordenadas para cada línea de la escena, la pendiente inversa de cada línea y apuntadores en la tabla de polígono para identificar las superficies que se limitan por cada línea. - La tabla de polígonos contiene los coeficientes de la ecuación del plano para cada superficie, información de intensidad para las superficies y quizá, apuntadores a la tabla de aristas. Para facilitar la búsqueda de superficies que intersectan una línea de rastreo determinada, podemos establecer una lista activa de aristas con base en la información de la tabla de aristas. Esta lista activa contendrá sólo aristas que cruzan la línea de rastreo actual, clasificadas en orden creciente de x.. Además definimos una bandera para cada superficie que se establece como activa o inactiva para indicar si una posición a lo largo de una rastreo esta adentro o afuera de la superficie. Las líneas de rastreo se procesan de izquierda a derecha. En la frontera del extremo izquierdo de una superficie, se activa la bandera de la superficie, y en la frontera del extremo derecho, ésta se desactiva. B Yv E S2 A F Línea de rastreo 1 S1 Línea de rastreo 2 Línea de rastreo 3 H D C Figura 1 Líneas de rastreo que cruzan la proyección de dos superficies S1 y S2 en el plano de visión. Las líneas de rayas indican las fronteras de las superficies G Xv La figura 1 muestra el método de línea de rastreo (scan line) para localizar las porciones visibles de las superficies para las posiciones de pixel a lo largo de la línea. La lista activa para la línea de rastreo 1 contiene información de la tabla de aristas para las aristas AB, BC, EH y FG. Para las posiciones a lo largo de esta línea de rastreo entre las aristas AB y BC sólo se activa la bandera para la superficie S1. Por tanto, no se requieren cálculos de profundidad y la información de intensidad para la superficie S1 se captura a partir de la tabla de polígono en el buffer de enfriamiento. De modo similar, entre las aristas EH, y FG sólo se activa la bandera para a superficie S2. No hay más posiciones a lo largo de la línea de rastreo 1 que intersecten superficies, de manera que los valores de intensidad en la otras áreas se establecen como la intensidad del fondo. Se puede cargar la intensidad del fondo a través del buffer en una rutina de inicialización. Para las líneas de rastreo 2 y 3 en la figura 1, la lista de aristas activa contiene las aristas AD, EH, BC y FG. A lo largo de la línea de rastreo 2 de la arista AD a la arista AD a la arista EH, solo se activa la bandera para la superficie S1, pero entre las aristas EH y BC, se activan las banderas para ambas superficies. En este intervalo, se realizan los cálculos de profundidad al utilizar los coeficientes del plano para las dos superficies. Para este ejemplo, se supone que la profundidad de la superficie S1 es menor que la de S2, de modo que las intensidades para la superficie S1 se cargan en el buffer de enfriamiento hasta que se encuentra la frontera BC. Entonces, se desactiva la bandera para la superficie S1 y se almacenan las intensidades para la superficie S2 hasta que se pasa la arista FG. Podemos aprovechar la coherencia a lo largo de las líneas de rastreo conforme pasamos de una línea de rastreo a la siguiente. En la figura 1, la línea de rastreo 3 tiene la misma lista activa de aristas que la línea de rastreo 2. Dado que no han ocurrido cambio en las intersecciones de línea, una vez más son innecesarios los cálculos de profundidad entre las aristas EH, y BC. Las dos superficies deben tener la misma orientación que se determina en la línea de rastreo 2, de manera que se pueden capturar las intensidades para la superficie S1 sin cálculos adicionales. Línea de Línea de subdivisión subdivisión Línea de subdivisión (a) (b) Figura 2 Superficies que se intersectan y sobreponen en forma cíclica las cuales se oscurecen alternativamente entre sí (c) Es posible procesar cualquier número de superficies de polígono que se traslapan con este método. Las banderas de las superficies se establecen para indicar si una posición está adentro o afuera y se llevan a cabo los cálculos de profundidad cuando hay superficies que se superponen. Cuando se emplean estos métodos de coherencia, es necesario tener precaución para rastrear qué sección de la superficie es visible en cada línea de rastreo. Este planteamiento funciona sólo si las superficies no se intersectan o se traslapan en forma cíclica entre sí (figura 2)- si en una escena se tiene cualquier clase de superposición cíclica, podemos dividir las superficies para eliminar las superposiciones. Las líneas de rayas en esta figura indican dónde se podrían subdividir los planos para formar dos superficies distintas, de modo que se eliminen las superposiciones cíclicas. Método de Clasificación de Profundidad. Al utilizar tanto operaciones de imagen-espacio como de objeto-espacio, el método de clasificación de profundidad realiza las siguientes funciones básicas: 1. Las superficies se clasifican en orden de profundidad decreciente. 2. Las superficies se convierten por rastreo en orden, al indicar con la superficie que tiene una mayor profundidad. Las operaciones de clasificación se efectúan en imagen y en objeto-espacio, y la conversión de rastreo de las superficies de polígonos se lleva a cabo de imagen-espacio. Este método para solucionar el problema de las superficies ocultas también es conocido como Algoritmo del Pintor, puesto que en la creación de una pintura al óleo, un pintor primero pinta los colores del fondo, después se le agregan los objetos más distantes, luego los más próximos y así en forma sucesiva. Al final, se pintan los objetos en el plano frontal en el lienzo sobre el fondo y otros objetos que se han pintado en el lienzo. Cada capa de pintura cubre la capa anterior. Al utilizar un técnica similar, primero clasificamos las superficies de acuerdo con su distancia desde el plano en el que se ven. De esta manera se capturan en el buffer de enfriamiento los valores para la superficie cuya ubicación sea más lejana. Al almacenar cada superficie en orden decreciente de profundidad pintamos las intensidades de superficie en el buffer de estructura sobre las intensidades de las superficies que se procesaron antes. Zmax Zmin S Z’max Figura 3 Dos superficies sin sobreposición de profundidad S’ Z’min Xv Zv Las superficies de polígono se “pintan” en varios pasos en el buffer de estructura, dependiendo de la profundidad. Supongamos que vemos a lo largo de la dirección de las z, las superficies se ordenan en la primera trayectoria de acuerdo con el valor más alto de z en cada superficie. La superficie que tenga la mayor profundidad se compara entonces con las otras superficies en la lista para determinar si hay alguna superposición en la profundidad. Si no hay ninguna superposición en la profundidad, S se convierte por rastreo. La figura 3 ilustra dos superficies que se superponen en el plano de XY pero no tienen ningún traslape de profundidad. Así se repite este proceso para la siguiente superficie en la lista. En tanto que no haya superposición, se procesa cada superficie en orden de profundidad hasta que se hayan convertido todas por rastreo. Si se encuentra una superposición en la profundidad en cualquier punto de la lista, se debe comparar para determinar si se necesita reorganizar alguna de las superficies. S Xmin Figura 4 Dos superficies con superposición de profundidad pero sin traslape en la dirección de x S’ Xmax X’min X’max Xv Zv A continuación se muestran las pruebas que se le hacen a cada superficie que se traslapa con S. Si alguna de estas pruebas resulta verdadera, no es necesario reorganizar esa superficie. Las pruebas son las siguientes: 1. Los rectángulos limítrofes en el plano de xy para las dos superficies no se sobreponen 2. La superficie S está por completo detrás de la superficie que se sobrepone con respecto al punto de vista. 3. La superficie que se sobrepone está por completo enfrente de S con respecto al punto de vista. 4. Las proyecciones de las dos superficies en el plano de visión no se traslapan Se realizaron estas pruebas en el orden en que se mencionan y se procede a la siguiente superficie que se sobrepone cuando se observa que una de las pruebas es verdadera. Si todas las superficies que se trasladan pasan por lo menos una de estas pruebas, ninguna de ellas está detrás de S. Así no es necesario efectuar ninguna reorganización y se convierte por rastreo S. La prueba 1 se lleva a cabo en dos partes. Primero se verifica la sobreposición en la dirección de x y luego verificamos la sobreposición en la dirección de y. Si alguna de estas direcciones no presenta sobreposición, los dos planos no pueden oscurecerse entre si. En la figura 4 se presenta un ejemplo en el que dos superficies que se sobreponen en la dirección de z pero no en la dirección de x. S Figura 5 La superficie S se halla por completo atrás de (“adentro de”) la superficie S’ S S’ S’ Xv Figura 6 La superficie sobrepuesta S’ está por completo en frente de (“afuera de”) la superficie S, pero no está por completo atrás de S’ Xv Zv Zv Podemos practicar las pruebas 2 y 3 con una prueba de polígono “interna y externa”. Es decir, sustituimos las coordenadas para todos los vértices de S en la ecuación del plano para la superficie que se traslapa y verificamos el signo del resultado. Si las ecuaciones del plano se establecen de manera que el exterior de la superficie se dirija hacia el punto de vista, entonces S está detrás de S’ si todos los vértices de S están “adentro” de S’ (figura 5). De modo similar S’ está por completo en frente de S si todos los vértices de S están “afuera” de S’. La figura 6 ilustra una superficie S’ que se traslapa, la cual está por completo en frente de S, pero la superficie S no esta por completa “adentro” de S’ (la prueba 2 no es verdadera). Si las pruebas 1 a 3 no tienen éxito, intentamos con la prueba 4 al verificar las intersecciones entre las aristas limítrofes de las dos superficies utilizando las ecuaciones de líneas en el plano de xy. Como se demuestra en la figura 9 dos superficies pueden intersectarse o no incluso si sus extensiones de coordenadas se traslapan en las direcciones de “x”, “y”, y “z”. S’ S S Figura 7 La superficie S tiene mayor profundidad pero oscurece la superficie S’ S’’ S’ Xv Figura 8 Tres superficies que intervienen en la lista de superficies clasificada en el orden S, S’, S’’, se deben reordenar como S’ S’’, S. Zv Zv Figura 9 Dos superficies con rectángulos limítrofes que se sobre ponen en el plano de XY (a) (b) Si las cuatro pruebas fracasan con una superficie de sobreposición particular S’ intercambiamos S y S’ en la lista clasificada. En la figura 7 se presenta un ejemplo de dos superficie que se deben reorganizar con este procedimiento. En este punto aun no sabemos con certeza que hemos encontrado la superficie más alejada del plano de visión. La figura 8 ilustra una situación en que primero intercambiaríamos S y S’’. Dado que S’’ oscurece parte de S’, necesitamos intercambiar S’’ y S’ para obtener las 3 superficies en el orden de profundidad correcto. Por tanto , es necesario repetir el proceso de prueba para cada superficie que se reorganiza en la lista. Es posible que el algoritmo que se acaba de trazar se establezca en un ciclo infinito si dos o mas superficies que se oscurecen en forma alterativa entre sí, como en la figura 2. En tales situaciones, el algoritmo se alternaría de manera continua las posiciones que se sobreponen. A fin de evitar esos ciclos, podemos establecer una bandera en cualquier superficie que se haya reorganizado en una posición más distante de modo que no se pueda volver a mover. Si se intenta alternar la superficie por segunda ocasión se divide en dos partes para eliminar la sobreposición cíclica. De esta manera se sustituye la superficie original por las dos superficies nuevas y se continúa el proceso como antes. A continuación se presenta en detalle el Algoritmo del Pintor: 1. Preproceso semejante al del algoritmo de profundidad (Z-buffer): i. matrices de transformación ii. back face iii. clipping iv. prewarping 2. Para cada cara se mantiene la siguiente información: i. z min , z max , xmin , xmax , ymin , ymax ii. ecuación de su plano: Ax By Cz D 0 , (A,B,C) normal hacia afuera (estándar) 3. Lista ordenada de caras según su |z|max: la primera es la que está a mayor distancia (más atrás) 4. Barrido de lista de caras: i. Se extrae primera de la lista, S ii. Se compara con el resto de las caras, S' a. Se comprueba si se cumple alguna de las siguientes condiciones: I. No hay superposición en Z (y |z|max de S es menor que |z'|max de S') II. No hay superposición en x III. No hay superposición en y IV. S está detrás del plano de S' ( A' x B' y C ' z D' 0 para los vértices de S) V. S' está delante del plano de S ( Ax By Cz D 0 para los vértices de S'). VI. No hay superposición en plano xy . b. Si se cumple alguna condición: I. Si S' no es la última cara de la lista, se continúa con la siguiente. II. Si S' es la última: (1) Transformar la cara a coordenadas de pantalla (si no se ha hecho ya). (2) Pintar. (3) Eliminar de la lista. c. Si todas fallan y S no se había intercambiado previamente: I. Se intercambian S y S' en la lista. II. Se marca S' como intercambiada. III. Se reinicia barrido (se compara S' con todas las caras de la lista). d. Si todas fallan y S ya se había intercambiado previamente: I. Se divide S en dos caras, por la línea de intersección de los planos de S y S': (1) Nueva cara con mayor |z|max se pone la primera . (2) La otra nueva cara se pone a continuación de S'. II. Se continúa con el barrido (se compara primero de los trozos de S con caras pendientes de comprobar, a partir de segundo trozo) . Observemos que: 1. Las comprobaciones de superposición en x, y ó z se realizan usando minimax (comparaciones de mínimos y máximos) . 2. La comprobación de superposición en plano xy es más compleja de calcular Comprobación de todas las aristas con todas las aristas . P1P2 es arista de una cara y P'1P'2 de la otra. 1 t P1 t P2 1 s P'1 s P'2 . Si 0 < s < 1 y 0 < t < 1, las aristas se cortan y hay superposición . 3. Al dividir una cara en dos nuevas caras, hay que tener cuidado en asignar correctamente el orden de los vértices. Método de Buffer con Profundidad Uno de los planteamientos de imagen-espacio que se utiliza para detectar superficies visibles es el método de buffer con profundidad, que compara las profundidades de las superficies en cada posición de pixel en el plano de proyección. Este procedimiento se conoce también corno método de buffer z, ya que por lo regular, la profundidad del objeto se mide desde el plano de visión a lo largo del eje de las z de un sistema de vista. Cada superficie de una escena se procesa por separado, un punto a al vez a lo largo de la superficie. Por lo general, el método se aplica en escenas que sólo contienen superficies de polígono porque los valores de profundidad se pueden calcular con gran rapidez y es fácil implementar el método. No obstante, el método se puede aplicar a superficies no planas. Yv S3 Figura 10 En la posición del plano de visión (x,y) la superficie S1, tiene la profundidad menor desde el plano de visión y de este modo es visible en esta posición (x,y) S2 Xv S1 Zv Cuando se convierten las descripciones de los objetos a coordenadas de proyección, cada posición (x, y, z) en una superficie de polígono corresponde al punto de proyección ortogonal (x, y) en el plano de visión. Por tanto, para cada posición de pixel (x, y) en el plano de visión, se pueden comparar las profundidades del objeto al comparar los valores de z. La figura 10 ilustra tres superficies a diferentes distancias a lo largo de la línea de proyección ortogonal desde la posición (x, y) en un plano de visión que se considera como el plano xo, yo. La superficie S1 esta más próxima a esta posición, de modo que se guarda su valor de intensidad de superficie en (x, y). Podemos implementar el algoritmo de buffer con profundidad en coordenadas normalizadas, de manera que los valores de z van de 0 en el plano de recorte posterior a zmax, en el plano de recorte frontal. Se puede establecer el valor de zmax, sea como 1 (para un cubo unitario)o como el valor mas alto que sea posible almacenar en el sistema. Como lo implica el nombre de este método, se requieren dos áreas de buffer. Se utiliza un buffer con profundidad para almacenar los valores de profundidad para cada posición de (x, y), conforme se procesan las superficies y el buffer de enfriamiento almacena los valores de intensidad para cada posición. Al principio, todas las posiciones en el buffer con profundidad se establecen como 0 (profundidad mínima) y se inicializa el buffer de enfriamiento a la intensidad del fondo. De este modo se procesa cada superficie que se lista en las tablas de polígonos una línea a la vez, al calcular la profundidad (valor de Z) en cada posición de pixel (x, y). La profundidad calculada se compara con el valor almacenado en forma previa en el buffer con profundidad en esa posición. Si la profundidad que se calcula es mayor que el valor que se almacena en el buffer con profundidad, se almacena el nuevo valor, y se determina la intensidad de la superficie en esa posición y se sitúa en la misma posición de xy en el buffer de enfriamiento. Resumimos en palabras los pasos del algoritmo de buffer con profundidad como sigue: 1. Se inicializan el buffer con profundidad y el buffer de enfriamiento de modo que para todas las posiciones de buffer (x, y), profundidad (x, y) = 0, enfriamiento (z, y) = I backgnd 2. Para cada posición en cada superficie de polígono, se comparan los valores de profundidad con los valores almacenados previamente en el buffer con profundidad para determinar la visibilidad. Se calcula la profundidad de z para cada posición de (x, y) en el polígono. Si z> profundidad (x, y)' entonces se establece profundidad (x, y) = z enfriamiento (x, y) = Isurf (x, y) donde I backgnd es el valor para la intensidad del fondo y Isurf (x, y) es el valor de intensidad proyectada para la superficie en la posición de pixel (x, y). Una vez que se procesan todas las superficies, el buffer con profundidad contiene valores de profundidad para las superficies visibles y el buffer de enfriamiento los valores de intensidad correspondientes para esas superficies. Eje de las y Figura 11 A partir de la posición (x,y) en una línea de rastreo, la posición siguiente a lo largo de la línea tiene las coordenadas (x+1, y) y la posición inferior inmediata en la siguiente línea tiene las coordenadas (x, y-1) x x+1 Eje de las x Los valores de profundidad para una posición de superficie (x, y) se calculan a partir de la ecuación del plano para cada superficie: z ( Ax By D) C (ec. 1) Para cada línea de rastreo (figura 11), las posiciones horizontales adyacentes a lo largo de la línea difieren por 1 un valor de la vertical de “y” en una línea de rastreo adyacente difiere por 1. Si se determinó como z la profundidad en la posición de (x, y), entonces la profundidad de z' de la posición siguiente (x + 1,y) a lo largo la líneas de rastreo se obtiene con base en la ecuación (ec. 1) como z' ( Ax 1 By D) C (ec. 2) o z' z A C (ec. 3) La razón A/C es constante para cada superficie, de modo que los valores de profundidad subsecuente a lo largo de una fines de rastreo se obtienen a partir de los valores previos con una sola adición. línea de rastreo superior línea de rastreo Y Intersección de la arista izquierda Figura 12. Líneas de rastreo que intersectan una superficie de polígono línea de inferior En cada línea de rastreo, iniciamos por calcular la profundidad en una arista izquierda del polígono que intersecta esa línea de rastreo (figura 12). De esta manera se calculan por medio de la ecuación (ec. 3) todos los valores de profundidad en cada posición sucesiva a lo largo de la fines de rastreo. línea de rastreo Y línea de rastreo Y + 1 x Figura 13. Posiciones de intersección en líneas de rastreo sucesivas a lo largo de una arista izquierda del polígono x’ Como se puede apreciar en la figura 12, primero determinamos la extensión de la coordenada de “y” de cada polígono y procesamos la superficie desde la línea de rastreo superior hasta la línea de rastreo inferior. Al iniciar en un vértice superior, podemos calcular en forma recursiva las posiciones de z por debajo de una arista izquierda del polígono como x' = x – 1/m donde m es la pendiente de la arista (figura 13). Los valores de profundidad por debajo de la arista se obtienen entonces de manera recursiva como z' z A m B C (ec. 4) Si procesamos por debajo de una arista vertical, la pendiente es infinita y los cálculo recursivos se reducen a z' z B . C Un planteamiento alternativo consiste en utilizar un método del punto medio o un algoritmo del tipo de Bresenham para determinar los valores de “x” en las aristas izquierdas para cada línea de rastreo. Asimismo, es posible aplicar el método en superficies curvas al determinar los valores de profundidad e intensidad en cada punto de proyección de la superficie. Para superficies de polígono, es muy sencillo implementar el método de buffer con profundidad y no requiere clasificar las superficies en una escena. Pero requiere la disponibilidad de un segundo buffer además del buffer de enfriamiento. Un sistema con una resolución de 1.024 por 1.024, por ejemplo, requeriría más de un millón de posiciones en el buffer de profundidad con cada posición con los bits suficientes para representar el número necesario de incrementos de profundidad. Una manera de reducir los requerimientos de almacenamiento es procesar una sección de la escena a la vez, al utilizar un buffer con profundidad mas pequeño. Después de procesar cada sección de vista, se vuelve a emplear el buffer para la siguiente sección. A continuación se presenta una descripción detallada del Algoritmo de Z-Buffer: 1. Hallar el Sistema de Coordenadas del Plano de Proyección (SCPP) y la matriz de prewarping (Pw) 2. Hallar las transformaciones del mundo real a la pantalla: RW->NDC->SC 3. Eliminar las caras posteriores (back face) 4. Hacer clipping 3D 5. Hacer prewarping (si no se hizo en los dos pasos anteriores) 6. Inicializar los buffers: i. Z-buffer: valor máximo (infinito) ii. Color buffer: color de fondo 7. Barrer (bucle) las caras (polígonos) de los objetos; para cada cara: i. Pasar a la pantalla los vértices del polígono ii. Barrer el polígono en la pantalla (scan line polygon fill); para cada píxel: a. Calcular la (pseudo)distancia del punto de la cara correspondiente a dicho píxel al plano de proyección (plano XY) b. Si la distancia es mayor que la almacenada en Z-buffer, no se pinta c. Si la distancia es menor, se pinta (se cambia color buffer) y se actualiza distancia del píxel en Z-buffer con esta distancia Remoción de Caras Ocultas El algoritmo a utilizar para eliminar las caras ocultas (back face culling) permite: 1. Determinar las caras de un objeto que están detrás y no son visibles i. Cada cara se define un plano que divide el espacio en dos semiespacios, uno 'in' y otro 'out' . ii. El subespacio 'in' es aquél en el que se encuentra el objeto (al menos la parte del objeto que tiene a esta cara por frontera con el exterior) . iii. La cara está detrás respecto de un centro de proyección CP si el CP está en el semiespacio 'in' (el objeto tapa a la cara) . iv. La cara está delante respecto del CP si éste se encuentra en el semiespacio 'out' . 2. Como prefiltro para resto de algoritmos de superficies ocultas: descarta caras que seguro que no son visibles (culling) i. Si back face indica que una cara está detrás, la cara no es visible . ii. Si back face indica que una cara está delante, puede que esté oculta si el objeto no es convexo o si tiene otro objeto delante. 3. Poco costoso . Algoritmo back face (para coordenadas de mano izquierda): 1. Calcular la normal N a cada cara que apunta hacia afuera del objeto (hacia el semiespacio 'out'). 2. Estudiar signo del coseno del ángulo entre la normal a la cara y la dirección de proyección DP (va del objeto hacia el centro de proyección): i. Si es < 0, la cara está delante y no se descarta (puede que sea visible) (el centro de proyección y N están en el mismo semiespacio: el 'out') ii. Si es > 0, la cara está detrás y se descarta (no visible) (el centro de proyección está en semiespacio 'in' y N está en semiespacio 'out') . iii. Si es = 0, la cara está de canto y se descarta (si es visible, se reducirá a una arista que de todas maneras aparecerá al proyectar una cara vecina) . Cálculo de la normal 2. En 2D 1. Se ordenan vértices en dirección antihoraria 2. Normal a una arista se calcula como producto vectorial de vector de la arista con vector unitario de eje OZ 3. Ejemplo: Si tenemos un polígono de vértices A B C D (sentido antihorario), la normal a la arista AB es: i N AB k x B x A 0 j k y B y A 0 y B y A ,x B x A,0 0 1 3. En 3D 1. Se ordenan vértices de cada cara en sentido antihorario vistos desde fuera del objeto 2. Normal a la cara es el poducto vectorial de dos aristas consecutivas 3. Ejemplo: Si una de las caras del objeto tiene los vértices A B C (en sentido antihorario vistos desde fuera del objeto), la normal a la cara ABC es, por ejemplo: i N AB BC x B x A xC x B j k yB y A zB z A yC y B z C z B Cálculo del signo del coseno del ángulo entre la normal y la dirección de proyección 1. Basta estudiar el signo del producto escalar : N DP N x DP`x N y DP y N z DPz N DP cos 2. Obtención de la dirección de proyección DP a usar: 1. El vector DP va del objeto hacia el centro de proyección 2. Si el centro de proyección CP = (Cx,Cy,Cz,0) es un punto impropio, coincide con CP DP (Cx,Cy,Cz) 3. Si el centro de proyección CP = (Cx,Cy,Cz,Cw) es un punto propio (Cw no es cero), DP es el vector que va de uno de los vértices de la cara (p.ej., el punto Cy Cz Cx A) al centro de proyección: DP xA, yA, zA Cw Cw Cw Las limitaciones que éste algoritmo presenta son: 1. Sólo puede ser utilizado en objetos sólidos modelados como mallas de polígonos. Ésta es la forma más general de modelado para sistemas gráficos de línea de rastreo. Incluso si los objetos son definidos de una manera diferente (parches cúbicos paramétricos o ecuaciones implícitas) el generador de gráficos lo convertirá todo a polígonos. 2. Trabaja bien para poliedros convexos pero no necesariamente para poliedros cóncavos como el que se muestra en la Figura 14 cuyas superficies parcialmente ocultas que no serán eliminadas por el algoritmo de remoción de caras ocultas. Figura 14. Vista de un poliedro cóncavo con una cara oculta en parte por las otras caras. CONCLUSIONES Entre los métodos más comunes para detectar superficies visibles en una escena tridimensional están: Scan-line (Método de Línea de Rastreo), Algoritmo del Pintor y Zbuffer (Método de Buffer con Profundidad). Estos algoritmos forman parte de la generación de despliegues de gráficas realistas (rendering). No es tarea fácil el hecho de decidir el método adecuado para una aplicación ya que cada uno presenta una serie de particularidades que pueden o no ofrecer un sin fin de ventajas. Para el Método de Línea de Rastreo (Scan Line) son necesarios dos buffers (profundidad y enfriamiento) pero en la mayoría de los casos la información de la siguiente línea de rastreo puede obtenerse a partir de la anterior debido a la coherencia a lo largo de las líneas de rastreo. Es posible procesar cualquier número de superficies de polígono que se traslapan con este método, siempre y cuando no se intersectan o se traslapan en forma cíclica entre sí, en este caso se dividen las superficies para eliminar las superposiciones. Para el Método de Clasificación de Profundidad (Algoritmo del Pintor) cada capa de pintura cubre la capa anterior alternando de ser necesario pero es posible que el algoritmo se establezca en un ciclo infinito si dos o más superficies que se oscurecen (superponen) en forma alterativa entre sí. En este caso la superficie se marca para no ser alternada nuevamente, pero incluso así puede darse el caso, por lo que análogamente las superficies se subdividen para eliminar las superposiciones y tratar cada división como una superficie más. Para el Método de Buffer con Profundidad (Z-buffer) puede darse al caso de pintar varias veces un pixel lo que implica altos costos para determinar su color e incluso para superficies de polígono, es muy sencillo implementar el método y no requiere clasificar las superficies en una escena. Pero requiere la disponibilidad de un segundo buffer además del buffer de enfriamiento (similar a Scan Line). BIBLIOGRAFIA Foley, Van Dam, Feiner, and Hughes.Introduction to Computer Graphics. Addison-Wesley 1989. Hearn, Donald y Baker, M.Pauline. Gráficas por computadora.. 2da Edición. Editorial Prentice- Hall. México.1995. Pascual,Pedro. Apuntes de Gráficos. Representación tridimensional. Escuela Técnica Superior de Informática.Universidad Autónoma de Madrid. http://www.ii.uam.es/~pedro/graficos/teoria/index.html Owen, Scott. Determination of Visible Surfaces. http://www.education.siggraph.org/materials/HyperGraph/scanline/visibility/bac kface.htm