(Método de Línea de Rastreo), Algoritmo del Pintor y Z-buffer

Anuncio
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  zq
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' 
( Ax  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
Descargar