0 . 0 ) . Como alternativa, podríamos escribir las ecuaciones paramétricas utilizando coordenadas esféricas estándar, en las que el ángulo t¡> se especifica como eolatitud (Figura 8.3). Entonces, 0 se define dentro del rango 0 < 0 < n y 6 se toma a menudo en el rango 0 < 6 < 2/r. Podríamos también establecer la representación utilizando parámetros uy v definidos sobre el rango que varía entre 0 y I, haciendo las sustituciones 0. I lay varios casos especiales que es necesario considerar en la implcmentación de la función angular de atenuación. No existirá atenuación angular si la fuente luminosa no es direccional (es decir, si no es un foco). Asimismo, ningún objeto será iluminado por la fuente luminosa si está situado fuera del cono del foco. Para determinar el factor de atenuación angular a lo largo de una línea que vaya desde la posición de la fuente hasta una posición de una superficie en una escena, podemos calcular el coseno del ángulo de dirección con respecto al eje del cono utilizando el producto escalar de la Ecuación 10.3. Si llamamos V al vector unitario que indica la dirección de la fuente luminosa (a lo largo del eje del cono) y V' j al vector unitario correspondiente a la linea que une la fuente luminosa con la posición de un objeto y si suponemos que 0"
gÉRr--* if
q
"
ír <
/
{ Pí
*ul)
returnValue else
if
(r
<
-
false;
*u2>
*u2 = r ;
else /*
Luego p
if
íq < /*
=
0
línea
returnValue
void
l í n e a es p a r a l e l a al
está •
recorte.
*/
fuera del
l í m i t e de
recorte.
*/
false;
lineClipLiangBarsk
ul
»
íclipTest if
l í m i t e de
(returnValue);
GLfloat if
la
0.0)
La
return
y
0.0
u2
(
{-dx,
(clipTest
(clipTest if
-
1.0,
pl.getx
(dx,
dy = p 2 . g e t y if
(wcPt2D winMin,
dx = p 2 . g e t x (
)
-
winMax.getx (
)
-
pl.getx
winMin.getx
(
),
(
)
pl.gety
(dy,
i f (u2 < 1 . 0 )
{ {
- pl.getx
{
(
&ul, )
(
),
dy;
&u2))
&ul,
(
wcPt2D p2)
&u2))
{
); )
-
winMax.gety
p2. setCoords
(
wcPt2D p l ,
)
- pl.gety
í-dy,
(clipTest
wcPt2D winMax,
winMin.gety (
)
(
- pl.gety
), (
&ul, ),
&u2))
&ul,
&u2))
{
|g2§| (pl.getx
(
í
+ u2
*
dx,
pl.gety
(
)
(
)
+ ul
* dx,
pl.gety
<
)
+ u2 * dy) ;
if
(ul
> 0.0)
{
pl.setCoords
(pl.getx
+ ul * dy);
lineBres
(round
(pl.getx
round
(
(p2.getx
)), (
round )),
(pl.gety
round
(
)
(p2.gety
(
Por lo general, el algoritmo de recorte de lineas de Liang-Barsky es más eficiente que el de CohenSuthcrland. Cada actualización de los parámetros w, y */ requiere sólo una división; y las intersecciones de la línea con la ventana se calculan sólo una vez, cuando se han calculado los valores finales de y //->. Sin embargo, el algoritmo de Cohén y Sutherland puede calcular repetidamente las intersecciones a lo largo de la trayectoria de la línea, aun cuando la linea se encuentre totalmente fuera de la ventana de recorte. Y cada cálculo de intersección de Cohen-Sulherland requiere tanto una división como una multiplicación. El algoritmo bidimensional de Liang-Barsky se puede ampliar para recortar líneas tridimensionales (véase el Capítulo 7 ) . 2
6.7 Recorte tic líneas bidime fisiónales 333
Recorte de líneas de Nicholl-Lee-Nicholl Mediante la creación de más regiones alrededor de la ventana de recorte, el algoritmo de Nicholl-Lee-Nicholl (NLN) evita los múltiples cálculos de las intersecciones de la línea. En el método de Cohcn-Sutherland, por ejemplo, se podían calcular múltiples intersecciones a lo largo de la trayectoria de un segmento de línea antes de localizar una intersección en el rectángulo de recorte o de rechazar completamente la línea. Estos cálculos adicionales de intersecciones se eliminan en el algoritmo NLN mediante una mayor comprobación de regiones antes de calcular las intersecciones. Comparado tanto con el algoritmo de Cohen-Sutherland como con el de Liang-Barsky, el algoritmo de Nicholl-Lee-Nicholl realiza menos comparaciones y divisiones. La desventaja del algoritmo NLN es que sólo se puede aplicar al recorte bidimensional, mientras que tanto el algoritmo de Liang-Barsky como el de Cohcn-Sutherland se pueden ampliar fácilmente a escenas tridimensionales. La comprobación inicial para determinar si un segmento de línea está completamente dentro de la ventana de recorte o fuera se puede realizar con comprobaciones de códigos de región, como en los dos algoritmos previos. Si no es posible una aceptación o un rechazo triviales, el algoritmo NLN procede a establecer regiones de recorte adicionales. Para una línea con puntos extremos P„ y P,- , primero determinamos la posición del punto P respecto a las nueve posibles regiones relativas a la ventana de recorte. Sólo se necesita considerar las tres regiones que se muestran en la Figura 6.16. Si P se encuentra en cualquiera de las otras seis regiones, podemos moverlo a una de las tres regiones de la Figura 6.16 mediante una transformación de simetría. Por ejemplo, se puede transformar la región situada directamente encima de la ventana de recorte en la región situada a la izquierda de la ventana utilizando una reflexión respecto de la línea y = - x , o podríamos utilizar una rotación de 90° en sentido contrario al movimiento de las agujas del reloj. Asumiendo que P y P no están ambos dentro de la ventana de recorte, a continuación determinamos la posición de P,- respecto de P . Para ello, creamos algunas regiones nuevas en el plano, dependiendo de la posición de P . Los límites de las nuevas regiones son los segmentos de línea semi-infmitos que comienzan en P y pasan a través de las esquinas de la ventana de recorte. Si P se encuentra dentro de la ventana de recorte, establecemos las cuatro regiones que se muestran en la Figura 6.17. Después, dependiendo de cuál de estas cuatro regiones (L, T, R, o B) contenga P,- , calculamos la intersección de la línea con el límite correspondiente de la ventana. Si P se encuentra en la región situada a la izquierda de la ventana, establecemos las cuatro regiones etiquetadas como L, LT, LR y LB en la Figura 6.18. Estas cuatro regiones de nuevo determinan una única arista de la ventana de recorte para el segmento de línea, relativa a la posición de P,- . Por ejemplo, si P,- está en una de las tres regiones etiquetadas como L, recortamos la línea del límite izquierdo de la ventana y guardamos el segmento de linca desde esta intersección a P,- . Si P está en la región LT, salvarnos el segmento desde el límite izquierdo de la ventana hasta el límite superior. Un procesamiento similar se lleva a cabo en las regiones LR y LB. Pero si P,- no está en ninguna de las cuatro regiones L, LT, LR o LB, se recorta la linea completa. n
0
()
0
|n
(in
0
0
0
0
in
(]
n
|n
n
|ln
m
P„ dentro ile lu ventana de recorte ta)
P„ en una región de borde
P en un región de esquina
(b)
(c)
n
FIGURA 6.16. fres posibles posiciones de un punto extremo de una línea P„ en el algoritmo de recorte de líneas N L N .
334
CAPÍTULO 6
Visualizaáón bidimensional
FIGURA 6.17. Las cuatro regiones utilizadas en el algoritmo NI.N cuando P está dentro de la ventana de recorte y P está fuera.
FIGURA 6.18. I .as cuatro regiones de recorte utilizadas en el algoritmo NI.N cuando P está directamente a la izquierda de la ventana de recorte.
()
()
fi
IR
oí
IR LR LB
(a)
(b)
FIGURA 6.19. Los dos posibles conjuntos de regiones de recorte utilizados en el algoritmo NLN cuando P está encima y a la izquierda de la ventana de recorte. 0
En el tercer caso, cuando P está a la izquierda y encima de la ventana de recorte, utilizamos las regiones de la Figura 6.19. En este caso, tenemos las dos posibilidades mostradas, dependiendo de la posición de P con respecto a la esquina superior izquierda de la ventana de recorte. Cuando P está cerca del límite izquierdo de recorte de la ventana, utilizamos las regiones del apartado (a) de esta figura. De lo contrario, cuando P está cerca del límite superior de recorte de la ventana, utilizamos las regiones del apartado (b). Si P está en una cié las regiones T, L, TR, TB, LR, o LB. esto determina un único borde de la ventana de recorte para los cálculos de intersección. De lo contrario, la línea entera se rechaza. ()
0
(¡
0
f í n
Para determinar la región en la que se encuentra P, , comparamos la pendiente del segmento de línea con las pendientes de los limites de las regiones del algoritmo NLN. Por ejemplo, si P está a la izquierda de la ventana de recorte (Figura 6.18), entonces P está en la región LT si. 1n
0
f | n
pendientep,P
/w
< pendienteP P 0
lhl
< pendienleP P 0
(6.21)
6.7 Recorte de líneas bidimensionates
X
K
%
%
X
X
t.
%
335
\)
Y recortamos la línea entera si, | % --V ) (x 0
f i n
-
x ) < (x - x ) (v n n - y ) Q
L
0
(6.23)
()
Los cálculos de diferencias de coordenadas y los cálculos de productos utilizados en los tests de las pendientes se almacenan y se utilizan también en los cálculos de las intersecciones. A partir de las ecuaciones paramétricas:
y
=
^ o
+
O n-.Vf> f i
calculamos la coordenada x de la intersección con el límite izquierdo de la ventana como x = x¡, por lo que w = (x - - % y t * | %) y la coordenada y de la intersección es: L
cm
y
^ y
n
h ^
+ X
\"\\\
{
X
L
-
X
u
)
(6
_2
4)
X
Í)
Y para una intersección con el límite superior tenemos y =y^ y u = (y-y -yr}V()>r -y^ P°r lo que la coordenada x vale: m
x = x ^^^(y, - _ y ) lt
(6.25)
a
Recorte de líneas con ventanas de recorte poligonales no rectangulares En algunas aplicaciones, se puede desear recortar líneas con polígonos de forma arbitraria. Los métodos basados en las ecuaciones paramétricas de la línea, tales como el algoritmo de Cyrus-Beck o el de Liang-Barsky, se pueden ampliar fácilmente para recortar líneas con ventanas poligonales convexas. Hacemos esto modificando el algoritmo para que incluya las ecuaciones paramétricas de los límites de la región de recorte. La visualización preliminar de los segmentos de línea se puede realizar procesando las líneas frente a las extensiones de coordenadas del polígono de recorte. En el caso de las regiones de recorte poligonales cóncavas, todavía podríamos aplicar estos procedimientos de recorte paramétricos si primero dividimos el polígono cóncavo en un conjunto de polígonos convexos utilizando uno de los métodos descritos en la Sección 3.15. Otra técnica consiste simplemente en añadir una o más aristas adicionales al área de recorte cóncava para que se transforme en un polígono convexo. Entonces se puede aplicar una serie de operaciones de recorte utilizando las componentes del polígono convexo modificado, como se muestra en la Eigura 6.20. El segmento de línea P, P del apartado (a) de esta figura hay que recortarlo con la ventana cóncava de vér2
tices Vi, V , V , V y V . En este caso, se obtienen dos regiones de recorte convexas, añadiendo un segmen2
3
4
5
to de línea de V a V,. Después se recorta la línea en dos pasos: (1) se recorta la línea P, P con el polígono 4
2
convexo de vértices V V,, V y V para producir el segmento recortado P,' P ' (véase la Eigura 6.20(b)). (2) p
3
4
2
Se recorta el segmento de línea interno P,' P' utilizando el polígono convexo de vértices V,, V y V (Figura 5
4
6.20(c)) para producir el segmento de línea recortado final P, P,' .
Recorte de líneas utilizando ventanas de recorte con límites no lineales Los círculos u otras regiones de recorte con límites curvados también son posibles, pero requieren más procesamiento, ya que los cálculos de intersección implican ecuaciones no lineales. En el primer paso, las líneas
336
CAPÍTULO 6
Vkualiziuión bidimensional Y ^^-\
Ventana tic recorte en forma de polígono cóncavo
\
*%&
/" __ — — "*
v," (a)
V
y "
Recorte descámenlo' de linea exieriores
Kecorle de segmento de línea interior (c)
FIGURA 6.20. Una ventana de recorte con forma de polígono cóncavo (a) definida por los vértices V,, V , V , V y V se modifica para obtener el polígono convexo (b) definido por los vértices V,, V^, V y V . Los segmentos externos de la línea P, P, se descartan usando esta ventana de recorte convexa. El segmento de línea resultante, p, p, se procesa después de acuerdo con el triángulo (V,, V«¡, V ) (c) para recortar el segmento de línea interno P, P, y generar la línea recortada final P, P, . 2
3
3
4
5
4
4
se recortarían con el rectángulo limitador (extensiones de coordenadas) de la región de recorte curvada. Se eliminan las líneas que se encuentran fuera de las extensiones de las coordenadas. Para identificar las líneas que están dentro de un círculo, por ejemplo, podríamos calcular la distancia de los puntos extremos de la línea al centro del círculo. Si el cuadrado de esta distancia para ambos puntos extremos de una línea es menor o igual que el radio al cuadrado, podemos guardar la línea completa. Las lineas restantes se procesan después mediante cálculos de intersección, que deben ser la solución simultánea de las ecuaciones de la línea y del círculo.
6.8 RECORTE DE ÁREAS DE RELLENO POLIGONALES Los paquetes gráficos habitualmente sólo permiten áreas de relleno que sean polígonos y, a menudo, sólo polígonos convexos. Para recortar un área de relleno poligonal, no podemos aplicar directamente un método de
6.8 Recorte de áreas de relleno poligonales
337
recorte de líneas a las aristas individuales del polígono porque esta técnica no produciría, por lo general, una polilínea cerrada. En lugar de eso, un recortador de líneas produciría a menudo un conjunto disjunto de líneas con información incompleta, acerca de cómo podríamos formar un límite cerrado alrededor del área de relleno recortada. La Figura 6.21 muestra una posible salida de un procedimiento de recorte de lincas aplicado a las aristas de un área de relleno poligonal. Lo que necesitamos es un procedimiento que produzca una o más polilíneas cerradas como límites del área de relleno recortada, con el fin de que los polígonos se puedan convertir por exploración para rellenar los interiores con el color o patrón asignado, como en la Figura 6.22. Podemos procesar un área de relleno poligonal de acuerdo con los bordes de una ventana de recorte, utilizando la misma técnica general del recorte de líneas. Un segmento de línea se define mediante sus dos puntos extremos, y estos puntos extremos se procesan mediante un procedimiento de recorte de líneas, construyendo un nuevo conjunto de puntos extremos recortados en cada borde de la ventana de recorte. De forma similar, necesitamos mantener un área de relleno como una entidad a medida que ella se procesa a través de las etapas de recorte. Por tanto, podemos recortar un área de relleno poligonal determinando la nueva forma del polígono a medida que se procesa cada arista de la ventana de recorte, como se muestra en la Figura 6.23. Por supuesto, el relleno interior del polígono no se aplicará hasta que se haya determinado el borde de recorte final. Al igual que comprobamos un segmento de línea para determinar si se puede guardar completamente o recortar completamente, podemos hacer lo mismo con un área de relleno poligonal comprobando las extensiones de sus coordenadas. Si los valores máximo y mínimo de las coordenadas del área de relleno están dentro de los cuatro límites de recorte, el área de relleno se almacena para un posterior procesamiento. Si estas extensiones de coordenadas están todas fuera de cualquiera de los límites de la ventana de recorte, eliminamos el polígono de la descripción de la escena (Figura 6.24).
l
Antes del recorte
Después del recorte
(a)
(b>
Antes del recorte
Después del recorte
ib)
FIGURA 6.21. Un algoritmo de recorte de líneas aplicado a los segmentos de línea del límite poligonal de (a) genera el
FIGURA 6.22. Visualización de un área de relleno poli-
conjunto de líneas sin conexión mostrado en (b).
gonal correctamente recortada.
I
Polígono original
Reeorte izquierdo
Recorte derecho
Recorte inferior
Recone superior
FIGURA 6.23. Procesamiento de un área de relleno poligonal con los sucesivos límites de la ventana de recorte.
338
CAPÍTULO 6
Visualizaáón bidimemionai
FIGURA 6.24. Un área de relleno poligonal con las extensiones de coordenadas fuera del limite derecho de recorte.
Cuando no podemos identificar si un arca de relleno está totalmente dentro o totalmente fuera de la ventana de recorte, necesitamos entonces localizar las intersecciones del polígono con los límites de recorte. Una manera de implementar el recorte de polígonos convexos consiste en crear una nueva lista de vértices en cada límite de recorte, y entonces pasar esta nueva lista de vértices al siguiente recortador de límites. La salida de la etapa final de recorte es la lista de vértices del polígono recortado (Figura 6.25). Para el recorte de polígonos cóncavos, es necesario modificar esta técnica básica para que se puedan generar múltiples listas de vértices.
Recorte de polígonos de Sutherland-Hodgman Un método eficiente de recorte de áreas de relleno poligonales convexas, desarrollado por Suthcrland y Hodgman, consiste en enviar los vértices del polígono a través de cada etapa de recorte para que un único vértice recortado se pueda pasar inmediatamente a la etapa siguiente. Esto elimina la necesidad de producir como salida un conjunto de vértices en cada etapa de recorte, lo que permite que las subrutinas de recorte de bordes se implemenlen en paralelo. La salida final es una lista de vértices que describe las aristas del área de relleno poligonal recortada. Ya que el algoritmo de Sutherland-Hodgman produce sólo una lista de vértices de salida, no puede generar correctamente los dos polígonos de salida de la Figura 6.22(b), que son el resultado del recorte del poli-
6.8 Recorte de áreas de relleno poligonales
339
gono cóncavo mostrado en el apartado (a) de la figura. Sin embargo, se puede añadir un procesamiento adicional al algoritmo de Sutherland-Hodgman para obtener múltiples listas de vértices como salida, con el fin de poder realizar el recorte de polígonos cóncavos generales. El algoritmo básico de Sutherland-Hodgman es capaz de procesar polígonos cóncavos cuando el área de relleno recortada se puede describir con una única lista de vértices. La estrategia general de este algoritmo es enviar el par de puntos extremos de cada sucesivo segmento de línea del polígono a través de la serie de recortadores (izquierdo, derecho, inferior y superior). Tan pronto como un recortador completa el procesamiento de un par de vértices, los valores de las coordenadas recortadas, si existen, para dicha arista se envían al siguiente recortador. Después, el primer recortador procesa el siguiente par de puntos extremos. De este modo, los recortadores individuales de bordes pueden funcionar en paralelo. Existen cuatro posibles casos que hay que considerar cuando se procesa una arista de un polígono de acuerdo con uno de los límites de recorte. Una posibilidad es que el primer punto extremo de la arista esté fuera del límite de recorte y el segundo extremo esté dentro. O, ambos extremos podrían estar dentro del límite de recorte. Otra posibilidad es que el primer extremo esté dentro del límite de recorte y el segundo fuera. Y, finalmente, ambos puntos extremos podrían estar fuera del límite de recorte. Para facilitar el paso de los vértices de una etapa de recorte a la siguiente, la salida de cada recortador se puede formular como se muestra en la Figura 6.26. A medida que cada sucesivo par de puntos extremos se pasa a uno de los cuatro recortadores, se genera una salida para el siguiente recortador de acuerdo con los resultados de las siguientes pruebas. (1)
El primer vértice de entrada está fuera del borde de la ventana de recorte y el segundo está dentro, tanto el punto de intersección de la arista del polígono con el borde de la ventana como el segundo vértice se envían al siguiente recortador.
(2)
Si ambos vértices de entrada se encuentran dentro de este borde de la ventana de recorte, sólo el segundo vértice se envía al siguiente recortador.
(3|
Si el primer vértice está dentro de este borde de la ventana de recorte y el segundo vértice está fuera, sólo la intersección de la arista del polígono con el borde de la ventana de recorte se envía al siguiente recortador.
(4)
Si ambos vértices de entrada se encuentran fuera de este borde de la ventana de recorte, no se envían vértices al siguiente recortador.
El último recortador de esta serie genera una lista de vértices que describe el área IInal de relleno recortada. La Figura 6.27 proporciona un ejemplo del algoritmo de recorte de polígonos de Sutherland-Hodgman para un área de relleno definida por el conjunto de vértices ¡ 1 , 2 , 3 ¡ . Tan pronto como un recortador recibe un par de puntos extremos, determina la salida apropiada utilizando las pruebas mostradas en la Figura 6.26.
(I) f u e r a — ^ dentro Salida: V¡. V,
(2) dentro
(3)
» dentro
Salida: V
2
dentro
»
(4) fuera
Salida: V¡
fuera
» fuera
Salida: ninguna
FIGURA 6.26. Las cuatro posibles salidas generadas por el recortador izquierdo, dependiendo de la posición de un par de puntos extremos respecto del borde izquierdo de la ventana de recorte.
340
CAPÍTULO 6
Visualización bidimensional
Recoriúdor superior II. 2|: (in-in) ->{2] (2,3): (iri-oul) ->|2'| n 1
(2,2'}:
10' V \- fin ini
- 4 IV \ 1 ¿ , Ji j. iin - inj —» \¿ ] |2',3'}:(in-out)-* (2"}
I I * (out-in) ->|3', 1J J, 1 ).
|3'. 1}: (in-in)-. (11 (3M):(out-out) ->| I |l.2|:(out-in) -Hfl'Jj (2", (in - in) -» il'
{1.2}:(in-in)-> |2¡
(2,2'|:(in-in>-> |2'|
|l'.21:(in-in)-> 12) ,
{2,2 l:(in-in)-> |2' {2', 2"): (in -in)-* |2" in = dentro; out = fuera
FIGURA 6.27.
Procesamiento de un conjunto de vértices de un polígono,
{I,
2, 3}, mediante los recortadores de bordes
utilizando el algoritmo de Sutherland-llodgman. El conjunto final de vértices recortados es {I \ 2, 2', 2 " ) .
Estas salidas se pasan sucesivamente desde el recorlador izquierdo al derecho, al inferior y al superior. La salida del recorlador superior es el conjunto de vértices que define el área de relleno recortada. En este ejemplo, la lista de vértices de salida es {1', 2, 2\ 2"). En el siguiente conjunto de procedimientos se muestra una implementación secuencial del algoritmo de recorte de polígonos de Sutherland-Hodgman. Un conjunto de vértices de entrada se convierte en una lista de vértices de salida mediante las subrutinas de recorte izquierda, derecha, inferior y superior.
t y p e d e f enum const
GLint
GLint
inside
{
Left,
nClip
Right,
•
Bottom,
Top
}
Boundary;
4;
(wcPt2D p,
Boundary b,
w c P t 2 D wMin,
w c P t 2 D wMax)
{ switch
(b)
{
case
Left:
case
Right:
case
Bottom:
if
case
Top:
(p.y
return
if
(p.x
if
if
<
(p.x
wMin.x)
return
> wMax.x)
(p.y
wMin.y)
> wMax.y)
(false);
return return
return
break;
(false); (false);
(false);
break; break;
break;
(true);
} GLint
cross
(wcPt2D p l ,
( ¡¡¡¡¡¡¡{¡¡1 if
(inside
(pl,
wcPt2D p 2 ,
winEdge,
wMin,
Boundary winEdge,
wMax)
-»
inside
w c P t 2 D wMin,
(p2,
winEdge,
w c P t 2 D wMax)
wMin,
wMax))
6.8 Recorte de áreos de relleno poligonales 3 4 1
return else
(false);
return
(true);
wcPt2D i n t e r s e c t
wcPt2D
(pl.X
switch case
wcPt2D
p2,
Boundary winEdge,
w c P t 2 D wMin,
w c P t 2 D wMax)
iPt;
f|p!j|
G L f l o a t m; if
{wcPt2D p i ,
1« p 2 . x )
m •
(winEdge)
(pi.y
-
p2.y)
/
(pl.x
-
p2.x);
+
(wMin.y
-
p2.y)
/ m;
iPt.x « p2.x +
(wMax.y
-
p2.y)
/ m;
{
Left;
iPt.x =
wMin.x,-
iPt.y • p2.y +
(wMin.x -
p2.x)
* m;
(wMax.x
p2.x)
* m-
break; case
Right:
iPt.x
wMax.x;
iPt.y = p2.y +
-
f
break; case
Bottom:
if
(pl.x
else
!=
p2.x)
iPt.x »
iPt.x
=
p2.x
p2.x;
break; case
Top:
iPt.y if
-
wMax.y;
(pl.x
else
1= p 2 . x )
iPt.x
«
p2.x;
break;
return
(iPt);
void c l i p P o i n t
(wcPt2D p,
Boundary
wcPt2D * pOut,
WCPt2D /*
Si
int
*
cnt,
w c P t 2 D wMin, wcPt2D *
w c P t 2 D wMax,
firstt],
wcPt2D *
s)
iPt? no
existe
* guardar e s t e if
winEdge,
ningún punto punto.
a n t e r i o r para
este
límite
de
recorte,
*/
(ífirst[winEdge]) first[winEdge]
=
&p;
else /*
Existe
* límite * con
el
* añadir if
(croes iPt í£
un punto p r e v i o . de
recorte,
Biguiente
límite,
la
intersección
(p,
s[winEdge],
= intersect (winEdge
<
Si
hallar
(p,
Top)
a
p y un punto a n e t r i o r cruzan e s t e la
interaeccción.
si
lo
la
lista
winEdge,
s[winEdge],
hay. de
wMin,
Si
no
Recortar h a y más
salida. wMax))
winEdge,
acuerdo
límites
*/ {
wMin,
de
wMax);
de
recorte,
342
CAPÍTULO 6
Visualización bidhttcnsional
clipPoint else
(iPt,
b+1,
wMin,
wMax,
pOut,
cnt,
first,
a);
{
pOut[*Cnt3
=
iPt;
(*cnt)++;
>
/*
Guardar p
s [winEdge] /* * if
Para de
el
punto
todos, (p,
si
el
punto
BÍ
lo hay.
winEdge,
(winEdge
<
clipPoint else
más
reciente
para
este
limite
de
recorte.
*/
p;
recorte,
íinside if
como
-
está
dentro,
pasar
al
siguiente
límite
*/
wMin,
wMax)í
Top) íp,
winEdge
+
1,
wMin,
wMax,
pOut,
cnt,
first,
sí;
{
pOut[*cnt]
void closeClip
= p;
(*cnt)++;
( w c P t 2 D wMin, GLint
*
w c P t 2 D wMax,
cnt,
wcPt2D
*
wcPt2D
first
[
*
pOut,
1,
wcPt2D
*
s)
i wcPt2D
pt;
Boundary for
winEdge;
(winEdge • L e f t ; if
(croBs pt
»
if
(winEdge
intersect <
clipPoint else
winEdge
(s[winEdge],
<= Top;
winEdge++J
*first[winEdge],
(s[winEdge],
{
winEdge,
wMin,
*first[winEdge],
wMax)Ì
winEdge,
{
wMin,
wMax);
Top) (pt,
winEdge
pt;
<*cnt)++;
+
1,
wMin,
wMax,
pOut,
cnt,
first,
s);
{
pOut[*cnt]
=
; i } ) GLint
polygonClipSuthHodg
( w c P t 2 D wMin,
w c P t 2 D wMax,
GLint
n,
wcPt2D
*
pin,
wcPt2D * pOut)
{ /*
El
parámetro
"first"
* l í m i t e de r e c o r t e ; * por
el
límite
de
first[nClip]
GLint
cnt
for
(k =
0;
-
return
(cnt);
recientemente procesado
-
(
0,
0,
0,
0
},
stnClip];
k++)
(pln[k],
(wMin,
a primer punto porcesado por un
p u n t o más
0;
k < n;
clipPoint cloaeClip
un puntero
almacena el
recorte.*/
WCPt2D * k,
guarda "s"
wMax,
Left, pOut,
wMin, &cnt,
wMax,
pOut,
first,
s);
&cnt,
first,
s);
6.8 Recorte de áreas de relleno poligonales
343
Ventana de recorte 1
FIGURA 6.28. El recorte del polígono cóncavo de (a) utilizando el algoritmo de Sutherland-Hodgman produce las dos áreas conectadas de (b).
Cuando se recorta un polígono cóncavo con el algoritmo de Sutherland-Hodgman, se pueden visualizar líneas extrañas. En la Figura 6.28 se muestra un ejemplo de este efecto. Esto ocurre cuando el polígono recortado tiene dos o más partes independientes. Pero ya que sólo hay una lista de vértices de salida, el último vértice de la lista se une siempre al primer vértice. Hay varias cosas que podemos hacer para visualizar correctamente polígonos cóncavos recortados. Podemos dividir un polígono cóncavo en dos o más polígonos convexos (Sección 3.15) y procesar cada polígono convexo de forma independiente utilizando el algoritmo de Sutherland-Hodgman. Otra posibilidad consiste en modificar el método de Sutherland-Hodgman para que se compruebe si en la lista de vértices final existen puntos de intersección múltiples, a lo largo de cualquier límite de la ventana de recorte. Si encontramos más de dos vértices a lo largo de cualquier límite de recorte, podemos dividir la lista de vértices en dos o más listas, que identifiquen correctamente las partes independientes del área de relleno recortada. Esto puede requerir un análisis amplio para determinar si algunos puntos a lo largo del límite de recorte se deben emparejar o si representan un único vértice que se ha recortado. Una tercera posibilidad es utilizar un recortador de polígonos más general que se haya diseñado para procesar polígonos cóncavos correctamente.
Recorte de polígonos de Weiler-Atherton Este algoritmo proporciona una técnica general de recorte de polígonos que se puede utilizar para recortar un área de relleno que sea un polígono convexo o un polígono cóncavo. Además, este método se desarrolló como medio de identificación de superficies visibles de una escena tridimensional. Por tanto, podríamos también utilizar esta técnica para recortar cualquier área de relleno poligonal según una ventana de recorte con cualquier forma poligonal. En lugar de simplemente recortar las aristas del área de relleno como en el método de SutherlandHodgman, el algoritmo de Weiler-Atherton recorre el perímetro del polígono de relleno en busca de los límites que encierran una región de relleno recortada. De este modo, como se observa en la Figura 6.28(b), se pueden identificar múltiples regiones de relleno y mostrarlas como polígonos independientes y no conectados. Para encontrar las aristas de un área de relleno recortada, seguimos un camino (en sentido antihorario o en sentido horario) alrededor del área de relleno que se desvía a lo largo de un límite de ventana de recorte, cada vez que una arista de un polígono cruza hacia el exterior de dicho límite. La dirección de un desvío en una arista de una ventana de recorte es la misma que la dirección de procesamiento de las aristas del polígono. llabitualmenle, podemos determinar si la dirección de procesamiento es en sentido anlihorario o en sentido horario, a partir de la ordenación de la lista de vértices que define un área de un polígono de relleno. En la mayoría de los casos, la lista de vértices se especifica en sentido antihorario como un medio para definir la cara frontal del polígono. Por tanto, el producto vectorial de los vectores de dos aristas sucesivas que forman un ángulo convexo detennina la dirección del vector normal, que está en la dirección de la cara posterior hacia la cara frontal del polígono. Si no conocemos la ordenación de los vértices, podríamos calcular el vector normal, o podríamos usar un método cualquiera de los estudiados en la Sección 3.15 para localizar el interior del área de relleno a partir de cualquier posición de referencia. Después, si procesamos secuencia! mente las aris-
344
CAPITULO 6
Visualizado/! bidimeuskmal
tas para que el interior del polígono esté siempre a nuestra izquierda, obtenemos una transversal en sentido contrario al movimiento de las agujas del reloj. De otra manera, con el interior a nuestra derecha, tenemos una transversal en el sentido del movimiento de las agujas del reloj. Para una transversal en el sentido contrario al movimiento de las agujas del reloj de los vértices del área de relleno poligonal, aplicamos los siguientes procedimientos de Weiler-Atberton: (1)
Procese las aristas del área de relleno poligonal en sentido contrario a las agujas del reloj hasta que encuentre un par de vértices situados dentro y fuera de uno de los límites de recorte; es decir, el primer vértice de la arista del polígono está dentro de la región de recorte y el segundo vértice está fuera de la región de recorte.
(2)
Siga los límites de la ventana en sentido contrario a las agujas del reloj, desde el punto de intersección de salida hacia otro punto de intersección con el polígono. Si éste es un punto previamente procesado, continúe con el paso siguiente. Si éste es un punto de intersección nuevo, continúe procesando las aristas del polígono en sentido contrario al movimiento de las agujas del reloj hasta que se encuentre un vértice procesado previamente.
(3)
Forme la lista de vértices de esta parte del área de relleno recortada.
(4)
Vuelva al punto de intersección de salida y continué procesando las aristas del polígono en orden contrario al movimiento de las agujas del reloj.
La Figura 6.29 muestra el recorte de Weiler-Atherton de un polígono cóncavo con una ventana de recorte rectangular y estándar para una transversal en sentido contrario al movimiento de las agujas del reloj de las aristas del polígono. Para una transversal de las aristas en el sentido del movimiento de las agujas del reloj, usaríamos una transversal de la ventana de recorte en el sentido del movimiento de las agujas del reloj. Comenzando por el vértice etiquetado como 1 en la Figura 6.26(a), el siguiente vértice del polígono a procesar en sentido aantihorario es el etiquetado como 2. Por tanto, esta arista sale de la ventana de recorte por la frontera superior. Calculamos la intersección (punto 1') y hacemos un giro a la izquierda para procesar las aristas de la ventana en dirección contraria al movimiento de las agujas del reloj. Continuando a lo largo del límite superior de la ventana de recorte, no intersectamos con una arista del polígono antes de alcanzar el límite izquierdo de la ventana, por lo que etiquetamos este punto como vértice I" y seguimos el límite izquierdo hacia la intersección I ' " . Después seguimos esta arista del polígono en sentido contrario a las agujas del reloj, que nos devuelve al vértice 1. Esto completa el circuito de los límites de la ventana e identifica la lista de
3
FIGURA 6.29. Un polígono cóncavo (a), definido mediante la lista de vértices {I, 2, 3, 4, 5, 61, se recorta utilizando el algoritmo de Weilcr-Aiherton para generar las dos listas {1, I', I", I ' " ) y {4', 5, 5 ' | , que representan las áreas de relleno poligonales e independientes mostradas en (b).
6.8 Recorte de áreas de relleno poligonales
345
FIGURA 6.30. Recorte de un área de relleno poligonal con una ventana de recorte poligonal cóncava utilizando el algoritmo de Wciler-Atherton. vértices { 1 , 1', I " , l ' " í como una región recortada del área original de relleno. Después, se continúa el procesamiento de las aristas del polígono en el punto 1 * . La arista definida por los puntos 2 y 3 cruza hacia el exterior del límite izquierdo, pero los puntos 2 y 2' están encima de la arista superior de la ventana de recorte y los puntos 2' y 3 están a la izquierda de la región de recorte. También la arista de puntos extremos 3 y 4 se encuentra fuera del límite izquierdo de la ventana de recorte. Pero la siguiente arista (desde el extremo 4 hasta el extremo 5) entra de nuevo en la región de recorte y obtenemos el punto de intersección 4'. La arista de extremos 5 y 6 sale de la ventana por el punto de intersección 5\ por lo que nos desviamos hacia el límite izquierdo de recorte para obtener la lista de vértices cerrada ¡4', 5, 5 ' ¡ . Continuamos el procesamiento de aristas por el punto 5 ' , que nos devuelve al punto 1 " ' previamente procesado. En este punto, lodos los vértices y las aristas del polígono se han procesado, por lo que el área de relleno está completamente recortada.
Recorte de polígonos utilizando ventanas de recorte poligonales no rectangulares El algoritmo de Liang-Barsky y otros métodos de recorte de líneas paramétricos están particularmente bien adecuados para el procesamiento de áreas de relleno de polígonos con ventanas de recorte poligonales y convexas. En esta técnica, utilizamos una representación paramétrica de las aristas tanto del área de relleno como de la ventana de recorte, y ambos polígonos se representan mediante listas de vértices. En primer lugar, comparamos las posiciones de las rectángulos frontera del área de relleno y del polígono de recorte. Si no podemos identificar el área de relleno como completamente fuera del polígono de recorte, podemos utilizar las pruebas denlro-fuera para procesar las ecuaciones paramétricas de las aristas. Después de finalizar todas las pruebas de las regiones, resolvemos sistemas de dos ecuaciones paraméticas de líneas para determinar las intersecciones con la ventana. También podemos procesar cualquier área de relleno de un polígono con cualquier ventana de recorte de forma poligonal (convexa o cóncava), como en la F i g u r a 6 . 3 0 , utilizando la técnica arista-transversal del algoritmo de Weiler-Aherton. En este caso, necesitamos mantener una lista de vértices de la ventana de recorte así como del área de relleno, organizadas con un orden en el sentido contrario al movimiento de las agujas del reloj (o a favor). Necesitamos aplicar pruebas denlro-fuera para determinar si un vértice del área de relleno está dentro o fuera de los límites de una ventana de recorte particular. Como en los ejemplos anteriores, seguimos los limites de la ventana cada vez que una arista del área de relleno sale de uno de los límites de recorte. Este método de recorte también se puede utilizar cuando el área de relleno o la ventana de recorte contienen agujeros que quedan definidos mediante límites poligonales. Además, podemos utilizar esta técnica básica en aplicaciones de construcción de geometría de sólidos para identificar la unión, la intersección o la diferencia de dos polígonos. De hecho, la localización de la región recortada de un área de relleno es equivalente a la determinación de la intersección de dos áreas planas.
Recorte de polígonos utilizando ventanas de recorte con límites no lineales Un método para procesar una ventana de recorte con límites curvados consiste en aproximar los límites con partes de lineas rectas y utilizar uno de los algoritmos de recorte con una ventana de recorte de forma poligo-
346 CAPÍTULO 6 Visualizado*] bidi mensional nal. Alternativamente, podríamos utilizar los mismos procedimientos generales que estudiamos para los segmentos de línea. En primer lugar, podemos comparar las extensiones de coordenadas del área de relleno con las extensiones de coordenadas de la ventana de recorte. Dependiendo de la forma de la ventana de recorte, podemos también ser capaces de realizar algunas otras pruebas de región basadas en consideraciones de simetría. En el caso de las áreas de relleno que no se puedan identificar como completamente dentro o completamente fuera de la ventana de recorte, finalmente necesitamos calcular las intersecciones de la ventana con el área de relleno.
6.9 RECORTE DE CURVAS Las áreas con límites curvos se pueden recortar con métodos similares a los estudiados en los apartados anteriores. Si los objetos se aproximan mediante secciones de línea recta, se puede emplear un método de recorte de polígonos. De otro modo, los procedimientos de recorte implican ecuaciones no lineales, y esto requiere más procesamiento que para los objetos con límites lineales. E^n primer lugar podemos comprobar las extensiones de coordenadas de un objeto respecto a los límites de recorte, para determinar si es posible aceptar trivialmente o rechazar el objeto entero. Si no, podríamos comprobar las simetrías del objeto que podríamos explotar en las pruebas iniciales de aceptación o rechazo. Por ejemplo, los círculos presentan simetrías entre cuadrantes y octantes, por lo que podríamos comprobar las extensiones de las coordenadas de estas regiones individuales del círculo. No podemos rechazar el área de relleno circular completa de la Figura 6.31 sólo comprobando sus extensiones de coordenadas en conjunto. Pero la mitad del círculo está fuera del límite derecho de recorte (o fuera del límite superior), el cuadrante superior izquierdo está encima del límite superior de recorte, y los dos ociantes restantes se pueden eliminar de forma similar. Un cálculo de intersección implica la sustitución de una posición en el limite de recorte (.w , - niav ^min max' ' ¡ no lineal de los límites del objeto y la resolución para la otra coordenada. Una vez que todas las intersecciones se han evaluado, los puntos que definen el objeto se pueden almacenar para su uso posterior en procedimientos de relleno por línea de barrido. La Figura 6.32 muestra el recorte de un círculo con una ventana rectangular. En este ejemplo, el radio del círculo y los puntos extremos del arco recortado se pueden utilizar para rellenar la región recortada, invocando el algoritmo del círculo para localizar los puntos a lo largo del arco entre los puntos extremos de intersección. Se pueden aplicar procedimientos similares cuando se recorta un objeto curvado con una región de recorte de forma poligonal general. En el primer paso, podríamos comparar el rectángulo delimitador del objeto con el rectángulo delimitador de la región de recorte. Si no se almacena o elimina el objeto entero, a continuación resolvemos el sistema de ecuaciones de lincas y las curvas para determinar los puntos de intersección de recorte. VH
m¡n
1 0>r>v
e n
a c
c
u
a
c
o
n
i i 1
i Ventana de recorte FIGURA 6.31. Un área de relleno circular, mostrando el cuadrante y los octantes que están fuera de los límites de la ventana de recorte.
6.10 Recorte de textos
FIGURA 6.32.
Después del recorte
347
Recorte de un área de relleno circular.
6.10 RECORTE DE TEXTOS Existen varias técnicas que se pueden utilizar para proporcionar recorte de textos en un paquete gráfico. En una aplicación concreta, la elección del método de recorte depende de cómo se generen los caracteres y de qué requisitos tengamos para la visualización de cadenas de caracteres. El método más simple para procesar las cadenas de caracteres relativo a los límites de la ventana de recorte consiste en utilizar la estrategia de recorte de cadenas todo o ninguno mostrada en la Figura 6.33. Si toda la cadena se encuentra dentro de la ventana de recorte, visualizamos la cadena completa. En caso contrario, se elimina la cadena completa. Este procedimiento se implementa examinando las extensiones de coordenadas de la cadena de caracteres. Si los límites de las coordenadas de este rectángulo delimitador no están completamente dentro de la ventana de recorte, se rechaza la cadena. Una alternativa consiste en utilizar la estrategia de recorte de caracteres todo o ninguno. Aquí eliminamos solo aquellos caracteres que no están completamente dentro de la ventana de recorte ti igura 6, 14), l n esic
('AI)KNA l
¡CADENA 21 1
i
Ames del
recorte
CADI'iNA 2 Después del recorte
FIGURA 6.33.
Recorte de texto utilizando las extensiones de coordenadas para una cadena completa.
348
CAPÍTULO 6
Visualizaáón hulimemional
CADI NA I
ADIiNA 3 CADENA 4 Antes del recorte
NA I
ADENA 3 CADENA 4 Después del recorte
FIGURA 6.34. Recorte de texto utilizando el rectángulo delimitador para caracteres individuales de una cadena.
Ames del recorre
ADUNA I
C
Después del recorte
FIGURA 6.35. Recorte de texto realizado sobre las componentes de los caracteres individuales. caso, las extensiones de coordenadas de los caracteres individuales se comparan con los límites de la ventana. Cualquier carácter que no esté completamente dentro del límite de la ventana de recorte se elimina. Una tercera técnica para recortar textos consiste en recortar los componentes de los caracteres individuales. Esto proporciona la visualización más precisa de cadenas de caracteres recortadas, pero requiere el mayor procesamiento. Ahora tratamos los caracteres del mismo modo que tratábamos las lincas o Los polígonos. Si un carácter individual se superpone con la ventana de recorte, sólo recortamos las partes del carácter que se encuentran fuera de la ventana (Figura 6.35). Las fuentes de caracteres de contorno definidas con segmentos de línea se procesan de este modo utilizando un algoritmo de recorte de polígonos. Los caracteres definidos como mapas de bits se recortan comparando la posición relativa de los píxcles individuales en los patrones de rejilla de caracteres con los límites de la región de recorte.
Resumen
349
6.11 RESUMEN La pipeline de transformación de visuali/ación bidimensional es una serie de operaciones que da lugar a la visualización de una imagen en coordenadas universales que se han definido en el plano xy. Después de construir la escena, se puede mapear a un sistema de referencia de coordenadas de visualización y, a continuación, a un sistema de coordenadas normalizado donde se pueden aplicar subrutinas de recorte. Finalmente, la escena se transfiere a coordenadas de dispositivo para su visualización. Las coordenadas normalizadas se pueden especificar dentro del rango que varía de 0 a 1 o dentro del rango que varía de -1 a 1, y se utilizan para hacer los paquetes gráficos independientes de los requisitos de los dispositivos de salida. Seleccionamos parte de una escena para su visualización en un dispositivo de salida utilizando una ventana de recorte, que se puede describir en el sistema de coordenadas universales o en el sistema de coordenadas de visualización relativo a las coordenadas universales. Los contenidos de la ventana de recorte se transfieren a un visor para su visualización en un dispositivo de salida. En algunos sistemas, un visor se especifica en coordenadas normalizadas. Otros sistemas especifican el visor en coordenadas de dispositivo. Habitualmente. la ventana de recorte y el visor son rectángulos cuyas aristas son paralelas a los ejes de coordenadas. Un objeto se mapea al visor para que tenga la misma posición relativa en el visor que la que tiene en la ventana de recorte. Para mantener las proporciones relativas de un objeto, el visor debe tener la misma relación de aspecto que la ventana de recorte correspondiente. Podemos establecer un número cualquiera de ventanas de recorte y de visores para una escena. Los algoritmos de recorte se implementan habitualmente en coordenadas normalizadas, para que todas las transformaciones geométricas y las operaciones de visualización, que son independientes de las coordenadas del dispositivo, se puedan concatenar en una matriz de transformación. Con el visor especificado en coordenadas de dispositivo, podemos recortar una escena bidimensional con un cuadrado simétrico y normalizado con coordenadas normalizadas que varían entre -I y I, antes de transferir los contenidos del cuadrado normalizado y simétrico al visor. Todos los paquetes gráficos incluyen subrutinas para recortar segmentos de línea recta y áreas de relleno poligonales. Los paquetes que contienen funciones para especificar puntos únicos o cadenas de texto, también incluyen subrutinas de recorte para estas primitivas gráficas. Ya que los cálculos de recorte consumen un tiempo, el desarrollo de algoritmos de recorte mejorados continúa siendo un área de gran preocupación en los gráficos por computadora. Cohén y Sutherland desarrollaron un algoritmo de recorte de líneas que utiliza un código de región para identificar la posición de un extremo de una línea respecto a los límites de la ventana de recorte. Los códigos de región de los puntos extremos se utilizan para identificar rápidamente aquellas líneas que se encuentran completamente dentro de la ventana de recorte y algunas líneas que están completamente fuera. Para el resto de las líneas, se deben calcular las intersecciones con los límites de la ventana. Liang y Barsky desarrollaron un algoritmo de recorte de líneas más rápido que representa los segmentos de línea con ecuaciones paramétricas, similar al algoritmo de Cyrus-Beck. Esta técnica permite que se realicen más comprobaciones antes de proceder con los cálculos de intersección. El algoritmo de Nicholl-Lee-Nicholl reduce más aún los cálculos de intersección utilizando una comprobación de más regiones en el plano xy. Los métodos de recorte de líneas paramétricos se amplían fácilmente a ventanas de recorte convexas y a escenas tridimensionales. Sin embargo, la técnica de Nicholl-Lee-Nicholl sólo es aplicable a segmentos de línea bitlimensionales. También se han desarrollado algoritmos de recorte de segmentos de linea recta con ventanas de recorte poligonales cóncavas. Una técnica consiste en dividir una ventana de recorte cóncava en un conjunto de polígonos convexos y aplicar los métodos de recorte de líneas paramétricos. Otra técnica consiste en añadir aristas a la ventana cóncava para convertirla en convexa. Después se puede realizar una serie de operaciones de recorte interiores y exteriores para obtener el segmento de línea recortado. Aunque las ventanas de recorte con límites curvados se utilizan raramente, podemos aplicar métodos similares a los de recorte de líneas. Sin embargo, los cálculos de intersección ahora implican ecuaciones no lineales.
350
CAPÍTULO 6
Visualización tridimensional
Un área de relleno de un polígono se define con una lista de vértices, y los procedimientos de recorte de polígonos deben guardar información a cerca de cómo las aristas recortadas, se deben conectar a medida que el polígono pasa por varios estados de procesamiento. En el algoritmo de Suthcrland-llodgman, los pares de vértices del área de relleno son procesados por cada recortador de contorno por turnos y la información de recorte para aquella arista se pasa inmediatamente al siguiente recortador, lo cual permite a las cuatro subrutinas de recorte (izquierda, derecha, inferior y superior) funcionar en paralelo. Este algoritmo proporciona un método eficiente para recortar áreas de relleno de polígonos convexos. Sin embargo, cuando un polígono cóncavo contiene partes disjuntas, el algoritmo de Suthcrland-llodgman produce extraños segmentos de línea de conexión. También se pueden utilizar para recortar áreas de relleno de polígonos convexos, ampliaciones de recortadores de linas paramétricos, tales como el método de Liang-Barsky. Tanto las áreas de relleno convexas como las áreas de relleno cóncavas se pueden recortar correctamente con el algoritmo de Weiler-Atherton, que utiliza una técnica de contorno-transversal. Las áreas de relleno se pueden recortar con ventanas de recorte convexas utilizando una ampliación de la técnica de representación de líneas paramétrieas. El método de Weiler-Atherton puede recortar cualquier área de relleno de un polígono utilizando cualquier ventana de recorte de forma poligonal. Las áreas de relleno se pueden recortar mediante ventanas con límites no lineales utilizando una aproximación poligonal de la ventana o procesando el área de relleno con los límites curvados de la ventana. El método de recorte de textos más rápido es la estrategia todos-o-ninguno, que recorta completamente una cadena de texto si cualquier parte de la cadena está fuera de cualquier límite de la ventana de recorte. Podríamos recortar una cadena de texto eliminando sólo aquellos caracteres de la cadena que no están completamente dentro de la ventana de recorte. El método más preciso de recorte de texto consiste en aplicar recorte de puntos, líneas, polígonos o curvas a los caracteres individuales de una cadena, dependiendo de si los caracteres están definidos con fuentes de cuadrículas de puntos o de contorno. Aunque OpenGL está diseñado para aplicaciones tridimensionales, se proporciona una función (iLU bidimensional para especificar una ventana de recorte estándar y rectangular en coordenadas universales. En OpenGL, las coordenadas de la ventana de recorte son parámetros para la transformación de proyección. Por tanto, en primer lugar necesitamos invocar el modo de la matriz de proyección. A continuación, podemos especificar la vista, utilizando una función de la biblioteca básica de OpenGL y una ventana de visualización, utilizando funciones de GLUT. Hay disponible una gran variedad de funciones de GLUT para modificar varios parámetros de la ventana de visualización. La Tabla 6.1 resume las funciones de visualización bidimensional de OpenGL. Adicionalmente, la tabla enumera algunas funciones relacionadas con la visualización. TABLA 6.1.
RESUMEN DE LAS FUNCIONES OpenGL DE VISUALIZACIÓN BIDIMENSION,
Función
Descripción
gluOrtho2D
Especifica las coordenadas de la ventana de recorte en sus argumentos de una proyección ortogonal bidimensional.
glViewport
Especifica los parámetros del sistema de coordenadas de pantalla de una vista.
glGetlntegerv
Utiliza los argumentos GL_VIEWPORT y de la \ isla acli\a actual.
glutlnic
Iniciali/a la biblioteca GLUT.
glutlnitWindowPosition
Especifica las coordenadas de la esquina superior izquierda de la ventana de visualización.
gluCInitWindowSize
Especifica la anchura y la altura de la ventana de visualización.
gluCCreateWindow
Crea una ventana de visualización (a la que se asigna un identificado!' entero) y especifica un título para la misma. (Continúa)
vpArray
para obtener los parámetros
Resumen
351
TABLA 6.1. RESUMEN DE LAS FUNCIONES DE VISUALIZACIÓN BIDIMENSIONAL DE OpenGL. (Cont)
Función
Descripción
glut Ini tDisplayMode
Selecciona parámetros tales como los búferes y el modo de color de una ventana de visualización.
glClearColor
Especifica un color RGB de fondo en una ventana de visualización.
glClearlndex
Especifica un color de fondo de una ventana de visualización utilizando el modo de color indexado.
glutDestroyWindow
Especifica un número identillcador de una ventana de visualización que hay que borrar.
glutSetWindow
Especifica el número idcntificador de una ventana de visualización que debe ser establecida como la ventana de visualización actual.
glutPositionWindow
Restablece la localización en la pantalla de la ventana de visualización actual.
glutReshapeWindow
Restablece la anchura y la altura de la ventana de visualización actual.
glucFullScreen
Cambia la ventana de visualización actual al tamaño de la pantalla de vídeo.
glutReshapeFunc
Especifica la función que se debe invocar cuando se cambia el tamaño de la ventana de visualización.
glutlconifyWindow
Convierte la ventana de visualización actual en un icono.
glutSetlconTitle
Especifica una etiqueta para un icono de la ventana de visualización.
glutSetWindowTitle
Especifica un nuevo título para la ventana de visualización actual.
glutPopWindow
Mueve la ventana de visualización actual hacia la «cima»; es decir, la coloca encima de las demás ventanas.
glutPushWindow
Mueve la ventana de visualización actual hacia el «fondo»: es decir, la coloca detrás de las demás ventanas.
glutShowWindow
Muestra en pantalla la ventana de visualización actual.
GlutCreateSubWindow
Crea una ventana de segundo nivel dentro de una ventana de visualización.
glutSetCursor
Selecciona una forma para el cursor de pantalla.
glutDisplayFunc
Invoca una función para crear una imagen dentro de la ventana de visualización actual.
glutPostRedisplay
Redibuja los contenidos de la ventana actual.
gluCMainLoop
Ejecuta el programa de gráficos por computadora.
glutldleFunc
Especifica una función para su ejecución cuando el sistema no tiene algo que hacer.
glutGet
Pregunta al sistema acerca de un parámetro de estado espeficado.
352
CAPÍTULO 6
Visualization bidimensional
REFERENCIAS Se estudian algoritmos de recorte de líneas en Sproull y Sutherland (1968), Cyrus y Beck (1978), Liang y Barsky (1984), y Nicholl, Lee y Nieholl (1987). Se proporcionan métodos de mejora de la velocidad del algoritmo de recorte de líneas de Cohen-Sutherland en Duvanenko (1990). En Sutherland y Hodgman (1974) y en Liang y Barsky (1983) se presentan métodos básicos de recorte de polígonos. En Weiler y Alherton (1977) y en Weiler (1980) se proporcionan técnicas generales para recortar polígonos de forma arbitraria entre sí. En Woo, Neider, Davis y Shreiner (1999) se estudian funciones de visuali/ación de OpenGL. Las subrulinas de GLUT de ventanas de visualización se estudian en Kilgard (1996) y se puede obtener información adicional sobre GLUT en
el sitio w e b : htíp^/reality.sgixom/opengl/glutS/gluliJumi
EJERCICIOS 6.1
Escriba un procedimiento pura calcular los elementos de la matriz 6.1 de transformación bidimensional de coordenadas universales a coordenadas de visuali/ación. proporcionando las coordenadas del origen de visuali/ación P„ y el vector de dirección de vista V.
6.2
Obtenga la matriz 6.8 de transferencia de los contenidos de una ventana de recorte a la vista cambiando de escala en primer lugar la ventana al tamaño de la vista y después trasladando la ventana a la que se le ha aplicado el cambio de escala a la posición de la vista. Utilice el centro de la ventana de recorte como punto de referencia para las operaciones de cambio de escala y de traslación.
6.3
Escriba un procedimiento para calcular los elementos de la matriz 6» de transformación de una ventana de recorte en el cuadrado normalizado y simétrico.
6.4
Escriba un conjunto de procedimientos para implemcntur la tubería de visuali/ación bidimensional sin las operaciones de recorte. Su programu debería permitir que se construya una escena con transformaciones de coordenadas de modelado, un sistema de visuali/ación especificado y una transformación al cuadrado normalizado y simétrico. De forma opcional, se podría implementar una tabla de visualization para almacenar diferentes conjuntos de parámetros de transformación de visuali/ación.
6.5 6.6
Escriba un programa completo para implementar el algoritmo de recorte de líneas de Cohen-Suiherland. Estudie cuidadosamente el fundamento lógico de los tests y los métodos para el cálculo de los parámetros de las intersecciones w, y M, del algoritmo de recorte de lineas de Liang-Barsky.
6.7
Compare el número de operaciones aritméticas realizados en los algoritmos de recorte de líneas de CohenSuthcrland y Liang-Barsky para varias orientaciones diferentes de linea relativas a la ventana de recorte.
6.8
Escriba un programa completo para implementar el algoritmo de recorte de líneas de Liang-Barsky.
6.9
Idee transformaciones de simetría para mapear los cálculos de intersecciones para las tres regiones de la Figura 6.16 a las otras seis regiones del plano Xy,
6.10
Establezca un algoritmo detallado para la técnica de Nicholl-Lcc-Nicholl de recorte de líneas para cualquier par de puntos extremos de linea de entrada.
6.11
Compare el número de operaciones aritméticas realizadas en el algoritmo NLN con los algoritmos de CohenSutherland y de Liang-Barsky de recorte de lineas, para varias orientaciones diferentes de linea respecto de la ventana de recorte.
6.12 6.13
Adapte el algoritmo de recorte de lineas de Liang-Barsky al recorte de polígonos. Establezca un algoritmo detallado para el recorte de polígonos de Weiler-Atherton, asumiendo que la ventana de recorte es un rectángulo en posición estándar.
6.14
Idee un algoritmo para el recorte de polígonos de Weiler-Alherton, en el que la ventana de recorte pueda ser cualquier polígono convexo.
Ejercicios
353
6.15
Idee un algoritmo para el recorte de polígonos de Weiler-Atherton, en el que la ventana de recorte pueda ser cualquier polígono especificado (convexo o cóncavo).
6.16
Escriba una subrutina para recortar una elipse en posición estándar con una ventana rectangular.
6.17
Asumiendo que todos los caracteres de una cadena de texto tienen la misma anchura, desarrolle un algoritmo de recorte de texto que recorte una cadena según la estrategia de recorte de caracteres todos-o-ninguno.
6.18
Desarrolle un algoritmo de recorte de texlo que recorte caracteres individuales, asumiendo que los caracteres se definen en una cuadrícula de píxcles de un tamaño especificado.
Visual ización tridimensional
TI Templo de Luxor, una cseena de un video de E&S Digital Thealer donde se realiza una visualización tridimensional en tiempo real con técnicas de animación inlbgráíica. (Cortesía de Evans & Sutherhuuí i
7.1
Panorámica de los conceptos de visualización tridimensional
7.7
Proyecciones paralelas oblicuas
7.8
Proyecciones en perspectiva
7.2
Pipeline de visualización tridimensional
7.9
7.3
Parámetros de coordenadas de visualización tridimensional
Transformación del visor y coordenadas de pantalla tridimensionales
7 . 1 0 Funciones de visualización tridimensional OpenCiL
7.4
Transformación de coordenadas universales a coordenadas de visualización
7.5
Transformaciones de proyección
7 . 1 2 Planos de recorte opcionales en OpenGL
7.6
Proyecciones ortogonales
7 . 1 3 Resumen
7 . 1 1 Algoritmos de recorte tridimensional
Para aplicaciones gráficas bidimensionales, las operaciones de visualización transfieren las posiciones desde el sistema de referencia en coordenadas universales a posiciones de pixeles en el plano del dispositivo de salida. Utilizando el contorno rectangular de la ventana de visualización y el visor, un paquete gráfico bidimensional recorta una escena y establece la correspondencia con las coordenadas del dispositivo de salida. Las operaciones de visualización tridimensionales, sin embargo, son más complejas, ya que hay muchas más opciones en lo que respecta al modo de construir la escena y de generar vistas de dicha escena sobre un dispositivo de salida.
7.1 PANORÁMICA DE LOS CONCEPTOS DE VISUALIZACIÓN TRIDIMENSIONAL Cuando modelamos una escena tridimensional, cada objeto de la escena se suele definir mediante un conjunto de superficies que forman un conjunto cerrado alrededor del interior del objeto. Y para algunas aplicaciones puede que también tengamos que especificar información acerca de la estructura interior del objeto. Además de proporcionar procedimientos que generan vistas de las características superficiales de un objeto, los paquetes gráficos proporcionan en ocasiones rutinas para mostrar los componentes internos o vistas en sección transversal de un objeto sólido. Las funciones de visualización procesan a las descripciones de los objetos mediante una serie de procedimientos que proyectan una vista especificada de los objetos sobre la superficie de un dispositivo de salida. Muchos procesos de visualización tridimensional, como las rutinas de recorte, son similares a los que podemos encontrar en una pipeline de visualización bidimcnsional. Pero la visualización tridimensional requiere algunas otras tareas que no están presentes en su equivalente bidimcnsional. Por ejemplo, se necesitan rutinas de proyección para transferir la escena a una vista sobre una superficie plana; asimismo, es necesario identificar las partes visibles de una escena y, para tener una imagen realista, es necesario tener en cuenta los efectos de iluminación y las características de las superficies.
Visualización de una escena tridimensional Para obtener una imagen de una escena tridimensional definida en coordenadas universales, primero necesitamos definir un sistema de referencia de coordenadas para los parámetros de visualización, o parámetros de la «cámara». Este sistema de referencia define la posición y orientación de un plano de visualización (o plano de proyección) que se corresponde con el plano de la película de una cámara (Figura 7.1). Entonces, se transfieren las descripciones de los objetos al sistema de coordenadas de visualización y se proyectan sobre el
3 5 6
CAPÍTULO 7
Visualización tridimensional
Ni
I
Plano de visualización
i
F I G U R A 7.1.
Sistema de coordenadas de referencia para obtener una vista
seleccionada de una escena tridimensional.
F I G U R A 7.2.
Visualización alámbrica de tres objetos en
la que se han eliminado las líneas posteriores; las imágenes están extraídas de una base de datos comercial de tbnnas de objetos. Cada objeto de la base de datos está definido mediante una cuadricula tridimensional de puntos que pueden visualizarse en forma alámbrica o como un sólido con superficie sombreada.
(Cortesia de
Viewpoint DataLabs.) plano de visualización. Podemos generar una vista de un objeto sobre el dispositivo de salida en modo alámbrico, como en la Figura 7.2, o podemos aplicar técnicas de iluminación y de representación de superficies para obtener un sombreado realista de las superficies visibles.
Proyecciones A diferencia de la imagen de una cámara, podemos elegir diferentes métodos para proyectar una escena sobre el plano de visualización. Un método para obtener la descripción de un objeto sólido sobre un plano de visualización consiste en proyectar puntos de la superficie del objeto en una serie de líneas paralelas. Esta técnica, denominada proyección paralela, se utiliza en dibujos de ingeniería y de arquitectura para representar un objeto mediante una serie de vistas que indiquen sus dimensiones precisas, como en la Figura 7.3. Otro método para generar una vista de una escena tridimensional consiste en proyectar los puntos hasta el plano de visualización según una serie de trayectorias convergente. Este proceso, denominado proyección en perspectiva, hace que los objetos que están situados más lejos de la posición de visualización se muestren con un tamaño menor que los objetos de! mismo tamaño que se encuentren más cerca. Las escenas generadas utilizando una proyección en perspectiva parecen más realistas, ya que ésta es la manera en que nuestros ojos y los objetivos de las cámaras forman las imágenes. En la vista con proyección en perspectiva mostrada en la Figura 7.4, las líneas paralelas según la dirección de visualización parecen converger en un punto distante del fondo, y los aviones situados más lejos parecen más pequeños que el que está despegando en primer plano.
Pistas de profundidad Con muy pocas excepciones, la información de profundidad tiene una gran importancia en una escena tridimensional, para que podamos identificar fácilmente (para una dirección de visualización concreta) cuál es la
7.1 Panorámica de los conceptos de visualización tridimensional
Superior
Lateral
Frontal
357
FIGURA 7.3. Tres vistas en proyección paralela de un objeto, que muestran las proporciones relativas desde distintas posiciones de visualización.
FIGURA 7.4. Una vista con proyección en perspectiva de una escena de un aeropuerto. (Cortesía de Evans & Sttthertand)
FIGURA 7.5. La representación alámbrica de la pirámide en (a) no contiene información de profundidad para indicar si la dirección de visualización es (b) hacia abajo desde una posición situada por encima de la cúspide o (c) hacia arriba desde una posición situada por debajo de la base. parte la frontal y cuál es la parte posterior de cada objeto visualizado. La Figura 7.5 ilustra la ambigüedad que puede producirse cuando se muestra la representación alámbrica de un objeto sin información de profundidad. Hay muchas formas de incluir la información de profundidad en la representación tridimensional de objetos sólidos. Un método simple para indicar la profundidad en las visualizaciones alámbricas consiste en hacer variar el brillo de los segmentos lineales de acuerdo con su distancia con respecto a la posición de visualización. La Figura 7.6 muestra una representación alámbrica de un objeto que incluye pistas de profundidad. Las líneas más próximas a la posición de visualización se muestran con la intensidad más alta, mientras que las líneas más alejadas se van mostrando con intensidades decrecientes. Este tipo de pistas de profundidad se aplican seleccionando unos valores de intensidad máximos y mínimos y un rango de distancias a lo largo de las cuales dicha intensidad puede variar. Otra aplicación de las pistas de profundidad es modelar el efecto de la atmósfera sobre la intensidad percibida de los objetos. Los objetos más distantes parecen más tenues que los objetos más próximos, debido a la dispersión de la luz por parte de las partículas de polvo, de la niebla y del humo. Algunos efectos atmosféricos pueden incluso cambiar el color percibido de un objeto y las pistas de profundidad nos permiten modelar estos efectos.
358
CAPÍTULO 7
Visualizarían tridimensional
FIGURA 7.6. Una representación alámbrica de un objeto con información de profundidad, de modo que el brillo de las lineas disminuye desde la parte frontal del objeto hacia la parle posterior.
Identificación de líneas y superficies visibles También podemos clarificar las relaciones de profundidad en una representación alámbrica de una escena utilizando técnicas distintas de la variación de las intensidades con la distancia. Una posibilidad consiste simplemente en resaltar las lincas visibles o en mostrarlas con un color diferente. Otra técnica, comúnmente utilizada en los dibujos de ingeniería, consiste en mostrar las líneas no visibles como líneas punteadas. También podemos eliminar las líneas no visibles de la imagen como en la Figura 7.5(b) y 7.5(c). Pero al eliminarse las líneas ocultas también se elimina información acerca de la forma de las superficies posteriores de un objeto, y la realidad es que las representaciones alámbricas se utilizan generalmente para obtener una indicación de la apariencia global de un objeto, incluyendo tanto su parte frontal como la posterior. t uando que generar una vista realista de una escena, se eliminan completamente las partes postcriores de los objetos, de modo que sólo se muestran las superficies visibles. En este caso, se aplican procedimientos de representación superficial para que los píxeles de la pantalla sólo contengan la información de color correspondiente a las superficies frontales.
Representación de superficies Puede conseguirse un mayor realismo en las imágenes si se representan las superficies de los objetos utilizando las condiciones de iluminación de una escena y las características asignadas a las superficies. Las condiciones de iluminación se establecen especificando el color y la ubicación de las fuentes de luz, y también pueden definirse efectos de iluminación de fondo. Las propiedades de las superficies de los objetos incluyen, por ejemplo, información sobre si una superficie es transparente u opaca, o si es suave o rugosa. Podemos asignar valores a una serie de parámetros para modelar superficies tales como el cristal, el plástico, superficies de madera veteada o incluso la apariencia rugosa de una naranja. En la Figura 7.7, se combinan métodos de representación superficial junto con técnicas de proyección en perspectiva y de identificación de superficies visibles con el fin de conseguir un alto grado de realismo en la escena mostrada.
FIGURA 7.7 Una visualización realista de una habitación, conseguida mediante una proyección en perspectiva, efectos de iluminación y propiedades
(Cortesía de John Snyder, Jed Lengyel, Devendrá Kalra y Al fían; California Institute of Technology. Copyright O 1992 Caltech.) seleccionadas de la superficie.
7.1 Panorámica de los conceptos de visualización tridimensional
359
Despieces y secciones transversales Muchos paquetes gráficos permiten definir los objetos como estructuras jerárquicas, con lo que pueden almacenarse los detalles internos. Entonces, pueden utilizarse despieces y secciones transversales de dichos objetos para mostrar la estructura interna y las relaciones de las panes del objeto. La Figura 7.8 muestra diferentes tipos de despieces para un diseño mecánico. Una alternativa al despiece de un objeto con el fin de mostrar sus partes componentes consiste en generar una sección transversal, como en la Figura 7.9, que elimina partes de las superficies visibles con.el fin de que se vea la estructura interna.
(6)
(d)
FIGURA 7.8. Una turbina completamente montada (a) puede mostrarse mediante un despiece con representación alámbrica (b), mediante un despiece renderizado (c), o mediante un despiece renderizado con codificación de colores (d). (Cortesía de Autodesk. Inc.)
FIGURA 7.9. Sección transversal con codificación de colores del motor de una segadora, donde se muestra la estructura y las relaciones de los componentes internos. {Cortesia de Autodesk. Inc.)
360
CAPÍTULO 7
Visualización tridimensional
Vísualizacíón tridimensional y estereoscópica Otros métodos para dar una sensación de realismo a una escena inibgráfica incluyen la utilización de monitores tridimensionales y vistas estereoscópicas. Como hemos visto en el Capítulo 2, pueden obtenerse imágenes tridimensionales reflejando una imagen bidimensional en un espejo vibratorio y flexible. Las vibraciones del espejo están sincronizadas con la visualización de la escena en el TRC. A medida que el espejo, la longitud focal varía, de modo que cada punto de la escena se refleja a una posición espacial que se corresponde con su profundidad. Los dispositivos estereoscópicos presentan dos vistas de una escena: una para el ojo izquierdo y la otra para el ojo derecho. Las posiciones de visualización se corresponden con las posiciones de los ojos de la persona que contempla la escena, listas dos vistas se suelen mostrar en ciclos alternativos de refresco de un monitor convencional. Cuando contemplamos el monitor mediante unas gafas especiales que oscurecen alternativamente primero una de las lentes y luego la otra, en sincronización con los cielos de refresco del monitor, se puede ver la escena con un efecto tridimensional.
7.2
PIPELINE DE VISUALIZACIÓN TRIDIMENSIONAL
Los procedimientos para generar una vista infográfica de una escena tridimensional son análogos, hasta cierto punto, a los procesos que tienen lugar cuando se toma una fotografía, lin primer lugar, necesitamos seleccionar una posición de visualización, que se correspondería con el lugar donde situaríamos la cámara. La posición de visualización se seleccionará dependiendo de si queremos mostrar una vista frontal, trasera, lateral, superior o inferior de la escena. También podemos seleccionar una posición en medio de un grupo de objetos o incluso dentro de un único objeto, como por ejemplo un edificio o una molécula. Entonces, debemos decidir cuál debe ser la orientación de la cámara (Figura 7.10). ¿Hacia dónde queremos apuntar la cámara desde la posición de visualización y cómo debemos rotarla con respecto a la línea de visualización con el fin de definir qué dirección de la imagen corresponde a «arriba»? Finalmente, cuando lomamos la fotografia, la escena se recorta al tamaño de una ventana de recorte seleccionada, que se corresponde con la apertura o tipo de objetivo de una cámara, proyectando sólo la luz de las superficies visibles sobre la película fotográfica. Necesitamos tener presente, sin embargo, que la analogía de la cámara no se puede llevar mucho más allá, ya que con un programa infográlico leñemos mucha más flexibilidad y muchas más opciones para generar vistas de una escena que con una cámara real. Podemos decidir utilizar una proyección paralela o en perspectiva, podemos eliminar selectivamente parles de una escena que estén colocadas a lo largo de la línea de visión, podemos alejar el plano de proyección de la posición de la «cámara» e incluso podemos obtener una imagen de los objetos situados detrás de nuestra cámara sintética. Algunas de las operaciones de visualización para una escena tridimensional son iguales o similares a las que se emplean en una pipeline de visualización bidimensional (Sección 6.1). Se utiliza un visor bidimensional para posicionar una vista proyectada de la escena tridimensional sobre el dispositivo de salida, y se emplea y
FIGURA 7.10. La fotografia de una escena implica seleccionar la posición y orientación de la cámara.
7.2 Pipeline de visualización tridimensional
361
una ventana de recorte bidimensional para seleccionar la vista que baya que asignar al visor. También hay que definir una ventana de visualización en coordenadas de pantalla, igual que se hace en las aplicaciones bidimensionales. Las ventanas de recorte, los visores y las ventanas de visualización se suelen especificar como rectángulos con sus lados paralelos a los ejes de coordenadas. Sin embargo, en visualización tridimensional la ventana de recorte se posiciona sobre un plano de visualización seleccionado y las escenas se recortan de acuerdo con un volumen que lo encierra, el cual está definido mediante un conjunto de planos de recorte. La posición de visualización, el plano de visualización, la ventana de recorte y los planos de recorte se especifican con respecto al sistema de coordenadas de visualización. La Figura 7.11 muestra los pasos generales de procesamiento para la creación y transformación de una escena tridimensional a coordenadas de dispositivo. Una vez modelada la escena en coordenadas universales, se selecciona un sistema de coordenadas de visualización cuya descripción de la escena se convierte a este nuevo sistema. El sistema de coordenadas de visualización define los parámetros de visualización, incluyendo la posición y orientación del plano de proyección (plano de visualización), que sería análogo al plano de la película de la cámara. A continuación se define una ventana de recorte bidimensional sobre el plano de proyección, que se correspondería con un objetivo de la cámara seleccionado, y se establece una región de recorte tridimensional. Esta región de recorte se denomina v o l u m e n de v i s u a l i z a c i ó n y su forma y tamaño dependen de las dimensiones de la ventana de recorte, del tipo de proyección que seleccionemos y de las posiciones limite seleccionadas según la dirección de visualización. Después, se realizan operaciones de proyección para convertir la descripción de la escena en coordenadas de visualización a un conjunto de coordenadas sobre el plano de proyección. Los objetos se mapean a coordenadas normalizadas y todas las partes de la escena que caen fuera del volumen de visualización se recortan. Las operaciones de recorte pueden aplicarse después de completar todas las transformaciones de coordenadas independientes del dispositivo (de coordenadas universales a coordenadas normalizadas). De esta forma, las transformaciones de coordenadas pueden confeccionarse con el fin de conseguir la máxima eficiencia. AI igual que en la visualización bidimensional, los límites del visor pueden especificarse en coordenadas normalizadas o en coordenadas del dispositivo. A la hora de desarrollar los algoritmos de visualización, asumiremos qué hay que especificar del visor en coordenadas del dispositivo y que las coordenadas normalizadas deben transferirse a coordenadas del visor después de las operaciones de recorte. Hay otras cuantas tareas que es preciso llevar a cabo, como especificar las superficies visibles y aplicar los procedimientos de representación superficial. El paso final consiste en establecer la correspondencia entre las coordenadas del visor y las coordenadas del dispositivo, dentro de una ventana de visualización seleccionada. Las descripciones de la escena en coordenadas del dispositivo se expresan en ocasiones con un sistema de referencia que cumple la regia de la mano izquierda, de modo que pueden utilizarse distancias positivas con respecto a la pantalla de visualización para medir los valores de profundidad de la escena.
—i»
^
Transformación de modelado
Transformación de proyección
CP
Transformación de visualización
Transformación de normalización y recorte
CV
CN
Transformación de visor
CD
FIGURA 7.11. Pipeline general tridimensional de translómiación de la imagen, desde las coordenadas de modelado a las coordenadas universales y desde éstas a las coordenadas de visualización y a las coordenadas de proyección. Finalmente, se efectúa la transformación a coordenadas normalizadas y después a coordenadas del dispositivo.
362
CAPÍTULO 7
Visualización tridimensional
7.3 PARÁMETROS DE COORDENADAS DE VISUALIZACIÓN TRIDIMENSIONAL Establecer un sistema de referencia de visualización tridimensional es similar al caso bidimensional analizado en la Sección 6.2. Primero se selecciona una posición en coordenadas universales P = (x^y^ z ) para el origen de la visualización, que se denominará p u n t o de v i s t a o p o s i c i ó n de v i s u a l i z a c i ó n . (Algunas veces el punto de vista también se denomina posición del ojo o posición de la cámara.) También se especifican un v e c t o r v e r t i c a l V, que define la dirección v . Para un espacio tridimensional, necesitamos también asignar una dirección para uno de los dos restantes ejes de coordenadas. Esto se suele llevar a cabo con un segundo vector que define el eje z , estando la dirección de visualización definida sobre este eje. La Figura 7.12 ilustra el posicionamiento de un sistema de referencia de visualización tridimensional dentro de un sistema de coordenadas universales. ()
()
v j e w
v j c w
Vector normal del plano de visualización Puesto que la dirección de visualización suele estar definida según el eje z , normalmente se asume que el p l a n o de v i s u a l i z a c i ó n , también llamado p l a n o de p r o y e c c i ó n , es perpendicular a este eje. Así, la orientación del plano de visualización y la dirección del eje z positivo pueden definirse mediante un v e c t o r n o r m a l d e l p l a n o de v i s u a l i z a c i ó n IN, como se muestra en la Figura 7.13. Se utiliza un parámetro escalar adicional para establecer la posición del plano de visualización en un cierto valor de coordenada z según el eje z , como se ilustra en la Figura 7.14. Este parámetro se suele especificar como una distancia con respecto al origen de visualización según la dirección de visualización, que normalmente se toma en la dirección v¡ev, negativa. Así, el plano de visualización es siempre paralelo al plano -* ¡ V y la proyección de los objetos sobre el plano de visualización se corresponde con la vista de la escena que se mostrará en el dispositivo de salida. El vector N puede especificarse de diversas formas. En algunos sistemas gráficos, la dirección de N se define según la línea que va del origen de coordenadas universales hasta un punto seleccionado. Otros sistemas definen N en la dirección que va desde un punto de referencia P hasta el origen de coordenadas de visualización P , como en la Figura 7.15. En este caso, el punto de referencia suele denominarse punto observado de la escena, siendo la dirección de visualización opuesta a la dirección de N. También podríamos definir el vector normal al plano de visualización, y otras direcciones de vectores, utilizando ángulos de dirección. Estos son los tres ángulos a, /} y y que una línea espacial forma con los ejes y y z, respectivamente. Pero normalmente resulta bastante más fácil especificar la dirección de un vector mediante dos puntos de una escena que mediante los ángulos de dirección. v i e w
v j e w
yfj
v i c w
z
v
ew
view
r e f
0
FIGURA 7.12. Un sistema de coordenadas de visualización que cumple la regla de la mano derecha, con ejes *view'->W* y ^icw sistema de referencia en coordenadas universales que también cumple la regla de la mano derecha. r c l a t i v o a un
FIGURA 7.13. Orientación del plano de visualización y del vector normal a dicho plano N.
- Plano de \isualización
7.3 Parámetros de coordenadas de visualización tridimensional
363
FIGURA 7.14. Tres posibles posiciones para el piano de visualización según el eje z . view
FIGURA 7.15. Especificación del vector normal al plano de visualización N como la dirección desde un punto de referencia seleccionado P hasta el origen de las coordenadas de visualización P . ref
()
El vector vertical Una vez seleccionado el vector normal al plano de visualización N, podemos establecer la dirección del vector vertical V. Este vector se emplea para establecer la dirección positiva del e j e . y ¡ . Usualmente, V se define seleccionando una posición relativa al origen de coordenadas universales, de modo que la dirección del vector vertical va desde el origen de coordenadas universales a dicha posición seleccionada. Puesto que el vector normal al plano de visualización N define la dirección del eje 2 , el vector V debe ser perpendicular a N. Pero, en general, puede resultar difícil determinar una dirección de V que sea precisamente perpendicular a N. Por tanto, las rutinas de visualización suelen ajustar la dirección del vector V definida por el usuario como se muestra en la Figura 7.16, de modo que se proyecta V sobre un plano que sea perpendicular al vector normal al plano de visualización. v
ew
v
i
e
w
Podemos seleccionar la dirección que queramos para el vector vertical V, siempre y cuando éste no sea paralelo a N. Una elección conveniente suele ser según una dirección paralela al eje universal y \ en otras ibras, podemos definir V = (0, 1, 0). w
¡istema de referencia de coordenadas de visualización uvn En los paquetes gráficos se utilizan en ocasiones coordenadas de visualización que cumplen la regla de la mano izquierda, estando la visualización definida en la dirección z . Con un sistema que cumpla la regla de la mano izquierda, los valores crecientes de z representan puntos progresivamente más alejados de la posición de visualización, según la línea de visión. Pero suelen ser más comunes ios sistemas de visualización v i e w
v ¡ e w
FIGURA 7.16. Ajuste de la dirección de entrada del vector vertical V a una orientación perpendicular al vector normal al plano de visualización N.
364
CAPÍTULO 1
visualización tridimensional
que cumplen la regla de la mano derecha, ya que éstos tienen la misma orientación que el sistema de referencia en coordenadas universales. Eslo permite que el paquete gráfico sólo tenga que tratar con una única orientación de coordenadas tanto para el sistema de referencia universal como para el de visualización. Aunque algunos de los primeros paquetes gráficos que aparecieron definían las coordenadas de visualización mediante un sistema de referencia que cumplía la regla de la mano izquierda, los estándares gráficos actuales deciden las coordenadas de visualización sobre la regla de la mano derecha. De todos modos, a menudo se emplean sistemas de referencia que cumplen la regla de la mano izquierda para representar las coordenadas de pantalla y para la transformación de nonnalización. Puesto que la normal al plano de visualización N define la dirección del eje z y el vector vertical V se utiliza para obtener la dirección del e j e . y , lo único que nos queda es determinar la dirección del e j e * . Utilizando los valores introducidos para N y V, calculamos un tercer vector U que sea perpendicular tanto a N como a V. El vector U definirá entonces la dirección del eje . v positivo. Podemos determinar la dirección correcta de U realizando el producto vectorial de V y N de modo que se genere un sistema de referencia de visualización que cumpla la regla de la mano derecha. El producto vectorial de N y U también nos permite obtener el valor ajustado de V, que será perpendicular tanto a N como a U, según el eje v positivo. De acuerdo con estos procedimientos, se obtiene el siguiente conjunto de vectores unitarios de coordenadas para un sistema de coordenadas de visualización que cumpla la regla de la mano derecha: v i e w
view
v i e w
vicw
v i e w
v = nxu=(v
| 1
v ,r ) v
:
El sistema de coordenadas formado por estos tres vectores unitarios se suele denominar sistema de referencia uvn de coordenadas de visualización (Figura 7.17).
Generación de efectos de visualización tridimensionales Variando los parámetros de visualización, podemos obtener diferentes vistas de los objetos de una escena. Por ejemplo, desde una posición de visualización fija, podríamos cambiar la posición de N para mostrar los objetos situados en las posiciones que rodean el origen del sistema de coordenadas de visualización. También podemos variar N para crear una imagen compuesta que contenga múltiples vistas tomadas desde una posición de cámara fija. La Figura 7.18 muestra una imagen de gran angular creada para un entorno de realidad virtual. El efecto de gran angular se consigue generando siete vistas de la escena desde la misma posición de visualización, pero con pequeños desplazamientos de la dirección de visualización y combinando luego las vistas con el fin de mostrar una imagen compuesta. De forma similar, podemos generar vistas estereoscópicas desplazando la dirección de visualización. En este caso, sin embargo, también tendremos que desplazare! punto de vista para simular la posición de los dos ojos.
u -*vicw
z
vicw
FIGURA 7.17. Un sistema de visualización que cumple la regla de la mano derecha, definido mediante los vectores unitarios u, v y n.
7.3 Parámetros de coordenadas de visualizaáón tridimensional
365
FIGURA 7.18. Una vista de gran angular para imagen de realidad virtual generada con siete secciones, cada una producida con una dirección de visualización ligeramente distinta. (Cortesía del National Center for Sapercomputing Applications, Universidad de Illinois en Urbana-Champaign.)
N
N FIGURA 7.19. Panorámica de una escena, obtenida cambiando la posición de visualización, pero conservando una posición fija para N. En las aplicaciones interactivas, el vector normal N es el parámetro de normalización que más a menudo se suele cambiar. Por supuesto, cuando cambiamos la dirección de N, también tenemos que cambiar los vectores de los otros ejes, con el fin de mantener un sistema de referencia dé visualización que cumpla la regla de la mano derecha. Si queremos simular un efecto panorámico de animación, como por ejemplo cuando una cámara se mueve a través de una escena o sigue a un objeto que se está moviendo a través de una escena, podemos mantener la dirección N fija a medida que desplazamos el punto de vista, como se ilustra en la Figura 7.19. Y para mostrar diferentes vistas de un objeto, como por ejemplo una vista lateral y una vista frontal, podemos mover el punto de vista alrededor del objeto, como en la Figura 7.20. Alternativamente, pueden generarse diferentes vistas de un objeto de un grupo de objetos utilizando transformaciones geométricas, sin cambiar los parámetros de visualización. La Figura 7.21 muestra una interfaz desarrollada para la selección interactiva de los valores de los parámetros de visualización. Este software incluye un editor de visualización, mecanismos de selección de múltiples ventanas de visualización, menús y otras herramientas de interfaz.
366
CAPÍTULO 7
Visualización tridimensional
FIGURA 7.20. Visualización de un objeto desde diferentes direcciones utilizando un punto de referencia fijo.
t
• *y*s
FIGURA 7.21. Una interfaz interactiva para controlar los parámetros de visualización, desarrollada en la Universidad de Manchester utilizando la herramienta PH1GS Toolkit. (Cortesía de T. L. J. Howard. J. G Williams y W. T. Hewitt, Department of Computer Science, Universidad de Manchester, Reino Unido.)
7.4 TRANSFORMACIÓN DE COORDENADAS UNIVERSALES A COORDENADAS DE VISUALIZACIÓN En la pipeline de visualización tridimensional, el primer paso después de construir una escena consiste en transferir las descripciones de los objetos al sistema de coordenadas de visualización. Esta conversión de las descripciones de los objetos es equivalente a una secuencia de transformaciones que superpone el sistema de
7.4
Transformación de coordenadas universales a coordenadas de visualización
367
coordenadas de visualización sobre el sistema de coordenadas universales. Podemos realizar esta conversión utilizando los métodos de transformación de sistemas de coordenadas descritos en la Sección 5.15: (1)
Desplazar el origen de coordenadas de visualización al origen del sistema de coordenadas universales.
(2)
Aplicar rotaciones para alinear los ejes # y y z respeclivamente. w
v i e w
,y
y z
v i e w
v i e w
con los ejes de coordenadas universales x , w
w%
El origen de coordenadas de visualización se encuentra en la posición P = {x y , z ) en coordenadas universales. Por tanto, la matriz para desplazar el origen de coordenadas de visualización al origen de coordenadas universales es: tí>
()
{)
-x, —v,
T=
(7.2)
Para la transformación de rotación, podemos utilizar los vectores unitarios u, v y n para formar la matriz de rotación compuesta que superpone los ejes de visualización sobre el sistema de referencia universal. Esta matriz de transformación es:
R= n
%
u.
0
%
v
0
;
n, ti. y 0 0
X
0
(7.3)
0 1
La matriz de transformación de coordenadas se obtiene entonces calculando el producto de las dos matrices anteriores de desplazamiento y de rotación:
M.
- u P„
V.
-v P „
n
- n P„
ü
1
;
0
0
Los factores de desplazamiento de esta matriz se calculan como el producto escalar de cada uno de los vectores unitarios u, v y n por P , que representa un vector que va desde el origen de coordenadas universales hasta el origen de coordenadas de visualización. En otras palabras, los factores de desplazamiento son el negado de las proyecciones de Pk sobre cada uno de los ejes de coordenadas de visualización (el negado de las componentes de P en coordenadas de visualización). Estos elementos de la matriz se evalúan de la forma siguiente: 0
0
7 5
-u-P =-x u -y u .-z, u ü
0
x
ll
s
)
:
i )
-HS -n-P =-x n -y n .-z, n t)
t}
A
t)
s
t
:
La Matriz 7.4 transfiere las descripciones de los objetos en coordenadas universales al sistema de referencia de visualización.
368
CAPITULO 7 Visualización tridimensional
7.5 TRANSFORMACIONES DE PROYECCIÓN En la siguiente fase de la pipeline de visual i/ación tridimensional, después de realizada la transformación a coordenadas de visualización, las descripciones de los objetos se proyectan sobre el plano de visualización. Los paquetes gráficos soportan en general tanto proyecciones paralelas como en perspectiva. En una proyección paralela, las coordenadas se transfieren al plano de visualización según una serie de lincas paralelas. La Figura 7.22 ilustra una proyección paralela para un segmento de línea recta definido mediante los extremos P, y P . Una proyección paralela preserva las proporciones relativas de los objetos, y éste es el método utilizado en diseño asistido por computadora con el fin de generar imágenes a escala de objetos tridimensionales. Todas las líneas paralelas de una escena se muestran como paralelas cuando se las conlempla mediante una proyección paralela. Hay dos métodos generales para obtener una vista de proyección paralela de un objeto: podemos proyectar el objeto según líneas que sean perpendiculares al plano de visualización, o podemos utilizar un ángulo oblicuo con respecto al plano de visualización. Para una proyección en perspectiva, las posiciones de los objetos se transforman a las coordenadas de proyección según una serie de líneas que convergen en un punto situado detrás del plano de visualización. En la Figura 7.23 se proporciona un ejemplo de proyección en perspectiva para un segmento de línea recta definido mediante los extremos P, y P A diferencia de una proyección paralela, la proyección en perspectiva no preserva las proporciones relativas de los objetos. Sin embargo, las vistas en perspectiva de una escena son más realistas, porque los objetos distantes tienen un tamaño más pequeño en la imagen proyectada. 2
v
7.6 PROYECCIONES ORTOGONALES Una transformación de un objeto a un plano de visualización según líneas paralelas al vector normal al plano de visualización N se denomina proyección ortogonal (o también proyección ortográfica). Esto produce una transformación de proyección paralela en la que las líneas de proyección son perpendiculares al plano de visualización. Las proyecciones ortogonales se suelen utilizar para generar las vistas frontal, lateral y superior de un objeto, como se muestra en la Figura 7.24. Las proyecciones ortogonales frontal, lateral y posterior de un objetos se denominan elevaciones, mientras que una proyección ortogonal superior se denomina vis/a plana. Los gráficos de ingeniería y arquitectura suelen emplear estas proyecciones ortográficas, ya
Plano de
FIGURA 7.22. Proyección paralela de un segmento de línea sobre un plano de visualización. Plano de visualización
FIGURA 7.23. Proyección en perspectiva de un segmento de línea sobre un plano de visualización.
7.6 Proyecciones ortogonales
369
Visia de elevación frontal
FIGURA 7.24. Proyecciones ortogonales de un objeto, donde se muestran la vista plana y las vistas de elevación. que las longitudes y los ángulos se representan de manera precisa y pueden medirse a partir de los propios gráficos.
Proyecciones ortogonales axonométricas e isométricas También podemos formar proyecciones ortogonales que muestren más de una cara de un objeto. Dichas vistas se denominan proyecciones ortogonales axonométricas. La proyección axonométrica más comúnmente utilizada es la proyección isométrica, que se genera alineando el plano de proyección (o el objeto) de modo que el plano intersecte todos los ejes de coordenadas sobre los que está definido el objeto, denominados ejes principales, a la misma distancia del origen. La Figura 7.25 muestra una proyección isométrica de un cubo. Podemos obtener la proyección isométrica mostrada en esta figura alineando el vector normal al plano de visualización según una diagonal del cubo. Hay ocho posiciones, una en cada octante, para obtener una vista isométrica. Los tres ejes principales se acortan de forma igual en una proyección isométrica, por lo que se mantienen las proporciones relativas. Este no es el caso en una proyección axonométrica general, donde los factores de escala pueden ser diferentes para las tres direcciones principales.
Coordenadas de proyección ortogonal Con la dirección de proyección paralela al eje z , las ecuaciones de transformación para una proyección ortogonal son triviales. Para cualquier posición (* .v, z) como en la Figura 7.26, las coordenadas de proyección serán: v j c w
t
t
y =y P
Wl
El valor de la coordenada z para cualquier transformación de proyección se preserva para su uso en los procedimientos de determinación de la visibilidad. Y cada punto en coordenadas tridimensionales de una escena se convierte a una posición dentro del espacio normalizado.
370
CAPÍTULO 7
Visualizarían tridimensional
FIGURA 7.25. Una proyección isométrica de un cubo.
Plano de visualizaeión
FIGURA 7.26. Proyección ortogonal de un punto en el espacio sobre un plano de visualizaeión.
Ventana de recorte y volumen de visualizaeión de proyección ortogonal En la analogía de la cámara, el tipo del objetivo es uno de los factores que determina la cantidad de la escena que se transfiere al plano de la película. Un objetivo de gran angular permite captar una parte mayor de la escena comparado con un objetivo normal. En las aplicaciones infográficas, empleamos para este propósito la ventana de recorte rectangular. Al igual que la visualizaeión bidimensional, los paquetes gráficos sólo suelen permitir utilizar rectángulos de recorte en posición estándar. Por tanto, definimos una ventana de recorte para la visualizaeión tridimensional exactamente igual que lo hacíamos para el caso bidimensional, seleccionando posiciones de coordenadas bidimensionales para las esquinas inferior izquierda y superior derecha. Para visualizaeión tridimensional, la ventana de recorte se posiciona sobre el plano de visualizaeión, con sus lados paralelos a los ejes A e . y ¡ , como se muestra en la Figura 7.27. Si queremos utilizar alguna otra forma geométrica o alguna otra orientación para la ventana de recorte, será necesario que desarrollemos nuestros propios procedimientos de visualizaeión. Los lados de la ventana de recorte especifican los límites x ey para la parte de la escena que queremos mostrar. Estos límites se emplean para formar los lados superior, inferior y laterales de una región de recorte denominada volumen de visualizaeión de proyección ortogonal. Puesto que las líneas de proyección son perpendiculares al plano de visualizaeión, estos cuatro límites son planos también perpendiculares al plano de visualizaeión y que pasan por las aristas de la ventana de recorte, formando una región de recorte infinita, como se ilustra en la Figura 7.28. Podemos limitar la extensión del volumen de visualizaeión ortogonal en la dirección z seleccionando las posiciones de uno o dos planos limitantes adicionales que sean paralelos al piano de visualizaeión. Estos dos planos se denominan plano de recorte próximo-lejano o planos de recorte frontal-posterior. Los planos próximo y lejano nos permiten excluir objetos que se encuentren delante o detrás de aquella parte de la escena que queremos mostrar. Con la dirección de visualizaeión definida según el ejez ¡ negativo, normalv j c w
v
ew
v i e w
7.6 Proyecciones ortogonales 3 7 1
Plano de visualización
I
Ventana de recorte
FIGURA 7.27. Una ventana de recorte sobre el plano de visualización, en la que las coordenadas mínimas y máximas se especifican en el sistema de referencia de visualización.
•view
Ventana de recorte
Vista superior (b)
Vista lateral (a)
FIGURA 7.28. Volumen de visualización infinito para proyección ortogonal.
Volumen de visualización ara proyección ortogonal
Plano próximo
FIGURA 7.29. Un volumen de visualización ortogonal finito con el plano de visualización «delante» del plano próximo.
mente tendremos z < z . de modo que el plano lejano está más alejado según el eje z negativo. Algunas bibliotecas gráficas proporcionan estos dos planos como opciones, mientras que otras bibliotecas exigen que se utilicen. Cuando se especifican los planos próximo y lejano, se obtiene un volumen de visualización ortogonal finito que es un paralelepípedo rectangular, como se muestra en la Figura 7.29, donde también se indica una posible colocación del plano de visualización. Nuestra vista de la escena contendrá entonces únicamente aquellos objetos que se encuentren dentro del volumen de visualización, eliminándose mediante los algoritmos de recorte todas aquellas partes de la escena que caigan fuera del volumen de visualización. far
n e a r
v i e w
372
CAPITULO 7
Visualización tridimensional
Los paquetes gráficos proporcionan diversos grados de flexibilidad a la hora de situar los planos de recorte próximo y lejano, incluyendo opciones para especificar planos de recorte adicionales en otras posiciones de la escena. En general, los planos próximo y lejano pueden estar situados en cualquier posición relativa entre sí, con el fin de conseguir diversos efectos de visualización, incluyendo posiciones que se encuentren en lados opuestos del plano de visualización. De forma similar, el plano de visualización puede en ocasiones situarse en cualquier posición relativa a los planos de recorte próximo y lejano, aunque a menudo suele coincidir con el plano de recorte próximo. Sin embargo, al proporcionar numerosas opciones de posicionamiento para los planos de recorte y de visualización, los paquetes gráficos suelen perder eficiencia a la hora de procesar escenas tridimensionales.
Transformación de normalización para una proyección ortogonal Utilizando una transferencia ortogonal de las coordenadas sobre el plano de visualización, obtenemos la proyección proyectada de cualquier punto del espacio (x, y, z) como simplemente (x, y). Así, una vez establecidos los límites del volumen de visualización, las coordenadas dentro de este paralelepípedo rectangular serán las coordenadas de proyección y pueden mapearse sobre un volumen de visualización normalizado sin necesidad de efectuar ningún procesamiento de proyección adicional. Algunos paquetes gráficos utilizan un cubo unitario para este volumen de visualización normalizado, normalizándose cada una de las coordenadas x,y y z en el rango que va de 0 a 1. Otra técnica para la transformación de normalización consiste en utilizar un cubo simétrico, con las coordenadas en el rango que va de —1 a 1. Puesto que las coordenadas de pantalla se suelen especificar según un sistema de referencia que cumple con la regla de la mano izquierda (Figura 7.30), las coordenadas normalizadas también suelen especificarse de la misma forma. Esto permite interpretar directamente las distancias en la dirección de visualización como distancias con respecto a la pantalla (el plano de visualización). Así, podemos convertir las coordenadas de proyección en posiciones dentro de un sistema de referencia normalizado que cumple la regla de la mano izquierda, y estas coordenadas se transformarán entonces mediante la transformación de visor en coordenadas de pantalla según un sistema que cumpla la regla de la mano izquierda. Para ilustrar la transformación de nonnalización vamos a suponer que el volumen de visualización para proyección ortogonal debe asignarse al cubo de normalización simétrico dentro de un sistema de referencia que cumpla la regla de la mano izquierda. Asimismo, las posiciones de la coordenada z para los planos próximo y lejano se designan mediante z y z , respectivamente. La Figura 7.31 ilustra esta transformación de n e a r
rar
Ventana de visualización
FIGURA 7,30. Un sistema de coordenadas de pantalla que cumple la regla de la mano izquierda.
7.6 Proyecciones ortogonales 373 Volumen de visualizaeión para proyección ortogonal
3 'vic»
( - 1 , -1. - I )
Volumen ele visualizaeión normalizado
RGURA7.31. Transformación de normalización desde un volumen de visualizaeión de proyección ortogonal al cubo de normalización simétrico, dentro de un sistema de referencia que cumple la regla de la mano izquierda. normalización. La posición ( • * » . v ¡ , z ) se mapea sobre la posición normalizada (- 1, - I, - 1 ) y la posición U , v , z ) se mapea sobre ( 1 , 1 , 1 ) . La transformación del volumen de visualizaeión paralelepipédico rectangular en un cubo normalizado es similar a los métodos analizados en la Sección 6.3 para convertir la ventana de recorte en un cuadrado simétrico normalizado. La transformación de normalización para las posiciones x cy dentro del volumen de visualizaeión ortogonal está dada por la matriz de normalización 6.9. Además, tenemos que transformar los valores de la coordenada z desde el rango que va de z a z al intervalo que va de - 1 a 1, utilizando cálculos similares. mm
m a x
m a x
m
n
near
far
n u a r
f a r
Por tanto, la transformación de normalización para el volumen de visualizaeión ortogonal es:
0 •
W
„ „ « - -
W
m i n
0
6 .v»'
IVTonhit. muñí
0
n u >
-w „
(7.7)
m i
-2 iieíu
0
*'fni
0
tirar
* £fw
**nc¿u
**rar
l
Esta matriz se multiplica a la derecha por la transformación de visualizaeión compuesta RT (Sección 7.4) para realizar la transformación completa desde coordenadas universales a coordenadas normalizadas de proyección ortogonal. En este etapa de la pipelim de visualizaeión, todas las transformaciones de coordenadas independientes del dispositivo se habrán completado y podrán concatenarse en una única matriz compuesta. Por tanto, la manera más eficiente de realizar los procedimientos de recorte consiste en aplicarlos después de la transformación de normalización. Después del recorte, pueden aplicarse los procedimientos de comprobación de la visibilidad, de representación de superficie y de transformación de visor para generar la imagen final de la escena en pantalla.
374 CAPÍTULO 7 Visualiza don tridimensional
7.7 PROYECCIONES PARALELAS OBLICUAS En general, una vista en proyección paralela de una escena se obtiene transfiriendo las descripciones de los objetos al plano de visuali/ación según unas trayectorias de proyección que pueden tener cualquier dirección relativa seleccionada con respecto al vector normal del plano de visuali/ación. Cuando la ruta de proyección no es perpendicular al plano de visualización, esta proyección se denomina proyección paralela oblicua. Utilizando este tipo de proyección, podemos combinar distintas vistas de un objeto, como la vista frontal, lateral y superior que se muestran en la Figura 7.32. Las proyecciones paralelas oblicuas se definen utilizando un vector de dirección para las lineas de proyección, y esta dirección puede especificarse de varias formas.
Proyecciones paralelas oblicuas en diseño Para aplicaciones de diseño de ingeniería y arquitectura, la proyección oblicua paralela se especifica a menudo mediante dos ángulos, a y 0, como se muestra en la Figura 7.33. Una posición del espacio (x, y, z) se proyecta sobre (x >y>p z ) en un plano de visualización, que estará situado en la ubicación z según el eje de visualización z. La posición (x,\\ z ) es el punto correspondiente de proyección ortogonal. La línea de proyección paralela oblicua que va de (x, j>, z) a (x y , z ) tiene un ángulo de intersección a con la línea del plano de proyección que une (x y , z ) y (x/y, z ). Esta línea del plano de visualización, de longitud ¿, forma un ángulo )con la dirección horizontal del plano de proyección. Al ángulo a puede asignársele un valor entre 0 y 90" y el ángulo (¡> puede variar entre 0 y 360°. Podemos expresar las coordenadas de proyección en términos d e * , y, L y (pac la forma siguiente: p
vp
v¡¡
vp
p%
py
p
vp
p
Vf/
X = A + ¿COS0 r
y
p
7
( -^)
=y + ¿ s i n 0
La longitud L depende del ángulo a y de la distancia perpendicular del punto (x,y\ z) con respecto al plano de visualización:
tana = ——
(7.9)
L
Así,
(7JO) tan a
donde ¿j = cot a, que también es el valor de /. cuando z + z == 1. Podemos entonces escribir las Ecuaciones 7.8 de proyección paralela oblicua como: vp
x^x + L^-z^ostp
(7-//)
Podemos ohtener una proyección ortogonal cuando ¿ = 0 (lo que ocurre para el ángulo de proyección a = 90°). Las Ecuaciones 7.11 representan una transformación de inclinación según el eje z (Sección 5.14). De hecho, el efecto de una proyección paralela oblicua consiste en desplazar los planos de z constante y proyectarlos sobre el plano de visualización. Las posiciones (x, y) sobre cada plano de z constante se desplaza según una cantidad proporcional a la distancia de un plano con respecto al plano de visualización, de modo que todos los ángulos, distancias y líneas paralelas del plano se proyectan de manera precisa. Este efecto se muestra en (
7.7 Proyecciones paralelas oblicuas 3 7 5
FIGURA 7.32. Una proyección paralela oblicua de un cubo, mostrada en una vista superior (a), puede producir una vista (b) que contenga múltiples superficies del cubo.
(x.y, z)
FIGURA7.33. Proyección paralela oblicua del punto (*, v, z) a la posición (x ,y , z^) sobre un plano de proyección situado en la posición z según el eje z . p
¡t
vicw
Plano de visualización
Plano de visualízación
(a)
(b)
FIGURA 7.34. Una proyección paralela oblicua (a) de un cubo (vista superior) sobre un plano de visualización que coincide con la cara frontal del cubo. Esto produce la combinación de vistas frontal, lateral y superior que se muestra en (b).
376
CAPÍTULO 7
Visualización tridimensional
la Figura 7.34, donde el plano de visualización está situado sobre la cara frontal de un cubo. La cara posterior del cubo se proyecta y solapa con el plano frontal sobre la superficie de visualización. Una arista lateral del cubo que conecte los planos frontal y posterior se proyectará para formar una línea de longitud A, que formará un ángulo
Perspectivas caballera y cabinet Las selecciones típicas para el ángulo
Vector de proyección paralela oblicua En las bibliotecas de programación gráfica que soportan proyecciones paralelas oblicuas, la dirección de proyección sobre el plano de visualización se especifica mediante un vector de proyección paralela V^. Este vector de dirección puede definirse mediante una posición de referencia relativa al punto de vista, como hicimos con el vector normal al plano de visualización, o mediante cualesquiera otros puntos. Algunos paquetes utilizan un punto de referencia relativo al centro de la ventana de recorte con el fin de definir la dirección de la proyección paralela. Si el vector de dirección se especifica en coordenadas universales, primero habrá que transformarlo a coordenadas de visualización utilizando la matriz de rotación descrita en la Sección 7.4 (el
FIGURA 7.35. Proyección caballera de un cubo sobre un plano de visualización para dos valores del ángulo <¡>. La profundidad del cubo se proyecta con una longitud igual a la de la anchura y la (a)
FIGURA 7.36. Perspectiva cabinet de un cubo sobre un plano de visualización para dos valores del ángulo a. La profundidad se proyecta con una longitud igual a la mitad de la anchura y altura del cubo.
(a)
(b>
7.7 Proyecciones paralelas oblicuas 377
vector de proyección no se ve afectado por el desplazamiento, ya que se trata simplemente de una dirección sin ninguna posición lija). Una vez establecido el vector de proyección en coordenadas de visualización, todos los puntos de la escena se transfieren al plano de visualización según una serie de líneas que son paralelas a este vector. La Figura 7.37 ilustra la proyección paralela oblicua de un punto en el espacio sobre el plano de visualización. Podemos denotar las componentes del vector de proyección con respecto al sistema de coordenadas de visualización como = (V V , Vp ), donde Vp/Vp tan
pxy
;
pv
Z
X
v
fca
-
Y podemos escribir el equivalente de las Ecuaciones 7.11 de proyección paralela oblicua en términos del vector de proyección, como:
(7.12)
Las coordenadas de proyección paralela oblicua de la Ecuación 7.12 se reducen a las coordenadas de proyección ortogonal de la Ecuación 7.6 cuando V = V = 0. px
py
Ventana de recorte y volumen de visualización de proyección paralela oblicua El volumen de visualización para una proyección paralela oblicua se define utilizando ios mismos procedimientos que en la proyección ortogonal. Seleccionamos una ventana de recorte sobre el plano de visualización con las coordenadas (• w j *.yH' ¡ ) y t*vv , ^ v v ) , que especifican las esquinas inferior izquierda y r
m
n
m
n
max
mux
378
CAPÍTULO 7
Visualización tridimensional Ventana de recorte Piano de visualización
l ^ P l a n o próximo
Plano lejano
FIGURA 7.38. Vista superior de un volumen de visualización finito para una proyección paralela oblicua en la dirección del vector V . /(
superior derecha del rectángulo de recorte. Las partes superior, inferior y laterales del volumen de visualización se definen entonces mediante la dirección de proyección y los lados de la ventana de recorte. Además, podemos limitar la extensión del volumen de visualización añadiendo un plano próximo y otro lejano, como en la Figura 7.38. El volumen de visualización finito para proyección paralela oblicua es un paralelepípedo oblicuo. Las proyecciones paralelas oblicuas pueden verse afectadas por los cambios en la posición del plano de visualización, dependiendo de cómo haya que especificar la dirección de proyección. En algunos sistemas, la dirección de proyección paralela oblicua es paralela a la línea que conecta el punto de referencia con el centro de la ventana de recorte. Por tanto, si se mueve la posición del plano de visualización o de la ventana de recorte sin ajustar el punto de referencia, cambiará la forma del volumen de visualización.
Matriz de transformación para proyección paralela oblicua Utilizando los parámetros del vector de proyección de las Ecuaciones 7.12, podemos expresar los elementos de la matriz de transformación para una proyección paralela oblicua como: 77
0
% M
iihli ui4
0
I
v„.
%
% i %V,.
(7.13)
o o o o Esta matriz desplaza los valores de las coordenadas x cy según una cantidad proporcional a la distancia con respecto al plano de visualización, que se encuentra en la posición z sobre el eje z ¡ . Los valores z de los puntos del espacio no se ven modificados. Si V = V - 0, tendremos una proyección ortogonal y la Matriz 7.13 se reduce a la matriz identidad. Para una proyección paralela oblicua general, la Matriz 7.13 representa una transformación de inclinación según el eje z. Todos los puntos dentro del volumen de proyección oblicuo se verán inclinados según una cantidad proporcional a su distancia con respecto al plano de visualización. El efecto obtenido es la inclinación del volumen de visualización oblicuo. El efecto obtenido es la inclinación del volumen de visualización oblicuo para obtener un paralelepípedo rectangular, como se ilustra en la Figura 7.39. Así, los puntos dentro del v¡}
px
py
v
e w
7.8 Proyecciones en perspectiva Ventana de recorte
Plano de visualización
379
Ventana de recorte
Plano lejano (a) Volumen de visualización para proyección oblicua
(b) Volumen de visualización oblicuo transformado
FIGURA 7.39. Vista superior de una transformación de proyección paralela oblicua. E! volumen de visualización para proyección oblicua se convierte en un paralelepípedo rectangular y los objetos del volumen de visualización, como por ejemplo el bloque verde, se asignan a coordenadas de proyección ortogonal. volumen de visualización se proyectarán para obtener las coordenadas de proyección ortogonal mediante la transformación de proyección paralela oblicua.
Transformación de normalización para una proyección paralela oblicua Puesto que las ecuaciones de proyección paralela oblicua convierten las descripciones de los objetos a coordenadas ortogonales, podemos aplicar los procedimientos de normalización después de esta transformación. El volumen de visualización oblicuo habrá sido convertido en un paralelepípedo rectangular, por lo que utilizaremos los mismos procedimientos que en la Sección 7.6. Siguiendo el ejemplo de normalización de la Sección 7.6, volvemos a realizar el mapeo sobre el cubo normalizado simétrico, dentro de un sistema de coordenadas que cumpla la regla de la mano izquierda. Así, la transformación completa desde coordenadas de visualización a coordenadas normalizadas para una proyección paralela oblicua será:
Múb)ii|UC,norm
M ortlw.norm
(7.14)
-M oblique
La transformación M es la Matriz 7.13, que convierte la descripción de la escena a coordenadas de proyección ortogonal, y la transformación M es la Matriz 7.7, que mapea el contenido del volumen de visualización ortogonal sobre el cubo de normalización simétrico. Para completar las transformaciones de visualización (con la excepción del mapeo a coordenadas de pantalla del visor), concatenamos la Matriz 7.14 a la izquierda de la transformación M de la Sección 7.4. Después podemos aplicar las rutinas de recorte al volumen de visualización normalizado, tras lo cual determinaremos los objetos visibles, aplicaremos los procedimientos de representación de superficies y realizaremos la transformación de visor. ob)ique
o n n o n o r m
w c v c
7.8 PROYECCIONES EN PERSPECTIVA Aunque una vista en proyección paralela de una escena es fácil de generar y preserva las proporciones relativas de los objetos, no proporciona una representación realista. Para simular la imagen de una cámara, lene-
380
CAPÍTULO 7
Visualización tridimensional
FIGURA 7.40. Proyección en perspectiva de dos segmentos lineales de igual longitud situados a diferentes distancias del plano de visuali/ación. mos que considerar que los rayos de luz reflejados en los objetos de la escena describen una serie de trayectos convergentes hasta el plano de la película de la cámara. Podemos aproximar este efecto de óptica geométrica proyectando los objetos hasta el plano de visuali/ación según una serie de trayectorias convergentes dirigidas al denominado punto de referencia de proyección (o centro de proyección). Los objetos se muestran entonces con un efecto de acortamiento y la proyección de los objetos distantes es más pequeña que la de los objetos del mismo tamaño que se encuentren más próximos al plano de visuali/ación (Figura 7.40).
Transformación de coordenadas para la proyección en perspectiva Hn ocasiones, podemos seleccionar el punto de referencia de proyección como otro de los parámetros de visualización dentro del paquete gráfico, pero algunos sistemas sitúan este punto de convergencia en una posición fija, como por ejemplo en el punto de vista. La Figura 7.41 muestra la trayectoria de proyección de un punto en el espacio (x, y z) hacia un punto de referencia de proyección cualquiera situado en (x , y , z ). La línea de proyección intersecta el plano de visualización en el punto (x „y , z ), donde z es alguna posición seleccionada para el plano de visualización sobre el eje tyi * Podemos escribir las ecuaciones que describen las coordenadas a lo largo de esta línea de proyección en perspectiva utilizando la forma paramétrica: M
prp
prp
p
p
vp
prp
vp
m
x=x-(x-x )u f/fp
/ = ?-(>>->',,„>
0<
(7.15)
z=z-(z-z )u pfp
El punto (x\y\ z') representa cualquier punto situado a lo largo de la línea de proyección. Cuando u = 0, estaremos en la posición P = (.v, v, r). En el otro extremo de la línea, u = I y tendremos las coordenadas del punto de referencia de proyección (x *y > z_J¿ Sobre el plano de visualización, z - z y podemos despejar el parámetro u en la ecuación z' en esta posición de la línea de proyección: prp
prp
vp
14 = ^^
(7.16)
Sustituyendo este valor de u en las ecuaciones correspondientes a * ' e y', obtenemos las ecuaciones generales de transformación de perspectiva:
7.8 Proyecciones en perspectiva
381
view
Plano de visualizaeión
^^lllllíllll FIGURA7.41. Proyección en perspectiva de un punió P con coordenadas (.v, \\ z) hacia un punió de referencia de proyección seleccionado. La intersección con el plano de visualizaeión es (x , y , z ). p
p
vp
f
l¿3
x„=x
(7./T)
7 — 7
Los cálculos para un mapeo en perspectiva son más complejos que las ecuaciones de proyección paralela, ya que los denominadores de los cálculos de perspectiva 7.17 están en función de la coordenada z de cada punto en el espacio. Por tanto, necesitamos formular los procedimientos de proyección en perspectiva de manera un poco distinta, con el fin de concatenar este mapeo con las otras transformaciones de visualizaeión. Pero echemos primero un vistazo a algunas de las propiedades de las Ecuaciones 7.17.
Ecuaciones de la proyección en perspectiva: casos especiales A menudo se imponen diversas restricciones sobre los parámetros de la proyección en perspectiva. Dependiendo de cada paquete gráfico concreto, el posicionamiento del punto de referencia de proyección en el plano de visualizaeión puede no ser completamente arbitrario. Para simplificar los cálculos de la perspectiva, el punto de referencia de proyección puede limitarse a las posiciones situadas a lo largo del eje 3 , con lo que: v i e w
x = x\ p
t —z *j*g S'/J 7
(7.18)
—7
Y en ocasiones el punto de referencia de proyección está fijo en el origen de coordenadas, de modo que =
( 2 ) < v w w - W <°-°-°>
:
****
f§0
(7.19) 7
i i,
"% = y V,
'i
/
382
CAPÍTULO 7
Visualización tridimensional
Si el plano de visualización es el plano uv y no hay restricciones en lo que respecta a la colocación del punto de referencia de proyección, tendremos, (3) *„, = 0: f 7
pro
—7 *
l"P
\ z (7.20)
f 'P'V
y„=y
-y
\ z,
prp
z
z
prp
Con el plano uv como plano de visualización y situando el punto de referencia de proyección en el eje z , las ecuaciones de la proyección en perspectiva son: x = v = z = 0 * (4) V i e w
prp
-rprp
"vp
x=x
-prp
y =y r
7
-prp —
(7.21) 7
Por supuesto, no podemos poner el punto de referencia de proyección en el plano de visualización. En ese caso, toda la escena se proyectaría sobre un único punto. El plano de visualización suele situarse entre el punto de referencia de proyección y la escena, pero en general podríamos colocarlo en cualquier lugar excepto en el punto de proyección. Si el punto de referencia de proyección está situado entre el plano de visualización y la escena, los objetos se verán invertidos en el plano de visualización (Figura 7.42). Con la escena situada entre el plano de visualización y el punto de proyección, los objetos simplemente se agrandan al ser proyectados hacia afuera desde el punto de referencia hacia el plano de visualización. Los efectos de perspectiva también dependen de la distancia entre el punto de referencia de proyección y el plano de visualización, como se ilustra en la Figura 7.43. Si el punto de referencia de proyección está próximo al plano de visualización, los efectos de perspectiva se enfatizan, es decir, los objetos más próximos parecen mucho mayores que los objetos más distantes del mismo tamaño. De forma similar, cuando alejamos el punto de referencia de proyección del plano de visualización, la diferencia de tamaño entre los objetos próximos y lejanos se reduce. Cuando el punto de referencia de proyección está muy lejos del plano de visualización, la proyección en perspectiva se aproxima a la proyección paralela.
v
- w
FIGURA 7.42. La proyección en perspectiva de un objeto se invierte cuando el punto de referencia de proyección está situado entre el objeto y el plano de visualización.
7.8 Proyecciones en perspectiva
Ventana de recorte
Ventana de recorte
383
Ve man a de recorte
Punto de referencia de proyección (b)
FIGURA 7.43. Cambio de los efectos de la perspectiva al alejar el punto de referencia de proyección del plano de visualización.
Puntos de fuga para las proyecciones en perspectiva Cuando se proyecta una escena sobre un plano de visualización utilizando mapco en perspectiva, las líneas paralelas al plano de visualización se proyectan como líneas paralelas. Pero todas las demás líneas paralelas de la escena que no sean paralelas ai plano de visualización se proyectarán como líneas convergentes, como podemos ver en la Figura 7.43. El punto en el que un conjunto de líneas paralelas proyectadas parece converger se denomina punto de fuga. Cada conjunto de líneas paralelas proyectadas tiene un punto de fuga propio. Para un conjunto de líneas que son paralelas a uno de los ejes principales de un objeto, el punto de fuga se denomina punto de fuga principal. Podemos controlar el número de puntos de fuga principales (uno, dos o tres) con la orientación de plano de proyección, y las proyecciones en perspectiva se clasifican por ello como proyecciones de un punto, de dos puntos o de tres puntos. El número de puntos de fuga principales en una proyección es igual al número de ejes principales que intersectan al plano de visualización. La Figura 7.44 ilustra la apariencia de sendas proyecciones en perspectiva de uno y dos puntos para un cubo. En la vista proyectada (b), el plano de visualización se alinea en paralelo al plano xy del objeto, de modo que sólo se intersecta el eje z del objeto. Esta orientación produce una proyección en perspectiva de un punto, estando el punto de fuga situado en el eje z. Para la vista mostrada en (c), el plano de proyección intersecta tanto al eje x como al eje z, pero no al eje y. La proyección en perspectiva de dos puntos resultante contiene puntos de fuga tanto para el eje ,v como para el eje z. El realismo no se incrementa mucho en las proyecciones en perspectiva de tres puntos si las comparamos con las de dos puntos, por lo que las de tres puntos no se utilizan tan a menudo en los diagramas de arquitectura e ingeniería.
Volumen de visualización para proyección en perspectiva De nuevo, creamos un volumen de visualización especificando la posición de una ventana de recorte rectangular sobre el plano de visualización. Pero ahora, los planos de contorno para el volumen de visualización, no son paralelos, porque las líneas de proyección no son paralelas. La parte superior, la inferior y las laterales del volumen de visualización son planos que pasan por los lados de la ventana y por el punto de referencia de proyección. Esto forma un volumen de visualización que es una pirámide rectangular infinita con su vértice situado en el centro de proyección (Figura 7.45). Todos los objetos situados fuera de esta pirámide serán eliminados por las rutinas de recorte. Un volumen de visualización para proyección en perspectiva se suele denominar pirámide de visión, porque se aproxima al cono de visión de nuestros ojos o de una cámara. La imagen mostrada de una escena incluirá únicamente aquellos objetos que estén situados dentro de la pirámide, exac-
384
CAPÍTULO 7
Visualización tridimensional Punto de fuga
(a) Ejes principales
de un OUbO
FIGURA 7.44. Puntos de fuga principales para las proyecciones en perspectiva de un cubo. Cuando el cubo de la figura (a) se proyecta sobre un plano de visualización que sólo intersecta con el eje z, se genera un único punto de fuga en la dirección z (b). Cuando el cubo se proyecta sobre un plano de visualización que intersecta con los ejes z y x, aparecen dos puntos de tuga (c).
Proyección en perspectiva de un punto
Punto de fuga del eje ¿
Punto de fuga del eje x
(O Proyección en perspectiva de dos pumos
tamente de la misma forma que nosotros no podemos ver los objetos que están más allá de nuestra visión periférica y que caen fuera del cono de visión. Añadiendo planos de recorte próximo y lejano que sean perpendiculares al eje z (y paralelos al plano de visualización), cortamos partes del volumen de visualización infinito con el fin de formar una pirámide truncada o frustum. La Figura 7.46 ilustra la forma de un volumen de visualización finito para proyección en v j e w
7.8 Proyecciones en perspectiva 3 8 5
perspectiva, con un plano de visuali/ación que está colocado entre el plano de recorte próximo y el punto de referencia de proyección. Algunas veces, los paquetes gráficos obligan a definir los planos próximo y lejano, mientras que en otros paquetes son opcionales. Usualmente, los planos de recorte próximo y lejano se encuentran a un mismo lado del punto de referencia de proyección, estando el plano lejano más lejos del punto de proyección que el plano próximo, según la dirección de visuali/ación. Y también, al igual que en una proyección paralela, podemos utilizar los planos próximo y lejano simplemente para limitar la escena que hay que visualizar. Pero con una proyección en perspectiva también podemos usar el plano de recorte próximo con el fin de eliminar de la escena los objetos de gran tamaño que estén muy cerca del plano de visualización y que al proyectarse tuvieran una forma irreconocible en la ventana de recorte. De manera similar, el plano de recorte lejano puede emplearse para eliminar los objetos muy alejados del punto de referencia de proyección y que se proyectarían para formar pequeños puntitos sobre el plano de visualización. Algunos sistemas restringen la colocación del plano de visualización en relación con los planos próximo y lejano, mientras que otros sistemas permiten situarlo en cualquier punto excepto en la posición del punto de referencia de proyección. Si el plano de visualización está «detrás» del punto de referencia de proyección, los objetos se verán invertidos, como se muestra en la Figura 7.42.
Matriz de transformación para la proyección en perspectiva A diferencia de una proyección paralela, no podemos utilizar directamente los coeficientes de las coordenadas x e v en las Ecuaciones 7.17 para determinar los elementos de la matriz de proyección en perspectiva, porque los denominadores de los coeficientes son función de la coordenada ¡$; Pero podemos emplear una representación en coordenadas homogéneas tridimensionales para expresar las ecuaciones de la proyección en perspectiva en la forma:
donde el parámetro homogéneo tiene el valor: =
(7.23)
Los numeradores en 7.22 son iguales que en las Ecuaciones 7.17: *H
=^ , „-z ) l r
¡v
+
x ,(z . ,-z) pri
¡ l
(7.24)
386
CAPITULO 7
Visualización tridimensional
Así, podemos formar una matriz de transformación para convertir una posición en el espacio a coordenadas homogéneas de modo que la matriz sólo contenga los parámetros de la proyección en perspectiva y no valores de coordenadas. La transformación para la proyección en perspectiva de un punto definido en coordenadas de visualización se realiza entonces en dos pasos. En primer lugar, calculamos las coordenadas homogéneas utilizando la matriz de transformación de perspectiva: P ^ M ^ P
(7.25)
donde P^ es la representación en forma de matriz columna del punto de coordenadas homogéneas (x y * z h) y P es la representación en forma de matriz columna de la posición de coordenadas (x,y, z, I). (En realidad, la matriz de perspectiva se concatenaría con las otras matrices de transformación de visualización y luego la matriz compuesta se aplicaría a la descripción en coordenadas universales de una escena con el fin de obtener las coordenadas homogéneas). En segundo lugar, después de haber aplicado otros procesos, como la transformación de normalización y las rutinas de recorte, las coordenadas homogéneas se dividen por el parámetro h para obtener las verdaderas posiciones de coordenadas transformadas. Resulta sencillo definir los elementos de la matriz para obtener los valores x t y de coordenadas homogéneas de 7.24, pero también debemos estructurar la matriz para preservar la infomiación de profundidad (valor z). En caso contrario, las coordenadas z se verían distorsionadas por el parámetro de división homogéneo h. Podemos hacer esto definiendo los elementos de la matriz, para la transformación z de modo que se normalicen las coordenadas z de la proyección en perspectiva. Hay varias formas de elegir los elementos de la matriz para generar las coordenadas homogéneas 7.24 y el valor z normalizado para una posición del espacio (x, y, z). La siguiente matriz representa una de las posibles maneras de formular una matriz de proyección de perspectiva: ht
h
h
/r
h
p
f)
-%
0 i
0
X
prp
—•
X ? T pn^pf t.
V J
0
0
s.
0
0
-1
C
(7.26)
PIP
Los parámetros s y /, son los factores de cambio de escala y de traslación para la normalización de los valores proyectados de las coordenadas z. Los valores específicos de .v, y dependerán del rango de normalización que seleccionemos. La Matriz 7.26 convierte la descripción de una escena en coordenadas homogéneas de proyección paralela. Sin embargo, el frustrum de visualización puede tener cualquier orientación, por lo que estas coordenadas transformadas podrían corresponderse con una proyección paralela oblicua. Esto ocurre si el íhistmm de visualización no es simétrico. En cambio, si el frustrum de visualización para la proyección en perspectiva es simétrico, las coordenadas de proyección paralela resultantes se corresponden con una proyección ortogonal. Analicemos por separado estas dos posibilidades. z
Frustrum de proyección en perspectiva simétrico La línea que parte del punto de referencia de proyección y que pasa por el centro de la ventana de recorte y del volumen de visualización es la línea central del frustrum de proyección en perspectiva. Si esta línea central es perpendicular al plano de visualización, tendremos un frustrum simétrico (con respecto a su línea central) como en la Figura 7.47. Puesto que la línea central del frustrum intersecta con el plano de visualización en el punto ( *yp p> z ), podemos expresar las posiciones de las esquinas de la ventana de recorte en términos de las dimensiones de la ventana: x
prp
anchura -w-nin = %
Z
, anchura i
№m =
+
~
r
vp
7.8 Proyecciones en perspectiva
387
Línea central del frustum
Plano lejano de recorte
Plano próximo de recorte
FIGURA 7.47. Frustrum de visualización para proyección en perspectiva simétrica, con el plano de visualización situado entre el punto de referencia de proyección y el plano de recorte próximo. Este frustrum es simétrico con respecto a la línea central cuando se mira desde arriba, desde abajo o desde cualquiera de los lados.
Plano de visualización Ventana de recorte
X
( prp* y'prp'
Z
prf)
altura
altura M«m
prp
=
¿prp
+
Por tanto, podríamos especificar una vista de proyección en perspectiva simétrica de una escena utilizando la anchura y la altura de la ventana de recorte en lugar de las coordenadas de la ventana. Esto especifica de manera no ambigua la posición de la ventana de recorte, ya que ésta es simétrica con respecto a las coordenadas x e y del punto de referencia de proyección. Otra forma de especificar una proyección en perspectiva simétrica consiste en utilizar parámetros que aproximen las propiedades del objetivo de una cámara. Las fotografías se generan mediante una proyección en perspectiva simétrica de una escena sobre el plano de la película. Los rayos luminosos reflejados por los objetos de una escena se proyectan sobre el plano de la película desde el «cono de visión» de la cámara. Este cono de visión puede especificarse mediante un ángulo de c a m p o visual, que es una medida del tamaño del objetivo de la cámara. Un gran ángulo de campo visual, por ejemplo, se corresponderá con un objetivo de gran angular. En infografía, el cono de visión se aproxima mediante un frustrum simétrico y podemos utilizar un ángulo del campo de visión para especificar el tamaño angular del frustrum. Normalmente, el ángulo del campo de visión será el ángulo existente entre el plano superior de recorte y el plano inferior de recorte del frustrum, como se muestra en la Figura 7.48. Para un punto de referencia de proyección y para una posición del plano de visualización dados, el ángulo del campo de visión determina la altura de la ventana de recorte (Figura 7.49), pero no la anchura. Necesitamos por tanto un parámetro adicional, pero no la anchura. Necesitamos por tanto un parámetro adicional para definir completamente las dimensiones de la ventana de recorte, y ese segundo parámetro podría ser la anchura de la ventana o la relación de aspeeto (anchura/altura) de la ventana de recorte. Fijándonos en los triángulos rectos del diagrama de la Figura 7.49, vemos que: altura/2
(7.27)
de modo que la altura de la ventana de recorte puede calcularse como: altura = 2(z -z ) tan ( piv
vp
(7.2
388
CAPITULO 7
Visualización tridimensional
Por tanto, los elementos diagonales con el valor quiera de las dos siguientes expresiones:
+
J 6 \
altura coi
=
en la Matriz 7.26 pueden sustituirse por cual-
UJ
anchura c o t ( 0 / 2 ) 2•aspecto
(
7
2
p
)
En algunas bibliotecas gráficas, se utilizan posiciones fijas para el plano de visualización y el punto de referencia de proyección, por lo que una proyección en perspectiva simétrica quedará completamente especificada mediante el ángulo del campo visual, la relación de aspecto de la ventana de recorte y las distancias desde la posición de visualización hasta los planos de recorte próximo y lejano. Normalmente, se aplica la misma relación de aspecto a la especificación del visor.
Punto de referencia de proyección
FIGURA 7.48. Ángulo del campo de visión 0 para un volumen de visualización simétrico de proyección en perspectiva, con la ventana de recorte situada entre el plano próximo de recorte y el punto de referencia de proyección. Ventana de recorte
FIGURA 7.49. Relación entre el ángulo de! campo visual de referencia de proyección y el plano de visualización.
la altura de la ventana de recorte y la distancia entre el punto
7.8 Proyecciones en perspectiva
389
Pumo de referencia de proyección
FIGURA 7.50. Al incrementar el ángulo del campo de visión, se incrementa la altura de la ventana de recorte y también los efectos de acortamiento derivados de la proyección en perspectiva. Si el ángulo del campo de visión se reduce en una aplicación concreta, los efectos de acortamiento derivados de la predicción en perspectiva también se reducen. Esto seria comparable a alejar el punto de referencia de proyección del plano de visualización. Asimismo, reducir el ángulo del campo de visión hace que disminuya la altura de la ventana de recorte, y esto proporciona un método para ampliar pequeñas regiones de una escena. De forma similar, un gran ángulo del campo de visión da como resultado una mayor altura de la ventana de recorte (la escena se empequeñece) y se incrementan los efectos de perspectiva, que es exactamente lo mismo que pasa cuando situamos el punto de referencia de proyección muy cerca del plano de visualización. La Figura 7.50 ilustra los efectos de diversos ángulos del campo de visión para una ventana de recorte de anchura fija. Cuando el volumen de visualización para proyección en perspectiva es un frustrum simétrico, la transformación en perspectiva mapea los puntos situados en el interior del frustrum a una serie de coordenadas de pro-
390
CAPÍTULO 7
Visualización tridimensional
Línea central
Plano lejano I-i usi rum de visuali/ación simétrico Mapeo de perHpectiva
f
;>
Volumen de visuali/ación paralclepipédico
/ P l a n o próximo Plano de visualización ^ /
Ventana de recorte
) \ Pumo de referencia de proyección
FIGURA 7.51. Un fruslrum de visuali/ación simétrico se mupea a un paralelepípedo ortogonal mediante la transformación de proyección en perspectiva. yección ortogonal dentro de un paralelepípedo rectangular. La línea central del paralelepípedo coincide con la del frustrum, puesto que esta línea ya es perpendicular al piano de visualización (Figura 7.51). Esto es consecuencia del hecho de que todos los puntos situados a lo largo de una línea de proyección dentro del frustrum se mapean al mismo punto (x y ) del plano de visualización. Así, cada línea de proyección es convertida en la transformación de perspectiva en una línea perpendicular al plano de visualización y, por tanto, paralela a la línea central del frustrum. Una ve/, convertido el frustrum simétrico en un volumen de visualización de proyección ortogonal, podemos pasar a aplicar la transformación de normalización. py
p
Frustrum de proyección en perspectiva oblicuo Si la linea central de un volumen de visualización para proyección en perspectiva no es perpendicular al plano de visualización, lo que tendremos es un frustrum oblicuo. La Figura 7.52 ilustra la apariencia general de un volumen de visualización oblicuo para proyección en perspectiva. En este caso, podemos transformar primero el volumen de visualización en un frustrum simétrico y luego en un volumen de visualización normalizado. Línea ceniral del frustrum
FIGURA 7.52. Frustrum oblicuo (cuando se lo ve desde al menos un lado o mediante una vista superior), con el plano de visualización situado entre el punto de referencia de proyección y el plano de recorte próximo.
7.8 Proyecciones en perspectiva
391
Un volumen de visualización para proyección en perspectiva oblicuo puede convertirse en un frustrum simétrico aplicando la matriz de inclinación del eje z dada en la Ecuación 5.115. Esta transformación desplaza todas las posiciones de cualquier plano que sea perpendicular al eje z según una cantidad proporcional a la distancia del plano con respecto a una posición de referencia especificada sobre el eje z. En este caso, la posición de referencia es z que es la coordenada z del punto de referencia de proyección, y tendremos que efectuar el desplazamiento según una cantidad que mueva el centro de la ventana de recorte a la posición (x y ) sobre el plano de visualización. Puesto que la línea central del frustrum pasa por el centro de la ventana ae recorte, este desplazamiento ajustará la línea central de modo que quede en posición perpendicular al plano de visualización, como en la Figura 7.47. Los cálculos para la transformación de inclinación, asi como para las transformaciones de perspectiva y de normalización, se simplifican enormemente si hacemos que el punto de referencia de proyección sea el origen del sistema de coordenadas de visualización. Podemos hacer esto sin pérdida de generalidad efectuando una traslación de todas las coordenadas de la escena de modo que nuestro punto de referencia de proyección seleccionado quede situado sobre el origen de coordenadas. O bien, podemos desde el principio definir el sislema de referencia de coordenadas de visualización de modo que su origen se encuentre en el punto de proyección deseado para la escena. De hecho, algunas bibliotecas gráficas fijan el punto de referencia de proyección en el origen de coordenadas. Tomando el punto de referencia de proyección como (x *y * z ) (0, 0, 0), obtenemos los elementos de la matriz de inclinación requerida: prpi
prpS
=
prp
1 0 M
I shc«r
sh sh
prp
prp
0 TA
0
1
0
0
1
0
0
0
0
1
0
(7JO)
También podemos simplificar los elementos de la matriz de proyección de perspectiva un poco más si situamos el plano de visualización en la posición del plano de recorte próximo. Y como lo que queremos ahora es desplazar el centro de la ventana de recorte a las coordenadas (0, 0) en el plano de visualización, tendremos que seleccionar los valores de los parámetros de inclinación de modo que.
0 0
(7.31)
= M
•lll'Jl
1
Por lanío, los parámetros de esta transformación de inclinación son:
2z. (7.32) sh
; >
=-
2z.
De forma similar, teniendo el punto de referencia de proyección en el origen del sistema de coordenadas de visualización y tomando el plano próximo de recorte como plano de visualización la matriz de proyección de perspectiva 7.26 se simplifica, quedando,
392
CAPÍTULO 7
Visualización tridimensional
ü 0
M pcts
0
0
0
0
0
0
0
0
í
l
<7.ii) l
1 0
Las expresiones para los parámetros de cambio de escala y de translación de la coordenada r serán determinados por los requisitos de normalización. Concatenando la matriz simplificada de proyección de perspectiva 7.33 con ta matriz de inclinación 7.30, obtenemos la siguiente matriz de proyección de perspectiva oblicua, que podemos utilizar para convenir las coordenadas de una escena a coordenadas homogéneas de proyección ortogonal. El punto de referencia de proyección para esta transformación será el origen del sistema de coordenadas de visualización, mientras que el plano próximo de recorte será el plano de visualización.
M
=M
M
0 0
*"near
mili
uux
2
0 0
0
0
2 s z
t.
0
0
-1
0
(7.34)
Aunque ya no disponemos de opciones para colocar arbitrariamente el punto de referencia de proyección y el plano de visualización, esta matriz proporciona un método eficiente para generar una vista de proyección en perspectiva de una escena, sin sacrificar un alto grado de flexibilidad. Si seleccionamos las coordenadas de la ventana de recorte de modo que .ot' = -xw- y vn> = *
llld*
lililí " •
II).n
-J^min» el frustrum de visualización será simétrico y la Matriz 7.34 se reduce a la Matriz 7.33. Esto se debe a que el punto de referencia de proyección se encuentra ahora en el origen del sistema de coordenadas de visualización. También podríamos usar las Ecuaciones 7.29 con z = 0 y z = z ^ , para especificar los dos primeros elementos diagonales de esta matriz en términos del ángulo del campo visual y de las dimensiones de la ventana de recorte. prp
vp
Coordenadas de transformación normalizadas para proyección en perspectiva La Matriz 7.34 transforma las posiciones de los objetos en coordenadas de visualización, para obtener coordenadas homogéneas de proyección en perspectiva. Cuando dividimos las coordenadas homogéneas con el parámetro homogéneo h obtenemos las coordenadas reales de proyección, que son coordenadas de proyección ortogonal. Así, esta proyección en perspectiva transforma todos los puntos situados dentro del frustrum de visualización, obteniéndose posiciones situadas dentro de un volumen de visualización paralelepipédico rectangular. El paso final del proceso de transformación de perspectiva consiste en mapear este paralelepípedo sobre un volumen de visualización normalizado. Seguiremos el mismo procedimiento de normalización que ya hemos empleado para una proyección paralela. El frustrum de visualización transformado, que es un paralelepípedo rectangular, se mapea sobre un cubo nonnalizado simétrico dentro de un sistema de referencia que cumple con la regla de la mano izquierda (Figura 7.53). Ya hemos incluido los parámetros de normalización para las coordenadas z en la matriz de proyección en perspectiva 7.34, pero todavía necesitamos determinar los valores de estos parámetros cuando se realiza la transformación al cubo de normalización simétrico. Asimismo, necesitamos determinar los parámetros de transformación de normalización para las coordenadas x cy. Puesto que la línea central del volumen %
7.8 Proyecciones en perspectiva
393
Friisirum de visualización transformado
Uw >>W mln
niin
,z
ncaí
norm
-view
7
(-1.-1.-n
Punto de referencia de proyección
Volumen de visualización normalizado
FIGURA 7.53. Transformación de normalización que aplica un volumen de visualización para proyección en perspectiva transformado (paralelepípedo rectangular) sobre el cubo de normalización simétrico dentro de un sistema de referencia que cumple con la regla de la mano izquierda, utilizando el plano próximo de recorte como plano de visualización y situando el punto de referencia de proyección en el origen del sistema de coordenadas de visualización. de visualización paralelepipédico rectangular es ahora el eje z , no hace falta ninguna traslación en las transformaciones de normalización de x e y. Lo único que nos hace falta son los parámetros de cambio de escala para x o y en relación con el origen de coordenadas. La matriz de cambio de escala para llevar a cabo la normalización xv es: v i e w
VI .tv scale
0
0
0
1 0
0
0
1
Concatenando la matriz de cambio de escala xy con la matriz 7.34, se obtiene la siguiente matriz de normalización para una transformación de proyección en perspectiva:
M
=M normpcfs
M
.xy scale
obliquepers
M
o
i
x
w
+
W
m
2
a
o (7.36)
"I A partir de esta transformación, obtenemos las coordenadas homogéneas:
I" x ü 7
h Y las coordenadas de proyección serán:
y
=M nonnpcis
7 *.
1
(7.37)
394
CAPÍTULO 7
Visualización tridimensional
!L
x =-
=
n
p
h
V
-z (7.38)
= ^ =
y
>
h
'
h
-z
-z
Para normalizar esta transformación de perspectiva, queremos que las coordenadas de proyección sean (x y* ) ~ ~ t ; - ' ) cuando las coordenadas de entrada sean (*, v, z) = ( x w yw , z ) , y que las coordenadas de proyección tengan el valor (x y , z ) = (1, 1, 1) cuando las coordenadas de entrada sean (JC, y, z) — ( ^y x> far)- ^ » cuando resolvemos las Ecuaciones 7.38 para calcular los parámetros de normalización utilizando estas condiciones, se obtiene: p%
z
p
p
Crli
mint
pJ
xw
w
ma
o r
2
p
min
n e a r
p
l a n t 0
mii
s = (7.39)
s. = Y los elementos de la matriz de transformación normalizada para una proyección en perspectiva general serán: -2z,
o -2z.
0
o
IV!• Q o n p a
0WB 0
0
tur
o
-1
o
Si el volumen de visualización para proyección en perspectiva hubiera sido especificado originalmente como un frustrum simétrico, podríamos expresar los elementos de la transformación de perspectiva normalizada en términos del ángulo del campo visual y de las dimensiones de la ventana de recorte. Así, utilizando las Ecuaciones 7.29, con el punto de referencia de proyección en el origen y el plano de visualización coincidente con el plano próximo de recorte, tendremos: cot(;) aspecto
M nomisymuipm
0
cot
(7.41)
0 *"ncu
^fw
-1
0
7.9 Transformación del visor y coordenadas de pantalla tridimensionales
395
La transformación completa desde coordenadas universales a coordenadas normalizadas de proyección en perspectiva es la matriz compuesta formada al concatenar esta matriz de perspectiva a la izquierda del produelo de Iransformación de visualización R • T. A continuación, podemos aplicar las rutinas de recorte al volumen de visualización normalizado. Las tareas restantes serán la determinación de visibilidad, la representación de superficies y la transformación del visor.
7.9 TRANSFORMACIÓN DEL VISOR Y COORDENADAS DE PANTALLA TRIDIMENSIONALES Una vez completada la transformación a coordenadas de proyección normalizadas, pueden aplicarse los procedimientos de recorte de manera eficiente al cubo simétrico (o al cubo unitario). Después de aplicados esos procedimientos de recorte, el contenido del volumen de visualización normalizado puede transferirse a coordenadas de pantalla. Para las posiciones .v e v en la ventana de recorte normalizada, este procedimiento es igual a la transformación de visor bidimensional que hemos analizado en la Sección 6.3. Pero las posiciones del volumen de visualización tridimensional también tienen una profundidad (coordenada z) y necesitamos retener esta información de profundidad para realizar las comprobaciones de visibilidad y aplicar los algoritmos de representación de superficies. Así que podemos considerar ahora la transformación de visor como un (ñapeo sobre las coordenadas de pantalla tridimensionales. Las ecuaciones de transformación x e y desde la ventana de recorte normalizada a las correspondientes posiciones dentro de un visor rectangular están dadas por la Matriz 6.10. Podemos adaptar dicha matriz a las aplicaciones tridimensionales incluyendo los parámetros necesarios para la transformación de los valores z a coordenadas de pantalla. A menudo, les valores z normalizados dentro del cubo simétrico se icnomializan en el rango que va de 0 a 1.0. Ksto permite referenciar la pantalla de vídeo como z = 0, con lo que el procesamiento de los valores de profundidad puede llevarse a cabo de manera conveniente sobre el intervalo unitario que va de ()a I. Si incluimos esta renormalización de r, la transformación del volumen de visualización normalizado a coordenadas de pantalla tridimensionales es: 0
2 0
M
0 (i
0
vv — Vi'
J
max
0
2 mu •
0 0
2 &ím
+
>'" n n 1
2
1
J_
2 0
2 1
1
(7.42)
En coordenadas normalizadas, la cara = — I del cubo simétrico se corresponde con el área de la ventana de recorte. Y esta cara del cubo normalizado se mapea sobre el visor rectangular, que ahora estará refercnciado en " = 0. Así, la esquina inferior izquierda del área de pantalla del visor estará en la posición Vm - 'mm* °> y q superior izquierda se encontrará en ( x v , ¿ T , 0). Cada posición xy del visor se corresponde con una posición del búfer de refresco, que contiene la información de color para dicho punto de la pantalla. Y el valor de profundidad para cada punto de la pantalla se almacena en otra área de búfer, denominada búfer Je profundidad. En capítulos posteriores, analizaremos los algoritmos para determinar las posiciones de las superficies visibles y sus colores. Posicíonemos el visor rectangular sobre ta pantalla exactamente igual que hacíamos en las aplicaciones bidimensionales. La esquina inferior izquierda del visor se suele colocar en una posición cuyas coordenadas se especifican en relación con la esquina inferior izquierda de la ventana de visualización. Y las proporciones de los objetos se mantienen si hacemos que la relación de aspecto de este área del visor sea igual que la de la ventana de recorte. n o r m
s a e ¿ n
n
l a e s
u i n a
max
m a x
396
CAPÍTULO 7
Visualization tridimensional
7.10 FUNCIONES DE VISUALIZACIÓN TRIDIMENSIONAL OpenGL La biblioteca GLU (OpenGL Utility) incluye una función para especificar los parámetros de visualización tridimensional y otra función para configurar una transformación de proyección en perspectiva simétrica. Otras funciones, como las de proyección ortogonal, proyección en perspectiva oblicua y transformación de visor están contenidas en la biblioteca básica OpenGL. Además, hay disponibles funciones GLUT para definir y manipular ventanas de visuali/ación (Sección 6.4).
Función de transformación de visualización OpenGL Cuando especificamos los parámetros de visualización en OpenGL, se forma una matriz y se la concatena con la matriz actual de visualización del modelo. En consecuencia, esta matriz de visualización se combina con cualesquiera transformaciones geométricas que hayamos podido también especificar. Después, esta matriz compuesta se aplica para transformar las descripciones de los objetos en coordenadas universales y expresarlas en coordenadas de visualización. Podemos activar el modo de visualización del modelo mediante la instrucción: glMatrixMode
(GLMODELVIEW);
Los parámetros de visualización se especifican mediante la siguiente función GLU, que se encuentra en la biblioteca OpenGL Utility porque invoca las rutinas de traslación y rotación de la biblioteca básica OpenGL: gluLookAt
(xO,
yO,
zO,
xret,
yref,
zref,
Vx,
Vy,
Vz);
Es necesario asignar valores de coma flotante y doble precisión a todos los parámetros de esta función. Esta función designa el origen del sistema de referencia de visualización mediante el punto P , = ( x O , y O , z O ) en coordenadas universales; la posición de referencia se designa mediante P = (xref, yref, zref) y el vector vertical será V = ( V x , v y , v z ) . El eje r positivo para el sistema de coordenadas de visualización estará en la dirección N = P +• P r e ¡-y los vectores unitarios de eje para el sistema de referencia de visualización se calculan mediante las Ecuaciones 7.1. Puesto que la dirección de visualización está definida según el eje - * , la posición de referencia P también se denomina «punto observado». Normalmente, este punto observado es alguna posición en el centro de la escena que podemos usar como referencia para especificar los parámetros de proyección. Y podemos considerar la posición de referencia como el punto al que dirigiríamos una cámara que estuviera ubicada en el origen de visualización. La orientación vertical de la cámara se especifica mediante el vector V, que se ajusta a una dirección perpendicular a N. Los parámetros de visualización especificados mediante la función g l u L o o k A t se utilizan para formar la matriz de transformación de visualización 7.4 de la que hemos hablado en la Sección 7.4. Esta matriz se forma como una combinación de una traslación (que desplaza el origen de visualización al origen de coordenadas universales) y una rotación, que alinea los ejes de visualización con los ejes universales. Si no invocamos la función g l u L o o k A t , los parámetros de visualización predeterminados en OpenGL son: (
r e |
y ¡ c w
( )
v i e w
r e f
P „ =(0,0,0) P
K{
=(0,0,-1)
V = (0,1.0) Para estos valores predeterminados, el sistema de referencia de visualización coincide con el de coordenadas universales, con la dirección de visualización según el eje z negativo. En muchas aplicaciones, podemos usar sin problemas los valores predeterminados como parámetros de visualización. w a r l d
7.10 Funciones de visualización tridimensional OpenGL
397
Función de proyección ortogonal OpenGL Las matrices de proyección se almacenan en el modo de proyección OpenGL. Por tanto, para definir una matriz de transformación de proyección, debemos primero invocar dicho modo con la instrucción, glMatrixMode
(GL_PROJECTION) ;
Entonces, cuando ejecutemos cualquier comando de transformación, la matriz resultante se concatenará con la matriz de proyección actual. Los parámetros de proyección ortogonal se eligen mediante la función: glOrtho
(xwmin,
xwmax,
ywmin,
ywmax,
dnear,
dfar);
Todos los valores de los parámetros en esta función deben ser números en coma flotante y doble precisión. Utilizamos glOrtho para seleccionar las coordenadas de la ventana de recorte y las distancias entre el origen de visualización y los planos de recorte próximo y lejano. En OpenGL no hay ninguna opción para definir la situación del plano de visualización. El plano de recorte próximo coincide siempre con el plano de visualización. por lo que la ventana de recorte estará siempre situada sobre el piano próximo del volumen de visualización. La función g l O r t h o genera una proyección paralela que es perpendicular al plano de visualización (el plano de recorte próximo). Así, esta función crea un volumen de visualización finito de proyección ortogonal para la ventana de recorte y para los planos de recorte especificados. En OpenGL, los planos de recorte próximo y lejano no son opcionales; siempre hay que especificarlos para toda transformación de proyección. Los parámetros dnear y d f a r denotan las distancias en la dirección z negativa, a partir del origen del sistema de coordenadas de visualización. Por ejemplo, si d f a r = 55.0, entonces el plano lejano de recorte estará en la posición z - = —55.0. Un valor negativo de alguno de los parámetros denotará una distancia «por detrás» del origen de visualización, según el eje z positivo. Podemos asignar los valores que queramos (positivos, negativos o cero) a estos parámetros, siempre que se cumpla que d n e a r < d f a r . El volumen de visualización resultante para esta transformación de proyección es un paralelepípedo rectangular. Las coordenadas dentro de este volumen de visualización se transforman a ubicaciones dentro del cubo normalizado simétrico, en un sistema de referencia que cumpla con la regla de la mano izquierda, utilizando la Matriz 7.7 con z = -dnear y z = -dfar. Los valores predeterminados de los parámetros para la función de proyección ortogonal OpenGL son ± 1 , que producen un volumen de visualización que es un cubo normalizado simétrico en el sistema de coordenadas de visualización, que cumple la regla de la mano derecha. Estos valores predeterminados son equivalentes a ejecutar la instrucción: v i c w
(
ar
v ¡ e w
n e a r
glOrtho
(-1.0,
1.0,
f a r
-1.0,
1.0,
-1.0,
1.0);
La ventana de recorte predeterminada es, por tanto, un cuadrado normalizado simétrico y el volumen de normalización predeterminado es un cubo normalizado simétrico con z = LO (por detrás de la posición de visualización) y z = —1.0. La Figura 7.54 muestra la apariencia y la posición del volumen de visualización predeterminado para proyección ortogonal. Para aplicaciones bidimensionales, utilizábamos la función g l u O r t h o 2 D para definir la ventana de recorte. También podríamos haber usado la función g l O r t h o para especificar la ventana de recorte, siempre y cuando asignáramos a los parámetros d n e a r y d f a r valores situados en lados opuestos del origen de coordenadas. De hecho, una llamada a g l u O r t h o 2 D es equivalente a otra llamada a g l O r t h o con dnear = — LO y dfar = 1.0. No hay ninguna función en OpenGL para generar una proyección oblicua. Para producir una vista de proyección oblicua de una escena, podríamos definir nuestra propia matriz de proyección, como en la Ecuación 7.14; después, tendríamos que hacer de esta matriz la matriz de proyección OpenGL actual, utilizando las funciones de matrices que hemos analizado en la Sección 5.17. Otra forma de generar una vista en proyección oblicua consiste en rotar la escena hasta una posición apropiada, de modo que una posición ortogonal en la dirección z, • nos de la vista deseada. n e a r
f a r
398
CAPÍTULO 7
Visualización tridimensional
Ventana de recorte
Plano lejano de recorte
FIGURA 7.54. Volumen de visualización predeterminado para proyección ortogonal. Los rangos de coordenadas para este cubo simétrico van de -1 a +1 en cada dirección. El plano de reeorie próximo está en z = I y el plano de recorte lejano e n z = - I . ncar
rar
Plano próximo de recorte
Función OpenGL de proyección en perspectiva simétrica Hay dos funciones disponibles para generar una vista de proyección en perspectiva de una escena. Una de estas funciones genera un frustrum de visualización simétrico en torno a la dirección de visualización (el eje view negativo). lfunción puede usarse para una proyección en perspectiva simétrica o una proyección en perspectiva oblicua. Para ambas funciones, el punto de referencia de producción se encuentra en el origen del sistema de coordenadas de visualización y el plano próximo de recorte se encuentra sobre el plano de visualización.
r
a o l r a
El frustrum de visualización simétrico para proyección en perspectiva se define mediante la función GLU, gluPerapective
(theta,
aspect,
dnear,
dfar);
donde a cada uno de estos cuatro parámetros se le asigna un número de coma flotante y doble precisión. Los dos primeros parámetros definen el tamaño y la posición de la ventana de recorte sobre el plano próximo, mientras que los últimos dos parámetros especifican las distancias entre el punto de vista (origen de coordenadas) y los planos de recorte próximo y lejano. El parámetro t h e t a representa el ángulo del campo visual, que es el ángulo entre los planos de recorte superior e inferior (Figura 7.48). Podemos asignar a este ángulo cualquier valor desde 0" hasta 180°. Al parámetro a s p e c t se le asigna el valor correspondiente a la relación de aspecto ( a n c h u r a / a l t u r a ) de la ventana de recorte. Para una proyección en perspectiva OpenGL, los planos de recorte próximo y lejano deben estar situados sobre el eje z negativo; ninguno de los dos puede estar «detrás» de la posición de visualización. Esta restricción no se aplica a una proyección ortogonal, pero impide la proyección en perspectiva invertida de un objeto cuando el plano de visualización se encuentra por detrás del punto de vista. Por tanto, tanto d n e a r como d f a r deben tener valores numéricos positivos y las posiciones de los planos próximo y lejano se calculan c o r a o 2 = -dnear y z = -dfar. v ¡ e w
n
e
a
r
tar
Si no especificamos una función de proyección, nuestra escena se mostrará utilizando la proyección ortogonal predeterminada. En este caso, el volumen de visualización es el cubo normalizado simétrico que se muestra en la Figura 7.54. El frustrum de visualización definido mediante al función g l u P e r s p e c t i v e es simétrico en torno al eje s negativo. Y la descripción de la escena se convierte a coordenadas de proyección homogéneas normalizadas mediante la Matriz 7.41. v i e w
Función general de proyección de perspectiva OpenGL Podemos utilizar la siguiente función para especificar una proyección de perspectiva que tenga un frustrum de visualización simétrico o un frustrum de visualización oblicuo:
7.10 I-unciones de visualización tridimensional OpenGL glFrustum
(xwmin,
xwmax,
ywmin,
ywmax,
dnear,
399
dfar);
Todos los parámetros de esta función deben tener valores de coma flotante y doble precisión. Al igual que las otras funciones de proyección de visualización, el plano próximo se encuentra sobre el plano de visualización y el punto de referencia de proyección está situado en la posición de visualización (origen de coordenadas). Esta función tiene los mismos parámetros que la función de proyección paralela ortogonal, pero ahora las distancias de los planos de recorte próximo y lejano deben ser positivas. Los primeros cuatro parámetros establecen las coordenadas de la ventana de recorte sobre el plano próximo, mientras que los últimos dos especifican la distancia entre el origen de coordenadas y los planos próximo y lejano de recorte a lo largo del eje viw negativo. Las ubicaciones de los planos próximo y lejano serán z = —dnear y z = - d f a r . La ventana de recorte puede especificarse en cualquier punto de plano próximo. Si seleccionamos las coordenadas de la ventana de recorte de modo que xw = —xw y yw - = ~yw , obtendremos un frustrum simétrico (teniendo como línea central el eje r negativo). De nuevo, si no invocamos explícitamente un comando de proyección, OpenGL aplicará la proyección predeterminada ortogonal a la escena. El volumen de visualización en este caso será el cubo simétrico (Figura 7.54). r
f a r
mií)
max
m m
max
v i c w
Visores OpenGL y ventanas de visualización Después de haber aplicado las rutinas de recorte en coordenadas normalizadas, el contenido de la ventana de recorte normalizada se transfiere a coordenadas de pantalla tridimensionales junto con la información de profundidad. El valor de color de cada posición xy del visor se almacena en el búfer de refresco (búfer de color) y Ja información de profundidad para cada posición xy se almacena en el búfer de profundidad. Como hemos indicado en la Sección 6.4, un visor rectangular se define mediante la siguiente función OpenGL: glViewport
(xvmin,
yvmin,
vpwidth,
vpHeight);
Los primeros dos parámetros de esta función especifican la posición entera de pantalla de la esquina inferior izquierda del visor, de forma relativa a la esquina inferior izquierda de la ventana de visualización. Los dos últimos parámetros, por su parte, proporcionan la anchura y altura enteras del visor. Para mantener las proporciones de los objetos en la escena, definiremos la relación de aspecto del visor de modo que sea igual a la de la ventana de recorte. Las ventanas de visualización se crean y gestionan mediante rutinas CiLUT y en la Sección 6.4 hemos analizado en detalle las diversas funciones de la biblioteca GLUT para ventanas de visualización. El visor predeterminado OpenGL tiene el tamaño y la posición de la ventana de visualización actual.
Ejemplo de programa OpenGL para visualización tridimensional Una vista de proyección en perspectiva de un cuadrado, como la que se muestra en la Figura 7.55, puede obtenerse utilizando el siguiente programa de ejemplo. El cuadrado está definido en el plano .vv y seleccionamos un origen de coordenadas de visualización con el fin de ver la cara frontal con un cierto ángulo. Seleccionando el centro del cuadrado como punto observado, obtenemos una vista en perspectiva utilizando la función glFrustum. Si movemos el origen de coordenadas de visualización al otro lado del polígono, se mostraría la cara posterior como un objeto alámbrico. tíinclude < QL/glut.h> GLint winWidth « 600, winHeight - 600; // Tamaño i n i c i a l ventana de v i s u a l i z a c i ó n . GLfloat xO =» 100.0, yO - 5 0 . 0 , zO - 5 0 . 0 ; // Origen coordenadas de v i s u a l i z a c i ó n . GLfloat xref - 50.0, yref - 5 0 . 0 , zref - 0 . 0 ; // Punto observado. GLfloat Vx - 0.0, Vy - l . o , Vz - 0.0,- // Vector v e r t i c a l - á ^ f
CAPÍTULO 7
/*
Visualización tridimensional
Establecer
límites
G L f l o a t xWMin • /*
Establecer
GLfloat
de
-40.0,
coordenadas
ywMin =
posición de
glClearColor
(1.0,
1.0,
glMatrixMode
(GL MODELVIEW);
ventana
xwMax =
planos
dfar =
init
=
los
25.0,
void
dnear
para
-60.0,
de
de
40.0,
recorte: ywMax =
r e c o r t e próximo
y
*/ 60.0;
lejano;
*/
125.0;
(void)
gluLookAt
1.0,
0.0);
—
(xO,
yO,
zO,
xref,
yref,
glMatrixMode (GLJPR0JECT10N); g l F r u s t u m ( x w M i n , xwMax, y w M i n ,
zref,
ywMax,
Vx,
dnear,
Vy,
Vz);
dfar);
} void
cUsplayFcn
glClear /*
(void)
(GL_COLOR_BUFFER_BIT);
Establecer parámetros
glColor3f
(0.0,
1.0,
0.0);
glPolygonMode
ÍGL_FRONT,
glPolygonMode
(GL_BACK,
glBegin
//
área
de
Seleccionar
relleno color
cuadrada, de
{0.0,
GL_LINE);
0.0,
//
Cara
posterior
0.0);
(100.0,
0.0,
glVertex3f
(100.0,
100.0,
glVertex3f
(0.0,
(
100.0,
0.0); 0.0); 0.0);
);
glFlush
(
);
reshapeFcn
glViewport
(GLint (0,
0,
newWidth, newWidth,
GLint
newHeight)
newHeight);
winWidth = newWidth; winHeight
void
main
=
(int
glutlnit
newHeight;
argc,
char**
(&argc,
argv)
argv);
glutlnitDisplayMode
(GLUT__SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow
(50,
("Perspective
i n i t < ); (displayFcn);
glutReshapeFunc
(reshapeFcn);
{
);
|
GLUT_RGB) ;
50);
(winWidth,
glutDisplayFunc glutMainLoop
relleno
*/ verde.
GL_FILL);
glVertex3f
glEnd
un
(GL_QUADS);
glVertex3f
void
para
winHeight); View of
A
Square");
alámbrica.
7.11 Algoritmos tic recorte tridimensional
401
FIGURA 7.55. Imagen generada por el programa de ejemplo de v isualización tridimensional.
7.11 ALGORITMOS DE RECORTE TRIDIMENSIONAL ¡|
En el Capitulo 6 hemos hablado de las ventajas de utilizar el contorno normalizado 4fi l ventana de recorte en los algoritmos de recorte bidimensionales. De forma similar, podemos aplicar los algoritmos de recorte tridimensionales al contorno normalizado del volumen de visualización. listo permite implementar de manera muy eficiente la pipeline de visualización y los procedimientos de recorte. Todas las transformaciones independientes del dispositivo (geométricas y de visualización) se concatenan y aplican antes de ejecutar las rutinas de recorte. Y cada uno de los límites de recorte para el volumen de visualización normalizado es un plano paralelo a uno de los planos cartesianos, independientemente del tipo de proyección y de la forma original del volumen de visualización. Dependiendo de si el volumen de visualización ha sido normalizado a un cubo unitario o a un cubo simétrico con lado de longitud igual a 2, los planos de recorte estarán situados en las coordenadas 0 y 1 o -1 y 1. Para el cubo simétrico, las ecuaciones de los planos de recorte tridimensionales serán:
]
mmr<
BtriHI
( 7 4 3 )
Los limites de recorte x cy son los límites normalizados de la ventana de recorte, mientras que los límites de recorte z son las posiciones normalizadas de los planos de recorte próximo y lejano. Los algoritmos de recorte para visualización tridimensional identifican y guardan todas las secciones de los objetos que se encuentran dentro del volumen de visualización normalizado, para mostrarlas en el dispo-
402
CAPÍTULO 7
Visualización tridimensional
sitivo de salida. Todas las partes de los objetos que se encuentren fuera de los planos de recorte del volumen de visualización se eliminarán. Con ello, los algoritmos serán ahora extensiones de métodos bidimensionales, utilizando los planos de contorno normalizados del volumen de visualización en lugar de usar las líneas de contorno de la ventana de recorte normalizada.
Recorte en coordenadas homogéneas tridimensionales Las bibliotecas de generación de gráficos por computadora procesan las posiciones en el espacio como coordenadas homogéneas de cuatro dimensiones, de modo que todas las transformaciones pueden representarse como matrices 4 por 4. A medida que cada conjunto de coordenadas entra en la pipeline de visualización, se lo convierte a una representación en cuatro dimensiones: (*,y,-)^U,v,z,l) Después de que unas ciertas coordenadas han pasado a través de las transformaciones geométrica, de visualización y de proyección, estarán en la forma homogénea: X
% sil
% h
y
=M
z
(7.44)
1
donde la matriz M representa la concatenación de todas las diversas transformaciones de coordenadas universales a coordenadas de proyección homogéneas normalizadas, y el parámetro homogéneo h puede no tener ya el valor 1. De hecho, h puede tener cualquier valor real, dependiendo de cómo hayamos representado los objetos en la escena y del tipo de proyección que utilicemos. Si el parámetro homogéneo /; tiene el valor 1, las coordenadas homogéneas serán ¡guales que las coordenadas de proyección cartesianas. Esto suele suceder en el caso de transformación de proyección paralela, pero una proyección en perspectiva produce un parámetro homogéneo que está en función de la coordenada z de cada punto concreto del espacio. El parámetro homogéneo de proyección en perspectiva puede incluso ser negativo, lo que ocurre cuando un cierto punto se encuentra por detrás del punto de referencia de proyección. Asimismo, la representación mediante spiines regionales de las superficies de ios objetos suele formularse en coordenadas homogéneas, donde el parámetro homogéneo puede ser positivo o negativo. Por tanto, si se realiza el recorte en coordenadas de proyección después de la división por el parámetro homogéneo /?, puede perderse cierta información acerca de las coordenadas y puede que los objetos no se recorten correctamente. Un método efectivo para tratar con todas las posibles transformaciones de proyección y todas las posibles representaciones de los objetos consiste en aplicar las rutinas de recorte a la representación en coordenadas homogéneas de los puntos del espacio. Además, como todos los volúmenes de visualización pueden convertirse a un cubo nomializado, basta con impiemenlar un único procedimiento de recorte en el hardware para recortar los objetos en coordenada homogéneas de acuerdo con los planos de recorte normalizados.
Códigos de región tridimensional Podemos ampliar el concepto de código de región (Sección 6.7) a tres dimensiones añadiendo simplemente un par de bits adicionales para tomar en consideración los planos de recorte próximo y lejano. Por tanto, ahora usaremos un código de región de seis bits, como se ilustra en la Figura 7.56. Las posiciones de los bits en este ejemplo de código de región están numeradas de derecha a izquierda, y hacen referencia a los planos de recorte izquierdo, derecho, inferior, superior, próximo y lejano, en dicho orden. Las condiciones para asignar valores a los bits del código de región son básicamente las mismas que las de las Sección 6.7, añadiendo simplemente las dos condiciones adicionales para los planos de recorte próximo y lejano. Sin embargo, para una escena tridimensional, necesitamos aplicar las rutinas de recorte a las
7.11 Algoritmos de recorte tridimensional
tul 6
bit 5
Lejano
bit 4
bit
bit 2
3
Superior Próximo
bit
1
FIGURA 7.56. Una posible ordenación de los límites de recorte del volumen de visualización, que se corresponden con las posiciones de bit en el código de región.
Derecho Inferior
403
Izquierdo
coordenadas de producción, que habrán sido transformadas a un espacio normalizado. Después de la transformación de proyección, cada punto de una escena liene la representación de cuatro componentes P — (x ,y , z Ji). Suponiendo que estemos efectuando el recorte de acuerdo con los límites del cubo simétrico normalizado (Ecuaciones 7.43), un punto estará dentro de este volumen de visualización normalizado si las coordenadas de proyección del punto satisfacen las siguientes seis desigualdades: f¡
h
h
{7.45) h
-1<^
h
A menos que se haya producido un error, el valor del parámetro homogéneo h será distinto de cero. Pero, antes de implementar los procedimientos del código de región, podemos primero comprobar si tenemos un parámetro homogéneo con un valor cero o con un valor extremadamente pequeño. Asimismo, el parámetro homogéneo puede ser positivo o negativo. Por tanto, suponiendo que h * 0, podemos escribir las desigualdades anteriores de la forma: -h < x,
-h% y.,
m
~h< z < h
(7.46)
si h > 0
h
h < y < -/?,
h ^z < -h
lt
h
si h < 0
En la mayoría de los casos h > 0 y podemos asignar los valores de bit del código de región para un determinado punto de acuerdo con las comprobaciones: bit 1 = 1
si h + x < 0
(izquierdo)
bit 2 =
1
si
h-x
(derecho)
bit 3 =
1
si Ji + y < 0
(inferior)
bit 4 =
1
si h - y, < 0
(superior)
bit 5 =
1
si h + z < 0
(próximo)
bit 6 =
1
si /; - z < 0
(lejano)
h
h
b
(
h
h
(7.47)
Estos valores de bit pueden definirse utilizando la misma técnica que en el recorte bidimcnsional. Es decir, simplemente utilizamos el bit de signo de uno de los cálculos h ± h ±y o h ± z para asignar el correspondiente valor al bit del código de región. La Figura 7.57 enumera los 27 códigos de región para un volumen de visualización. En aquellos casos en los que h < 0 para algún punto, podríamos aplicar los mecanismos de recorte utilizando el segundo conjunto de desigualdades de la Ecuación 7.46, o podríamos invertir el signo de las coordenadas y efectuar el recorte utilizando las comprobaciones para h > 0. fl
h
Recorte tridimensional de puntos y líneas Para puntos y segmentos de línea recta que están definidos en una escena y no se encuentran detrás del punto de referencia de proyección, todos los parámetros homogéneos son positivos y los códigos de región pueden
404
CAPÍTULO 7
Visualización tridimensional
Superior
Inferior
(a)
1
011001
ÜI1ÜO0 J 011010
001001
001000
001010
101001 i
101000 j 101010
000001
000000
000010
IOíiuo
000101
000100
000110
100101 I 100100 | 100110
i
1
010001
010000 i 010010
00060 ! 100010
1
-i 010101
010100 i 010110
Códigos de región delante del plano próximo
\
¡_
Códigos de región entre los planos próximo y lejano
Códigos de región detrás del plano lejano
FIGURA 7.57. Valores para el código de región tridimensional de seis bits que identifica las posiciones en el espacio en relación con los límites del volumen de visualización. establecerse utilizando las condiciones 7.47. Entonces, una vez determinado el código de región para cada posición de la escena, podemos determinar fácilmente si un punto está fuera o dentro del volumen de visualización. Por ejemplo, un código de región 101000 nos dice que el punto está por encima y directamente detrás del volumen de visualización, mientras que el código de región 000000 indica un punto situado dentro del volumen (Figura 7.57). Por tanto, para el recorte de puntos, simplemente eliminaremos todos los puntos individuales cuyo código de región no sea 000000. En otras palabras, si cualquiera de los test 7.47 es negativo, el punto estará fuera del volumen de visualización. Los métodos para el recorte de líneas tridimensionales son esencialmente iguales que para líneas bidimensionales. Podemos comprobar primero los códigos de región de los extremos de la línea para la aceptación o rechazos triviales de la línea. Si el código de región de ambos extremos de una línea es 000000, la línea estará completamente contenida dentro del volumen de visualización. De manera equivalente, podemos aceptar trivialmente la línea si la operación or lógica de los dos códigos de región de los extremos produce un valor igual a 0. Asimismo, podemos rechazar trivialmente la línea si la operación lógica and de los dos códigos de región de los extremos produce un valor distinto de 0. Este valor distinto de cero indica que los códigos de región de los dos extremos tienen un valor 1 en la misma posición de bit, por lo que la línea estará completamente fuera de los planos de recorte. Como ejemplo, la línea que va de P a P en la Figura 7.58 tiene los valores de código de región 010101 y 100110 para sus dos puntos extremos. Por tanto, esta línea está completamente por debajo del plano de recorte inferior. Si una línea no cumple ninguno de estos dos tests, analizaremos la ecuación de la línea para determinar si es necesario preservar alguna parte de la misma. 3
4
7.11 Algoritmos de recorte tridimensional
405
P, (001001)
P,(01010I)
FIGURA 7.58. Códigos de región iridimensionales para dos segmentos de línea. La línea P , P intersecta los límites de recorte derecho y superior del volumen de visualización, mientras que la linea P P está completamente situada por debajo del plano de recorte inferior. 2
3
4
Las ecuaciones de los segmentos de línea tridimensionales pueden expresarse de manera conveniente en forma paramétrica y los métodos de recorte de Cyrus-Bcck o Liang-Barsky (Sección 6.7) pueden ampliarse a escenas tridimensionales. Para un segmento de línea con extremos P¡ = U / , p . v , , z | , / í | ) y P = (x *y * h2> /? ), podemos escribir la ecuación paramétrica que describe a los puntos situados a lo largo de la línea como: z
A
/(
2
/¡2
h2
2
p = p +(p _ P ) i
t í
0£«<
(7.48)
Cuando el parámetro de la línea tiene el valor U = 0, estaremos en la posición P,, mientras que si u = 1 estaremos en el otro extremo de la línea, P-,. Escribiendo la ecuación paramétrica de la línea explícitamente en ténninos de las coordenadas homogéneas, tendremos.
x =x ^{x -x )u h
>\
h
=
h2
hl
.v„+(y, -y )w
k = h, +
:
; i l
0
(7.49)
-h. )u
Utilizando los códigos de región de los extremos de un segmento de línea, podemos primero determinar con qué planos de recorte intersecta. Si uno de los códigos de región de los extremos tiene un valor 0 en una determinada posición de bit mientras que el otro código tiene un valor 1 en la misma posición de bit, la línea cruzará dicho plano de recorte. En otras palabras, uno de los tests 7.47 genera un valor negativo, mientras que el mismo test para el otro extremo de la línea produce un valor no negativo. Para hallar el punto de intersección con este plano de recorte, primero utilizamos las ecuaciones apropiadas de 7.49 para determinar el valor correspondiente al parámetro u. Después, calculamos las coordenadas del punto de intersección. Como ejemplo del procedimiento de cálculo de intersección, vamos a considerar un segmento de linca P,P de la Figura 7.58. Esta línea intersecta el plano de recorte derecho, que puede describirse con la ecuación -v = 1. Por tanto, determinamos el valor de intersección del parámetro u haciendo igual a 1 la coordenada de proyección x: 2
max
406
CAPÍTULO 1
Visualización tridimensional
Despejando el parámetro
obtenemos; u=
(7.5/)
A continuación, determinamos los v a l o r e s ^ , y z en este plano de recorte utilizando el valor calculado de u. En este caso, los valores de intersección^, y z se encuentran dentro de los límites ±1 del volumen de visualización y la línea pasa al interior de dicho volumen. Por tanto, procedemos a continuación a localizar el punto de intersección con el plano de recorte superior. Eso completaría el procesamiento para este segmento de linea, porque los puntos de intersección con los planos de recorte superior y derecho identiílcan la parte de la línea contenida dentro del volumen de visualización, así como las secciones de la línea que caen fuera de dicho volumen. Cuando una línea intersecta un plano de recorte pero no pasa al interior del volumen de visualización, continuamos el procesamiento de la línea como en el caso del recorte bidimensional. La sección de la línea que cae fuera de dicho limite de recorte se elimina y actualizamos la información de código de región y los valores del parámetro // para la parte de la linea que está dentro de dicho límite. Después, comprobamos la sección restante de la línea de acuerdo con los otros planos de recorte para su posible rechazo o para realizar cálculos adicionales de intersección. Los segmentos de línea en las escenas tridimensionales no suelen estar aislados, sino que suelen ser componentes de la descripción de los objetos sólidos de la escena, con lo que necesitamos procesar las líneas como parte de las rutinas dé recorte de superficie.
Recorte de polígonos tridimensionales Los paquetes gráficos normalmente tratan sólo con escenas que contienen «objetos grádeos». Se trata de objetos cuyos contornos se describen mediante ecuaciones lineales, por lo que cada objeto está compuesto por un conjunto de polígonos de superficie. Por tanto, para recortar los objetos de una escena tridimensional, aplicamos las rutinas de recorte a las superficies del polígono. La Figura 7.59. por ejemplo, resalta las secciones de superficie de una pirámide que hay que recortar, mientras que las líneas discontinuas muestran las secciones de las superficies de los polígonos que se encuentran dentro del volumen de visualización.
FIGURA 7.59. Recorte de un objeto tridimensional. Las secciones de la superficie que caen fuera de los planos de recorte del volumen de visualización se eliminan de la descripción del objeio, pudiendo ser necesario construir nuevas caras de la superficie.
7.11 Algoritmos de recorte tridimensional
407
Podemos primero comprobar el poliedro para su aceptación o rechazo triviales utilizando una caja de contomo, una estera circunscrita o alguna otra medida de los límites de sus coordenadas. Si los límites de las coordenadas del objetos se encuentran dentro de los limites de recorte, conservamos el objeto completo. Si los limites de coordenadas se encuentran completamente fuera de alguno de los límites de recorte, eliminamos el objeto completo. Cuando no podemos guardar o eliminar el objeto completo, se puede procesar la lista de vértices del conjunto de polígonos que definen las superficies del objeto. Aplicando métodos similares a los del recorte de polígonos bidimensionales, podemos recortar las aristas para obtener nuevas listas de vértices para las superficies del objeto. Puede que también tengamos que crear algunas nuevas de listas de vértices para superficies adicionales que resulten de las operaciones de recorte. Asimismo, las tablas de polígonos deberán ser actualizadas para agregar cualesquiera nuevas superficies de polígonos y para revisar la conectividad y la información de aristas compartidas de las superficies. Para simplificar el recorte de poliedros generales, las superficies poligonales se suelen dividir en secciones triangulares y describirlas mediante bandas de triángulos. Entonces, podemos recortar las bandas de triángulos utilizando la técnica de Sutherland-Hodgman expuesta en la Sección 3.15. Cada una de las bandas de triángulos se procesa por turnos con respecto a los seis planos de recorte para obtener la lista final de vértices de la banda. Para polígonos cóncavos, podemos aplicar métodos de división (Sección 3.15) para obtener, por ejemplo, un conjunto de triángulos y luego recortar los triángulos. Alternativamente, podríamos recortar los polígonos tridimensionales cóncavos utilizando el algoritmo de Weiler-Alherton descrito en la Sección 6.H.
Recorte de curvas tridimensionales Como en el reparto de poliedros, primero comprobamos si los límites de coordenadas de un objeto curvo, como por ejemplo una esfera o una superficie de tipo spline, se encuentran completamente dentro del volumen de visualización. A continuación (raíamos de determinar si el objeto cae completamente fuera de algunos de los seis planos de recorte. Si estos test triviales de rechazo-aceptación fallan, localizamos las intersecciones con los planos de recorte. Para ello, resolvemos el conjunto de ecuaciones formado por las ecuaciones de la superficie y la ecuación del plano de recorte. Por esta razón, la mayoría de los paquetes gráficos no incluyen rutinas de recorte para objetos cunos. En su lugar, las superficies curvas se aproximan mediante un conjunto de parches poligonales y luego se recortan los objetos utilizando las rutinas de recorte de polígonos. Cuando se aplican procedimientos de representación de superficies a los parches poligonales, estos pueden proporcionar una imagen muy realista de una superficie curva.
Planos de recorte arbitrarios También es posible, en algunos paquetes gráficos, recortar una escena tridimensional utilizando planos adicionales que pueden especificarse con cualquier orientación espacial. Esta opción resulla útil en diversos tipos de aplicaciones. Por ejemplo, puede que queramos aislar o recortar un objeto con forma irregular, o que queramos eliminar parte de una escena con un ángulo oblicuo para obtener algún tipo de efecto especial, o que queramos cortar una sección de un objeto según un eje seleccionado para mostrar una vista de sección transversal de su interior. Los planos de recorte opcional pueden especificarse junto con la descripción de la escena, de modo que las operaciones de recorte se lleven a cabo antes de la transformación de proyección. Sin embargo, esto quiere decir también que las rutinas de recorte deberán implementarsc en software. Puede especificarse un plano de recorte mediante los parámetros del plano A, /?. C y D. El plano divide entonces el espacio tridimensional en dos partes, de modo que todas las partes de una escena que caigan en un lado del plano se eliminan. Suponiendo que haya que eliminar los objetos situados detrás del plano, todo punto en el espacio (.v. \\ z) que satisfaga la siguiente desigualdad será eliminado de la escena:
408
CAPÍTULO 7
Visualizaciôn tridimensional
Ax + By + Cz + D<0
(7.52)
Como ejemplo, si el conjunto de parámetros del plano tiene los valores (/I, /i, C\ D) = (1.0, 0.0, 0.0, 8.0), entonces todo punto que satisfaga x H- 8.0 < 0.0 (o x < - 8 . 0 ) será eliminado de la escena. Para recortar un segmento de línea, primero podemos comprobar sus dos extremos para ver si la línea se encuentra completamente detrás del plano de recorte o completamente delante suyo. Podemos representar la desigualdad 7.52 en forma vectorial utilizando el vector normal al plano N = (A, fí, C). Entonces, para un segmento de línea con extremos P| y P->, recortaremos la línea completa si ambos extremos satisfacen, NP +D<0,
k = l2
k
(7H)
Y conservaremos la línea completa si ambos extremos satisfacen, N P +£>2G\
k = 1,2
k
(7M)
En caso contrario, los extremos se encuentran en lados opuestos del plano de recorte, como ilustra la Figura 7.60, y deberemos calcular el punto de intersección con la línea. Para calcular el punto de intersección de la línea con el plano de recorte, podemos emplear la siguiente representación paramétrica del segmento de linea: P = P, + ( P , -P,)w,
0
i
7
5
5
)
El punto P se hallará sobre el plano de recorte si satisface la ecuación del plano, NP+D=0 Sustituyendo el valor de P dado en 7.55, tendremos: N-[P,+(P -P )w| + D = 0 2
l
(7-57)
Despejando el parámetro u en esta ecuación, se obtiene: D
N
P
„ = - ' N(P -P,) 2
(7.58) '
Entonces sustituimos este valor de u en la representación paramétrica vectorial de la línea (Ecuación 7.55) para obtener los valores de las coordenadas x y y z del punto de intersección. Para el ejemplo de la Figura y
FIGURA 7.60. Recorte de un segmento de línea mediante un plano con vector normal N.
7.12 Planos de recorte opcionales en OpenGL
409
7.60, se recortaría el segmento de línea que va de P a P y se conservaría la sección de la línea que va de P a (
fe Para el caso de poliedros, como por ejemplo la pirámide de la Figura 7.61, aplicamos procedimientos de recorte similares. Primero vemos si el objeto está completamente detrás o completamente delante del plano de recorte. En caso contrario, procesamos la lista de vértices de cada superficie poligonal. Aplicamos métodos de recorte de línea a cada arista sucesiva del polígono, como en el caso de recorte para volúmenes de visualizacíón, con el fin de producir las nuevas listas de vértices de la superficie. Pero en este caso, sólo tenemos que tomar en consideración un único plano de recorte. Recortar un objeto curvo de acuerdo con un único plano de recorte es más fácil que recortar el objeto según los seis planos de un volumen de visualización, pero seguirá siendo necesario resolver un conjunto de ecuaciones no lineales para localizar las intersecciones, a menos que aproximemos los contornos de la curva mediante secciones lineales.
7.12 PLANOS DE RECORTE OPCIONALES EN OpenGL Además de los seis planos de recorte que encierran un volumen de visualización, OpenGL permite la especificación de planos de recorte adicionales en una escena. A diferencia de los planos de recorte del volumen de visualización, que son perpendiculares a alguno de los ejes de coordenadas, estos planos adicionales pueden tener cualquier orientación. Para especificar un plano de recorte opcional y activar el recorte de acuerdo con dicho plano, se utilizan las instrucciones: glClipPlane glEnable
(id,
planeParameters);
(id);
El parámetro id se utiliza como identificador para un plano de recorte. A este parámetro se le asignan los valores G L _ C L I P _ P L A N E O , G L _ C L I P _ P L A N E I , etc., hasta un máximo definido por cada implementación. El
410
CAPÍTULO 1
Visualización tridimensional
plano se define entonces utilizando la matriz de cuatro elementos p l a n e P a r a m e t e r s , cuyos elementos son los valores de coma flotante y doble precisión de los cuatro parámetros de la ecuación del plano A В ч С y D. t
Para desactivar un plano de recorte activo al que se le haya asignado el identificador id se utiliza la instruc
ción: glDisable
(id);
Los parámetros del plano A, /?, С y D se transforman a coordenadas de visualización y se utilizan para comprobar las posiciones en coordenadas de visualización dentro de una escena. Los subsiguientes cambios en los parámetros de visualización o de transformación geométrica no afectan a los parámetros del plano almacenados. Por tanto, si especificamos planos de recorte opcionales antes de especificar las transformaciones geométricas o de visualización, los parámetros del plano almacenados coincidirán con los parámetros que se hayan introducido. Asimismo, puesto que las rutinas de recorte para estos planos se aplican en coordenadas de visualización y no en el espacio de coordenadas normalizadas, el rendimiento de un programa puede degradarse cuando se activan los planos opcionales de recorte. Todos los puntos que se encuentre «detrás» de un plano de recorte OpenGL activado se eliminarán. Asi, una posición (x,„v, z) en coordenadas de visualización será recortada si satisface la condición 7.52. Hay disponibles seis planos de recorte opcionales en cualquier implementación OpenGL, aunque puede que alguna implementación concreta proporcione más. Podemos ver cuántos planos de recorte opcionales pueden emplearse en una implementación OpenGL concreta utilizando la instrucción, glGetlntegerv
(GL_MAX_CLIP_PLANES,
numPlanes);
El parámetro n u m P l a n e s es el nombre de una matriz de enteros a la que hay que asignar un valor culero igual al número de planos de recorte opcionales que podemos utilizar. El comportamiento predeterminado para la función g l c l i p P l a n e es que se asigna un valor 0 a los parámetros Л, В, С y D de todos los planos de recorte opcionales. Asimismo, inicialmente, todos los planos de recorte opcionales están desactivados.
7.13 RESUMEN Los procedimientos de visualización para las escenas tridimensionales siguen el enfoque general utilizado en visualización bidimensional. Primero creamos una escena en coordenadas universales, bien a partir de las definiciones de los objetos en coordenadas de modelado o directamente en coordenadas universales. Después, establecemos un sistema de referencias de coordenadas de visualización y transferimos las descripciones de los objetos de coordenadas universales a coordenadas de visualización. A continuación, las descripciones de los objetos se procesan a través de varias rutinas para obtener las coordenadas de dispositivo. Sin embargo, a diferencia de la visualización bidimensional, el caso de la visualización tridimensional requiere rutinas de proyección para transfonnar las descripciones de los objetos a un plano de visualización antes de la transfonnación a coordenadas de dispositivo. Asimismo, las operaciones de visualización tridimensional requieren más parámetros espaciales. Podemos utilizar la analogía de la cámara para describir los parámetros de visualización tridimensionales. Se establece un sistema de referencia de coordenadas de visualización con un punto de vista de referencia (la posición de la cámara), un vector normal al plano de visualización N (la dirección del objetivo de la cámara) y un vector vertical V (la dirección que apunta hacia arriba en la cámara). Entonces, la posición del plano de visualización se estahlece a lo largo del eje de visualización " y las descripciones de los objetos se proyectan sobre este plano. Pueden utilizarse métodos de proyección paralela o proyección en perspectiva para transferir las descripciones de los objetos al plano de visualización. Las proyecciones paralelas pueden ser ortográficas u oblicuas y pueden especificarse mediante un vector de proyección. Las proyecciones paralelas ortográficas que muestran más de una cara de un objeto se denominan proyecciones axonométricas. Obtenemos una isométrica de un objeto mediante una proyección axono-
Resumen
411
métrica que acorte todos los ejes principales según un mismo factor. Las proyecciones oblicuas más comúnmente utilizadas son la perspectiva caballera y la perspectiva cabinet. Las proyecciones en perspectiva de los objetos se obtienen mediante líneas de proyección que se cruzan en el punto de referencia de proyección. Las proyecciones paralelas mantienen las proyecciones de los objetos, mientras que las proyecciones en perspectiva reducen el tamaño de los objetos distantes. Las proyecciones en perspectiva hacen que las líneas paralelas parezcan converger en un punto de fuga, supuesto que las líneas no sean paralelas al plano de visualización. Pueden generarse diagramas de ingeniería y arquitectura con proyecciones en perspectiva de un punto, dos puntos o tres puntos, dependiendo del número de ejes principales que intersecten el plano de visualización. Obtenemos una proyección en perspectiva oblicua cuando la línea que une el punto de referencia de proyección con el centro de la ventana de recorte no es perpendicular al plano de visualización. Los objetos de una escena tridimensional pueden recortarse de acuerdo con un volumen de visualización, con el fin de eliminar las secciones no deseadas de la escena. La parte superior, la inferior y las laterales del volumen de visualización se forman con planos paralelos a las lineas de proyección y que pasan a través de los lados de la ventana de recorte. Los planos próximo y lejano (también denominados anterior y posterior) se utilizan para crear un volumen de visualización cerrado. Para una proyección paralela, el volumen de visualización es un paralelepípedo. Para una proyección en perspectiva, el volumen de visualización es un frustrum. En cualquiera de los dos casos, podemos convertir el volumen de visualización en un cubo normalizado con límites en 0 y l para cada coordenada o en — 1 y 1. Una serie de eficientes algorilmos de recorte procesan los objetos de la escena de acuerdo con los planos que limitan el volumen de visualización normalizado. El recorte se suele llevar a cabo en los paquetes gráficos en coordenadas homogéneas de cuatro dimensiones, después de las transformaciones de proyección y de normalización del volumen de visualización. Entonces, las coordenadas homogéneas se convierten a coordenadas de proyección cartesianas tridimensionales. También pueden utilizarse planos de recorte adicionales con una orientación arbitraria, con el fin de eliminar partes seleccionadas de una escena o de conseguir electos especiales. La biblioteca OpenGL Utility incluye una función de visualización tridimensional para especificar los parámetros de visualización {véase la Tabla 7 . 1 ) . Esta biblioteca también incluye una función para establecer una transformación de producción de perspectiva simétrica. Hay disponibles otras tres funciones de visualización en la biblioteca básica OpenGL para especificar una proyección ortográfica, una proyección en perspectiva general y planos de recorte opcionales. La Tabla 7.1 resume las funciones de visualización OpenGL analizadas en este capítulo. Además, la tabla incluye algunas otras funciones relacionadas con la visualización.
TABLA 7.1. RESUMEN DE FUNCIONES DE VISUALIZACIÓN TRIDIMENSIONALES DE OpenGL
Función
Descripción
gluLookAt
Especifica los parámetros de visualización tridimensional
glOrtho
Especifica los parámetros de una ventana de recorte y de los planos de recorte próximo y lejano para una proyección ortogonal.
gluPerepective
Especifica el ángulo del campo visual de otros parámetros para una proyección en perspectiva simétrica.
glFrustum
Especifica los parámetros para una ventana de recorte y para los planos de recorte próximo y lejano para una proyección en perspectiva (simétrica u oblicua).
glClipPlane
Específica los parámetros para un plano de recorte opcional.
412
CAPITULO 1
Visualización tridimensional
REFERENCIAS Puede encontrar un análisis de los algoritmos de visualización tridimensional y de recorte en Weiler y Atherton (1977), Weiler (1980), Cyrus y Beck (1978) y Liang y Barsky (1984). Los algoritmos de recorte en coordenadas homogéneas se describen en Blinn y Newell (1978), Riesenfeld (1981) y Blinn (1993, 1996 y 1998). También puede encontrar un análisis de diversas técnicas de programación para visualización tridimensional en Glassncr (1990), Arvo (1991), Kirk (1992), Heckbert (1994) y Paeth (1995). Puede encontrar el listado completo de funciones de visualización tridimensionales OpenGL en Shreiner (2000). Si está interesado en consultar ejemplos de programación OpenGL que utilicen visualización tridimensional, le recomendamos Woo, Neider, Davis y Shreiner (1999). También puede encontrar ejemplos de programación adicionales en el sitio web tutorial de Nate Robins: http://www.csMtah.edu/ -narohins/opengl. html.
EJERCICIOS 7.1
Escriba un procedimiento para especificar la matriz que transforme los puntos en coordenadas universales a coordenadas de visualización tridimensionales, dados P , N y V. El vector vertical puede encontrarse en cualquier dirección que no sea paralela a N. 0
7.2
Escriba un procedimiento para transformar los vértices de un poliedro a coordenadas de proyección utilizando una proyección paralela con cualquier vector de proyección especificado.
7.3
Escriba un procedimiento para obtener diferentes vistas de proyección paralela de un poliedro aplicando primero una rotación especificada.
7.4
Escriba un procedimiento para realizar una proyección en perspectiva de un punto de un objeto.
7.5
Escriba un procedimiento para realizar una proyección en perspectiva de dos puntos de un objeto.
7.6
Desarrolle una rutina para realizar una proyección en perspectiva de tres puntos de un objeto.
7.7
Escriba una rutina para convertir un frustrum de proyección en perspectiva en un paralelepípedo rectangular..
7.8
Modifique el algoritmo de recorte de líneas bidimensional de Cohen-Sutherland para recortar lincas tridimensionales según el volumen de visualización simétrico normalizado.
7.9
Modifique el algoritmo de recorte de líneas bidimensional de Liang-Barsky para recortar líneas tridimensionales según un paralelepípedo regular especificado.
7.10
Modifique el algoritmo de recorte de líneas bidimensional de Liang-Barsky para recortar un poliedro de acuerdo con un paralelepípedo regular especificado.
7.11
Escriba una rutina para realizar el recorte de lineas en coordenadas homogéneas.
7.12
Desarrolle un algoritmo para recortar un poliedro según un frustrum definido. Compare las operaciones necesarias en este algoritmo con las que harían falta en un algoritmo que recortara el poliedro de acuerdo con un paralelepípedo regular.
7.13
Amplíe el algoritmo de recorte de polígonos de Sutherland-Hodgman para recortar un poliedro convexo de acuerdo con un volumen de visualización simétrico normalizado.
7.14
Escriba una rutina para implementar el ejercicio anterior.
7.15
Escriba una rutina para realizar el recorte de poliedros en coordenadas homogéneas.
7.16
Modifique el ejemplo de programa de la Sección 7.10 para permitir a un usuario especificar una vista para la parte frontal o posterior del cuadrado.
7.17
Modifique el ejemplo de programa de la Sección 7.10 para permitir que el usuario introduzca los parámetros de visualización en perspectiva.
Ejercicios
413
7.1K
Modifique el ejemplo de programa de la Sección 7.10 para generar una vista de cualquier poliedro de entrada.
7.19
Modifique el programa del ejercicio anterior para generar una vista del poliedro utilizando una proyección ortográfica.
7.20
Modifique el programa del ejercicio anterior para generar una vista del poliedro utilizando una proyección paralela oblicua.
Representaciones de objetos tridimensionales
8 . 1 6 Conversión entre representaciones mediante sp/ines
8.1
Poliedros
8.2
Punciones para poliedros en OpenGL
8.3
Superficies curvadas
8.4
Superficies cuádricas
8.5
Supercuádricas
8 . 1 8 Punciones de splines de aproximación en OpenGL
8.6
funciones OpenGL para superficies cuádricas y superficies cúbicas
8.1°
8.7
Objetos sin forma
8 . 2 0 Métodos de geometria de sólidos constructiva
8.8
Representaciones mediante splines
8 . 2 1 Árboles ocíales
8.9
Métodos de interpolación mediante splines cúbicos
8 . 2 2 Árboles BSP
8.10 Curvas mediante splines de Bézier
8 . 1 7 Visualización de curvas y superficies mediante sp/ines
Representaciones de barrido
8 . 2 3 Métodos de geometria fractal
8.11 Superficies de Bézier
8 . 2 4 Gramáticas de fonnas y otros métodos procedimentales
8.12 Curvas mediante splines \\
8 . 2 5 Sistemas de partículas
8.13 Superficies mediante splines B
8 . 2 6 Modelado basado en las características físicas
8.14 Splines beta
8 . 2 7 Visualización de conjuntos de datos
8.15 Splines racionales
8 . 2 8 Resumen
Las escenas gráficas pueden contener muchas clases diferentes de objetos y superficies de materiales: árboles, llores, nubes, rocas, agua, ladrillos, tableros de madera, goma, papel, mármol, acero, cristal, plástico y tela, por mencionar unos pocos. Por tanto, no puede sorprender que no haya un único método que podamos utilizar para describir objetos que incluyan todas las características de estos materiales diferentes. Las superficies de polígonos y de cuádricas proporcionan descripciones precisas de objelos euclideos simples, tales como los poliedros y los elipsoides; las superficies medíanle splines y las técnicas de la geometría sólida constructiva son útiles para diseñar alas de avión, ruedas dentadas y otras estructuras de ingeniería con superficies c u n a d a s ; los métodos procedimentales. tales como las construcciones (Vacíales y los sistemas de partículas, nos permiten modelar las características del terreno, nubes, prados de césped y otros objetos naturales; los métodos de modelado basados en la Física, que utilizan sistemas de fuerzas de interacción, se pueden utilizar para describir el comportamiento no rígido de una prenda de ropa o una porción de gelatina; las codificaciones mediante árboles ocíales se utilizan para representar características internas de objelos. tales como las obtenidas a partir de imágenes CT médicas; y las visualizaciones mediante superficies de nivel, los sombreados de volúmenes y otras técnicas de visualización se aplican a conjuntos de datos discretos tridimensionales para obtener representaciones visuales de los datos. Las técnicas de representación de objelos sólidos se dividen a menudo en dos grandes categorías, aunque no todas las representaciones pertenecen con claridad a una de estas dos categorías. Las representaciones por límites describen un objeto tridimensional como un conjunto de superficies que separan el interior del objeto de su enlomo. Los ejemplos habituales de representaciones por límites son las facetas de polígonos y parches con splines. Las representaciones de particionamiento del espacio se utilizan para describir propiedades internas, particionando la región del espacio que contiene un objeto en un conjunto de sólidos pequeños, contiguos y que no se superponen (habitualmente cubos). Una descripción habitual de particionamiento del espa-
416
CAPÍTULO 8
Representaciones de objetos tridimensionales
ció de un objeto tridimensional es una representación mediante un árbol oclal. En este capítulo consideramos las características de las distintas técnicas de representación y cómo se utilizan en aplicaciones gráficas por computadora.
8.1 POLIEDROS La representación por límites de un objeto gráfico tridimensional que se utiliza más habitualmente consiste en un conjunto de polígonos que encierra el interior del objeto. Muchos sistemas gráficos almacenan todas las descripciones de los objetos como conjuntos de polígonos. Fisto simplifica y acelera el sombreado de las superficies y la visualización de los objetos, ya que todas las superficies se describen con ecuaciones lineales. Por esta razón, las descripciones de polígonos se denominan a menudo objetos gráficos estándar. En algunos casos, una representación poligonal es la única disponible, pero muchos paquetes también permiten describir las superficies de los objetos con otras técnicas, tales como superficies mediante splines, que habitualmente se convierten en representaciones poligonales para su procesamiento en la pipeline de visualización. Para describir un objeto como un conjunto de facetas poligonales, damos la lista de coordenadas de los vértices de cada polígono sobre la superficie del objeto. Las coordenadas de los vértices y la información de las aristas de las parles de la superficie se almacenan a continuación en tablas (Sección 3.15), junto con otra información tal como el vector normal a la superficie para cada polígono. Algunos paquetes gráficos proporcionan subrutinas para la generación de mallas de polígonos como un conjunto de triángulos o de cuadriláteros. Esto nos permite describir una gran parte de la superficie límite de un objeto, o incluso toda la superficie, con una única orden. Algunos paquetes también proporcionan subrutinas para mostrar formas comunes, tales como un cubo, una esfera, o un cilindro, representados con superficies de polígonos. Los sistemas gráficos sofisticados utilizan sombreadores (renderers) rápidos de polígonos implementados en hardware que tienen la capacidad de mostrar un millón o más de polígonos (habitualmente triángulos) sombreados por segundo, en los que se incluye la aplicación de texturas a su superficie y de efectos especiales de iluminación.
8.2 FUNCIONES PARA POLIEDROS EN OpenGL Disponemos de dos métodos para especificar polígonos en un programa con OpenGL. Utilizando las primitivas para polígonos estudiadas en la Sección 3.16, podemos generar una gran variedad de formas poliédricas y mallas de superficie. Además, podemos utilizar las funciones de GLUT para mostrar los cinco poliedros regulares.
Funciones de áreas de relleno de polígonos en OpenGL Un conjunto de parches de polígonos de una parte de la superficie de un objeto, o una descripción completa de un poliedro, se puede proporcionar utilizando las constantes de primitivas de OpenGL GLPOLYGON, GL_TRIANCLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, y GL_QUAD_STRIP. Por ejemplo, podríamos teselar la superficie lateral (axial) de un cilindro utilizando una tira de cuadriláteros. De forma similar, todas las caras de un paralelogramo se podrían describir con un conjunto de rectángulos, y todas las caras de una pirámide triangular se podrían especificar utilizando un conjunto de superficies triangulares conectadas.
Funciones para poliedros regulares de GLUT Algunas formas estándar, los cinco poliedros regulares, están predefinidos mediante subrutinas en la biblioteca GLUT. Estos poliedros, también llamados sólidos platónicos, se distinguen por el hecho de que todas las caras de cualquier poliedro regular son polígonos regulares idénticos. Por tanto, todas las aristas de un polie-
8.2
funciones para poliedros en OpenGl.
417
dro regular son iguales, todos los ángulos entre las aristas son iguales y lodos los ángulos entre las caras son iguales. A los poliedros se les asigna un nombre de acuerdo con el número de caras en cada uno de los sólidos. Los cinco poliedros regulares son el tetraedro regular (o pirámide triangular, con 4 caras), el hexaedro regular (o cubo, con 6 caras), el octaedro regular (8 caras), el dodecaedro regular (12 caras) y el icosaedro regular (20 caras). GLUT proporciona diez funciones GLUT para generar estos sólidos: cinco de las funciones producen objetos de malla de alambre y cinco muestran las facetas de los poliedros como áreas de relleno sombreadas. Las características de la superficie mostrada de las áreas de relleno se determinan mediante las propiedades del material y las condiciones de iluminación que se establecen para una escena. Cada poliedro regular se describe en coordenadas de modelado, de modo que cada uno esté centrado en el origen del sistema de coordenadas universales. Obtenemos la pirámide triangular, regular y de cuatro caras utilizando cualquiera de las dos funciones siguientes: glutWireTetrahedron
(
);
o glutSolidTetrahedron
(
) ;
Este poliedro se genera con su centro en el origen del sistema de coordenadas universales y con un radio (distancia desde el centro del tetraedro a cualquier vértice) igual a El hexaedro regular de seis caras (cubo) se visualiza con: glutWireCube
íedgeLength);
0 glutSolidCube
íedgeLength);
Al parámetro e d g e L e n g t h se le puede asignar cualquier valor en punto llotante de doble precisión y positivo, y el cubo está centrado en el origen de coordenadas. Para visualizar el octaedro regular de ocho caras, invocamos cualquiera de los siguientes comandos: glutWireOctahedron
(
) ;
0 glutSolidOctahedron
(
) ;
Este poliedro tiene caras triangulares equiláteras, y el radio (distancia desde el centro del octaedro situado en el origen de coordenadas hasta cualquier vértice) es 1.0. El dodecaedro regular de doce caras, centrado en el origen del sistema de coordenadas universales se genera con: glutWireDodecahedron
(
) ;
o glutSolidDodecahedron
(
) ;
Cada cara de este poliedro es un pentágono. Y las siguientes funciones generan el icosaedro regular de veinte caras. glutWirelcosahedron
(
) ;
O glutSolidlcosahedron
{
) ;
El radio (distancia desde el centro del poliedro, situado en el origen de coordenadas, hasta cualquier vértice) predeterminado del icosaedro es 1.0 y cada cara es un triángulo equilátero.
418
CAPÍTULO 8
Representaciones de objetos tridimensionales
Ejemplo de programa de poliedros con GLUT Utilizando las funciones de GLUT paTa los sólidos platónicos, el siguiente programa genera una visualización en perspectiva, en malla de alambre y transformada de estos poliedros. Los cinco sólidos se encuentran dentro de una ventana de visualización (Figura 8.1).
FIGURA 8.1. Una vista en perspectiva de los cinco poliedros de G L U T , cambiados de escala y posicionados dentro de una ventana de visualización por el procedimiento d i s p l a y W i r e P o l y h e d r a .
ttinclude GLsizei
=
500,
winHeight
=
500;
//Tamaño
inicial
de
la v e n t a n a de
//visualización. void
init
(void)
{ glClearColor
void
(1.0,
1.0,
displayWirePolyhedra
glClear glColor3f /*
/*
(0.0,
(5.0,
0.0, la
(1.5,
//
Ventana
1.0);
//
Borra
la
2.0,
visualización
//
Establece
ventana
transformación de visionado. 5.0,
de
en
blanco
(void)
5.0,
Cambia d e e s c a l a u n
glScalef
0.0);
(GL_COLOR_BUFF E R _ B I T ) ;
Establece
gluLookAt
1.0,
0.0, cubo y
1.0);
0.0,
0.0,
0.0,
el
de
color
visualización. de
las
líneas
en
azul
*/ 1.0,
0.0);
l o m u e s t r a como p a r a l e l e p í p e d o a l á m b r i c o .
*/
8.2 Funciones para poliedros en OpenGL
glutWireCube /*
Cambia
glScalef
(1.0)¡ de
escala,
(0.8,
glTranslatef
0.5,
(-6.0,
Traslada
-5.0, {
(6.6,
/*
(
(-3.0,
Cambia
glScalef
de
(
(
glViewport
y muestra
un
i c o s a e d r o en modelo a l á m b r i c o .
1.0); -2.0,
glFrustum
(QLint
(0,
glMatrixMode
0,
0.5) ;
);
newWidth,
newWidth,
QLint
newHeight)
newHeight);
(GL_PROJECTION);
(-1.0,
glMatrixMode
v o i d main
traslada
(
1.0,
-1.0,
1.0,
2.0,
20.0);
(GL_MODELVIEW);
(GL_COLOR_BUFFER_BIT);
(int
argc,
char**
(&argc,
argv);
argv)
{ glutlnit
glutlnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow
(100,
(winWidth, ("Poliedros
|
GLÜT_RGB);
100); winHeight); en modelo
init ( ); glutDisplayFunc
(displayWirePolyhedra);
glutReshapeFunc
(winReshapeFcn);
glutMainLoop
(
);
*/
.J
) ;
void winReshapePcn
glClear
o c t a e d r o en modelo a l á m b r i c o .
0.0) ;
) ;
0.6,
glutWirelcosahedron
glFlush
un
-1.0,
(4.3,
*/
) ;
escala,
(0.8,
glTranslatef
t e t r a e d r o en modelo a l á m b r i c o .
2.0) ;
TraBlada y v i s u a l i z a
glutWireOctahedron
*/
0.0);
un
6.6,
glutWireTetrahedron
glTranslatef
y muestra un dodecaedro alámbrico.
);
y muestra
glTranslatef
/*
traslada,
0.8);
glutWireDodecahedron
/*
419
alámbrico");
*/
420
CAPÍTULO 8
Representaciones de objetos tridimensionales
8.3 SUPERFICIES CURVADAS Las ecuaciones de los objetos con límites curvos se pueden expresar en forma paramétrica o en forma no paramétrica. El Apéndice A proporciona un resumen y una comparación de las representaciones paramétricas y no paramélricas. Entre los múltiples objetos cpie son útiles a menudo en las aplicaciones gráficas se pueden incluir las superficies cuádricas, las supercuádricas, las funciones polinómicas y exponenciales, y las superficies mediante splines. Estas descripciones de objetos de entrada se teselan habitualmente para producir aproximaciones de las superficies con mallas de polígonos.
8.4 SUPERFICIES CUÁDRICAS Una clase de objetos que se Utiliza frecuentemente es la de las superficies cuádricas, que se describen con ecuaciones de segundo grado (cuádricas). Entre ellas se incluyen las esferas, los elipsoides, los toros, los paraboloides y los hiperboloides. Las superficies cuádricas, particularmente las esferas y los elipsoides, son elementos comunes en las escenas gráficas, y las subrutinas para generar estas superficies están disponibles a menudo en los paquetes gráficos. También, las superficies cuadráticas se pueden producir con representaciones mediante splines racionales.
Esfera En coordenadas cartesianas, una superficie esférica de radio r centrada en el origen de coordenadas se define como el conjunto de puntos (x,y, z) que satisface la ecuación:
También podemos describir la superficie esférica de forma paramétrica, utilizando los ángulos de la latilud y la longitud (Figura 8.2): X = r eos <¡> eos 0
-7t/2 < (¡> < Ttll
y
y = r e o s 0sin
ft
-n
(8.2)
z = r sin
eje x
FIGURA 8.2. Coordenadas paramétricas (/•, 0, 0) de la superficie de una esfera de radio r.
eje x
%
FIGURA 8.3. Parámetros de las coordenadas esféricas (r, 0
FIGURA 8.4. Un elipsoide con radios r„ r y r , centrado en el origen de coordenadas. (
;
8.4
Superficies cuádricas
421
Elipsoide Una superficie elipsoidal se puede describir como una ampliación de la superficie esférica, en la que el radio en ires direcciones perpendiculares entre sí puede tener valores diferentes (Figura 8.4). La representación cartesiana de los puntos de la superficie de un elipsoide centrado en el origen es:
Una representación paramélrica de un elipsoide en función del ángulo de la latitud 0 y del ángulo de la longitud 0 d e la Figura 8.2 es: x = r eos 0 eos x
y = t\ eos 0 sin
ft
ft
-7i/2 <
6<
(8.4)
k
Z = r. Sin 0
Un objeto con forma de donut se denomina toro. Muy a menudo se describe como la superficie generada al hacer girar un círculo o una elipse alrededor de un eje coplanario que es externo a la cónica. Los parámetros de definición de un toro son entonces la distancia del centro de la cónica al eje de rotación y las dimensiones de la cónica. En la Figura 8.5 se muestra un toro generado por la rotación de un circulo de radio /• en el plano v- alrededor del eje z. Con el centro del círculo en el eje>\ el radio axial, r del toro resultante es igual a la distancia en la dirección del eje y al centro del círculo desde el eje z (eje de rotación). El radio de la sección recta del toro es el radio del círculo generatriz. La ecuación del círculo de la sección recta que se muestra en la vista lateral de la Figura 8.5 es: a x i a h
Al hacer girar este círculo alrededor del eje z se genera el toro cuya superficie se describe con la ecuación cartesiana:
*• eje
V
y eje l Vista lateral
Vista superior
Un toro centrado en el origen de coordenadas con una sección recta circular y con el eje del toro según el
422
CAPÍTULO 8
Representm iones de objetos tridimensional
Y las ecuaciones paramétricas correspondientes del toro con una sección recta circular son: x = 0'
axvM
+ /• eos 0) eos 6\
) ' = (fatal
r
+
- /r < 0 < ;r
-n
eos 0) sin 0,
Z = r Sin 0
También podríamos generar un toro haciendo girar una elipse, en lugar de un círculo, alrededor del eje z. En el caso de una elipse situada en el plano yz con semidiámetro principal y semidiámetro secundario referenciados como r., y /\, podemos escribir la ecuación de la elipse como:
y
'¡uiol
=I r. 1
K J
en la que r ¡ es la distancia según el eje y desde el eje de rotación z al centro de la elipse. De este modo, se genera un loro que se puede describir con la ecuación cartesiana. ¡lM-i
';uiul
(8.7)
La representación paramétrica correspondiente del toro con una sección recta elíptica es = (%íi + *» eos
<>uxu.i
+ >\ eos 0) sin
- / r < 0 < /r ft
-n
(8.8)
Z = f sin 0 :
Son posibles otras variaciones de las ecuaciones anteriores del toro. Por ejemplo, podríamos generar una superficie toroidal haciendo girar un círculo o una elipse siguiendo una trayectoria elíptica alrededor del eje de rotación.
8.5 SUPERCUÁDRICAS Esta clase de objetos es una generalización de las cuádricas. Las supercuádricas se crean incorporando parámetros adicionales a las ecuaciones de las cuádricas, para proporcionar una mayor flexibilidad en el ajuste de las formas de los objetos. Se añade un parámetro adicional a las ecuaciones de una curva y se utilizan dos parámetros adicionales en las ecuaciones de las superficies.
Superelipse Obtenemos la representación cartesiana de una superelipse a partir de la ecuación de una elipse permitiendo que el exponente de los términos ¿rey sea variable. Un modo de hacer esto es escribir la ecuación cartesiana de la superelipse en la forma: \2/s
+
V
(8.9)
en la que al parámetro s se le puede asignar cualquier valor real-. Cuando s ~ 1. tenemos una elipse ordinaria. Las ecuaciones paramétricas correspondientes a la superelipse de la Ecuación H.° se pueden expresar como
8.5 Supercuádricas
423
ÜOOOO^ 0.5
1.5
1.0
2.0
2.5
3.0
FIGURA 8.6. Superelipses dibujadas con valores del parámetro .s \ariando desde 0.5 a 3.0 y con r = r x
1
x = r . c o s 0,
r
-K<, 9<> K
(8.10)
y = r sin e 5
y
La Figura 8.6 muestra las formas de superelipses que se pueden generar utilizando varios valores del parámetro s.
Superelipsoide Una representación cartesiana de un superelipsoide se obtiene a partir de la ecuación de un elipsoide incorporando dos parámetros exponenciales: 2/íj
/
f
>
\ 2/1,
(8.11)
= 1
I
Con í| = s = 1. tenemos un elipsoide ordinario. Podemos a continuación escribir la representación parametrica correspondiente al superelipsoide de la Ecuación 8.11 como. 2
1
x = r eos' 0 c o s
,J
A
1
0,
y = ñ e o s ' &úx\ 0, h
-nI2<
(8.12)
t~% sin*' <¡>
FIGURA 8.7. Superelipsoidcs dibujados con valores de los parármetros s, y s variando desde 0.0 a 2.5 v con r . = r . • r.. 2
424
CAPÍTULO 8
Representaciones de objetos tridimensionales
La Figura 8.7 muestra las formas de los superelipsoides que se pueden generar utilizando varios valores de los parámetros ,v, y ,s . Estas y otras formas de supercuádricas se pueden combinar para crear estructuras más complejas, tales como descripciones de muebles, tomillos roscados y otros artículos de ferretería. 2
8.6 FUNCIONES OpenGL PARA SUPERFICIES CUÁDRICAS Y SUPERFICIES CÚBICAS Una esfera y un gran número de otros objetos de superficies cuádricas tridimensionales se pueden represenlar utilizando funciones que están incluidas en el conjunto de herramientas de O p e n ü L Utility Toolkit (GLUT) y en OpenGL Utility (GLU). Además, G L U T posee una función para mostrar la forma de una tetera que está definida con parches de superficie bicúbicos. Las funciones de GLUT, que son fácilmente incorporabas a un programa de aplicación, tienen cada una dos versiones. Una versión de cada función muestra una superficie alámbrica y la otra versión muestra la superficie como un conjunto de parches poligonales coloreados. Con las funciones de GLUT podemos mostrar una esfera, un cono, un toro o una tetera. Las funciones de GLU para superficies cuádricas son un poquito más farragosas de configurar, pero proporcionan más opciones. Con las funciones de GLU. podemos representar una esfera, un cilindro, un cilindro con tapas, un cono, una corona circular (o disco hueco) y un sector de corona circular (o disco).
Funciones para superficies cuádricas de GLUT (¡eneramos una esfera con GLUT con cualquiera de las dos funciones siguientes: glutWireSphere
(r,
nLongitudes,
nLatitudes}¡
O glutSolidSphere
(r,
nLongitudes,
nLatitudes);
en las que el radio de la esfera se determina con el número en punto flotante de doble precisión que asignemos al parámetro r. Los parámetros n L o n g i t u d e s y n L a t i t u d e s se utilizan para seleccionar el número entero de líneas de longitud y de latitud que se utilizaran para aproximar la superficie esférica mediante una malla de cuadriláteros. Las aristas de los parches de superficie de cuadriláteros son aproximaciones de líneas rectas de las líneas de longitud y de latitud. La esfera se define con coordenadas de modelado, centrada en el origen de coordenadas universal con su eje polar según la dirección del eje z. Un cono con GLUT se obtiene con: glutWireCone
(rBase,
height,
nLongitudes,
nLatitudes);
o glutSolidCone
(rBase,
height,
nLongitudes,
nLatitudes);
Establecemos los valores en punto flotante de doble precisión para el radio de la base del cono y la altura del cono, utilizando los parámetros r b a s e y h e i g h t , respectivamente. Como en el caso de la esfera, a los parámetros n L o n g i t u d e s y n L a t i t u d e s se les asignan valores enteros que especifican el número de líneas ortogonales de superficie en la aproximación mediante una malla de cuadriláteros. Una línea de longitud de un cono es un segmento de línea recta sobre la superficie del cono, desde el vértice hacia la base, que se encuentre en un plano que contenga al eje del cono. Cada línea de longitud se visualiza como un conjunto de segmentos de línea recta alrededor de la circunferencia de un circulo, en la superficie del cono que es paralelo a la base del cono y que se encuentre en un plano perpendicular al eje del cono. El cono se describe con coordenadas de modelado, con el centro de la base en el origen de coordenadas universal y con el eje del cono en la dirección del eje z. Las visualizaciones alámbricas o con superficie sombreada de un toro con sección recta circular se generan mediante:
8.6. Funciones OpenGL para superficies cuádricas y superficies cúbicas glutWireTorus
(rCrossSection,
rAxial,
nConcentrics,
425
nRadialSlicesí;
o glutSolidTorus
(rCrossSection,
rAxial,
nConcentrics,
nRadialSlices);
El toro que se obtiene con estas subrutinas de GLUT se puede describir como la superficie generada mediante la rotación de un círculo de radio r C r o s s S e c t i o n alrededor del eje z eoplanario, en la que la distancia del centro del círculo al eje z es r A x i a l (Sección 8.4). Seleccionamos un tamaño del toro utilizando valores en punto dotante de doble precisión para estos radios en las funciones de GLUT. Y el tamaño de los cuadriláteros de la malla de aproximación de la superficie del toro se establece con los valores enteros de los parámetros n C o n c e n t r i c s y n R a d i a l S l i c e s . El parámetro n C o n c e n t r i c s especifica el número de círculos concéntricos (con centro en el eje z) que se deben utilizar en la superficie del toro y el parámetro n R a d i a l S l i c e s especifica el número de secciones radiales de la superficie del toro. Estos dos parámetros hacen referencia al número de lineas de la cuadrícula ortogonal sobre la superficie del toro, que se visualizan como segmentos de línea recta (los limites de los cuadriláteros) entre las intersecciones. El toro mostrado está centrado en el origen de coordenadas universal y tiene su eje en la dirección del eje z universal.
Función de GLUT para la generación de una tetera con una superficie cúbica Durante el desarrollo inicial de los métodos de los gráficos por computadora, se construyeron tablas de datos de mallas poligonales que describen varios objetos tridimensionales que se pudieron utilizar para probar las técnicas de sombreado. Entre estos objetos se incluyen las superficies de un automóvil Volkswagen y una tetera, que fueron desarrollados en la universidad de UTA. El conjunto de datos de la tetera de UTA, como fue construido por Martin Newell en 1975, contiene 306 vértices, que definen 32 parches de superficies de Bézier bicúbicas (Sección 8.11). Ya que la determinación de las coordenadas de la superficie de un objeto complejo requiere un tiempo, estos conjuntos de datos, sobre lodo la malla de la superficie de la tetera, llegaron a ser profusamente utilizados. Podemos visualizar la tetera, como una malla de cerca de mil parches de superficies bicúbicas, utíliIizando cualquira de las dos funciones siguientes de GLUT: glutWireTeapot
(size);
0 glutSolidTeapot
(size);
La superficie de la tetera se genera utilizando funciones de curvas de Bézier de OpenGL (Sección 8.11). El parámetro s i z e establece el valor en punto flotante de doble precisión del radio máximo de la vasija de la tetera. La tetera está centrada en el origen de coordenadas UNIVERSAL y su eje vertical lo tiene en la dirección del ejej>.
Funciones para la generación de superficies cuádricas de GLU Para generar una superficie cuádrica utilizando funciones de GLU, necesitamos asignar un nombre a la cuádrica, activar el sombreador de cuádricas de GLU y especificar los valores de los parámetros de la superficie. Además, podemos establecer otros parámetros para controlar la apariencia de una superficie cuádrica con GLU. Las siguientes líneas de código muestran la secuencia básica de llamadas a funciones para mostrar una esfera alámbrica centrada en origen de coordenadas universal. GLUquadricObj Spherel
*spherel;
= gluNewQuadric
(
) ;
426
CAPÍTULO 8
Representaciones tie objetos tridimensionales
gluQuadricDrawStyle
(spherea,
gluSphere
v,
(spherel,
GLD_LINE};
nLongitudes,
nLatitudes);
Éíl la primera linca de código se define un nombre para el objeto de tipo cuádrica. En este ejemplo, hemos elegido el nombre s p h e r e l . Este nombre se utiliza después en otras funciones de GLU para hacer referencia a esta superficie cuádrica particular. A continuación, se activa el sombreador de cuádricas con la función g l u N e w Q u a d r i c , entonces se selecciona el modo de visualización GLULINE para s p h e r e l con el comando g l u Q u a d r i c D r a w S t y l e . Por tanto, la esfera se muestra en su modelo alámbrico con un segmento de línea recta entre cada par de vértices de la superficie. Al parámetro r se le asigna un valor de doble precisión para usarlo como radio de la esfera. La esfera se divide en un conjunto de carus poligonales mediante lineas de longitud y de latitud equiespaciadas. Especificamos el número entero de lincas de longitud y de líneas de latitud como valores de los parámetros n L o n g i t u d e s y n L a t i t u d e s . May disponibles otros tres modos de visualización de superficies cuádricas con GLU. Utilizando la constante simbólica GLU_P0INT en g l u Q u a d r i c D r a w S t y l e , visualizamos una superficie cuádrica como un dibujo de puntos. En el caso de la esfera, se visualiza un punto en cada vértice de la superficie determinado por la intersección de una línea de longitud y una línea de latitud. Otra opción es la constante simbólica GLU_SILHOUTTE. Esta produce una visualización alámbrica eliminando las aristas comunes entre dos caras poligonales coplanarias. Con la constante simbólica GLU_FILL, visualizamos los parches de polígonos como áreas de relleno sombreadas. Utilizando la misma secuencia básica de comandos generamos visualizaciones de las otras primitivas para superficies cuádricas con GLU. Para producir una vista de un cono, un cilindro, o cilindro con tapas, reemplazamos la función g l u S p h e r e por gluCylinder
(quadricName,
rBase,
rTop,
height,
nLongitudes,
nLatitudes)
;
La base de este objeto se encuentra en el plano xy ( z = 0 ) y su eje es el eje z. Utilizando el parámetro rBase asignamos un valor de doble precisión al radio de la base de esta superficie cuádrica y utilizando el parámetro r T o p al radio de la tapa superior. Si s t o p = 0.0, obtenemos un cono; si r T o p = r B a s e obtenemos un cilindro. En caso contrario, se obtiene un cilindro con tapas. Al parámetro h e i g h t se le asigna un valor de doble precisión de la altura y la superficie queda dividida en un número de líneas verticales y horizontales equiespaciadas que viene determinado por los valores enteros asignados a los parámetros n L o n g i t u d e s y nLatitudes. Una corona circular plana o disco sólido se visualiza en el plano xy ( r = 0 ) y centrado en el origen de coordenadas universal con: gluDisk
(ringName,
rlnner,
rOuter,
nRadii,
nRings);
Con los parámetros r l n n e r y r O u t e r establecemos los valores de doble precisión del radio interior y del radio exterior. Si r l n n e r — 0, el disco está completamente relleno. De lo contrario, se visualiza con un agujero concéntrico en el centro del disco. La superficie del disco está dividida en un conjunto de facetas mediante los parámetros enteros n R a d i i y n R i n g s , que especifican el número de rodajas radiales que hay que utilizar en la tcselación y el número de anillos circulares concéntricos, respectivamente. La orientación del anillo se define con respecto al eje r, la cara frontal del anillo está orientada en la dirección del semieje positivo z y la cara posterior en la dirección del semieje negativo z. Podemos especificar una parte de una corona circular con la siguiente función de GLU. gluPartialDisk
(ringName,
rlnner,
rOuter,
nRadii,
nRings,
startAngle,
sweepAngle);
El parámetro de doble precisión s t a r t A n g l e hace referencia al ángulo en grados en el plano xy medido en el sentido de las agujas del reloj desde el semieje positivo y. De forma similar, el parámetro sweepAngle hace referencia a la distancia angular en grados desde el ángulo s t a r t A n g l e . Por tanto, una parte de una corona circular plana se visualiza desde el ángulo s t a r t A n g l e hasta s t a r t A n g l e + s w e e p A n g l e . Por
8.6. Funciones OpenGL pora superficies cuádricas y superficies cúbicas 427
ejemplo, si s t a r t A n g l e = 0.0 y s w e e p A n g l e = 90.0, entonces se muestra la parte de la corona circular situada en el primer cuadrante del plano xy. La memoria reservada para cualquier superficie cuádrica creada con GLU se puede liberar además de eliminar la superficie con, gluDeleteQuadric
íquadricNameJ;
También, podemos definir las direcciones de la cara frontal y la cara posterior de cualquier superficie cuádrica con la función de orientación: gluQuadricOrientation
(quadricName,
normalVectorDirection);
Ai parámetro n o r m a l V e c t o r D i r e c t i o n se le asigna GLU_OUTSlDE o G L U _ I N S I D E para indicar una dirección de los vectores normales a la superficie, donde «outside» indica la dirección de la cara frontal e «inside» indica la dirección de la cara posterior. El valor predeterminado es G L U _ O Ü T S I D E . La dirección predeterminada de la cara frontal de una corona circular plana es la del semieje positivo i («por encima» del disco»). Otra opción es la generación de los vectores normales a la superficie. g 1 uQuad r i cNorma1s (quadr i cName, gene rat ionMode) ;
Al parámetro g e n e r a t i o n M o d e se le asigna una constante simbólica para indicar cómo se deberían generar los vectores normales a la superficie. La constante predeterminada es G L U _ N O N E , que significa que no hay que generar normales a la superficie y, habitualmente, no se aplican condiciones de iluminación a la superficie de la cuádrica. En el caso de sombreado plano de la superficie (un color constante en cada superficie), utilizamos la constante simbólica G L U _ F L A T . Esta produce una normal a la superficie para cada cara poligonal. Cuando hay que aplicar otras condiciones de iluminación y sombreado, utilizamos la constante G L U _ S M O O T H , que genera un vector normal para cada vértice de la superficie.
FIGURA 8 . 8 . Visual izaeión de una esfera creada con GLUT, un cono creado con GLUT y un cilindro creado con GLU, posicionados dentro de una ventana de visualización con el procedimicnlo wireQuadSurfs.
428
CAPÍTULO 8
Representaciones de objetos tridimensionales
Entre otras opciones para las superficies cuádricas con (¡LU se incluye la modificación de parámetros de la textura de la superficie. Podemos designar una función que se ha de invocar cuando ocurre un error durante la generación de una superficie euádrica: gluQuadricCallback
(quadricName,
GLU ERROR,
function);
Ejemplo de programa que utiliza las funciones de creación de superficies cuádricas de GLUT y GLU Se visualizan tres objetos con superficies cuádricas (una esfera, un cono y un cilindro) en su modelo alámbrico con el siguiente programa de ejemplo. Establecemos la dirección de la vista como el semieje positivo z para que el eje de todos los objetos visualizados sea vertical. Los tres objetos se posicionan en diferentes localizaciones dentro de una única ventana de visualización, como se muestra en la Figura 8.8.
ífinclude QLsizei
=
500,
winHeight
=
500;
// //
void
init
Tamaño
inicial
de
la ventana de
visualización.
(void)
{ glClearColor
void
(1.0,
wireQuadSurfs
1.0,
1.0,
0.0);
//
Establece
//
de
//
Borra
el
color
de
la
ventana
visualización.
(void)
{ glClear
(GL_COLOR_BUFFER_BIT)
glColor3f
/* *
0.0,
Establece
los
(2.0,
parámetros
Posiciona
2.0,
(
glTranslatef
(1.0,
glutWireSphere glPopMatrix
2.0,
y muestra
glPuahMatrix
/*
1.0);
de
dirección vista arriba.
gluLookAt /*
(0.0,
1.0, 8,
glPuahMatrix
(
glTranslatef
(1.0,
-0.5,
glutWireCone
(0.7,
2.0,
(
Establece
//
en
visualización
el
con
el
eje
*/
0.0,
una
0.0,
0.0,
0.0,
0.0,
1.0);
e s f e r a a l á m b r i c a d e GLUT.
*/
0.0); 6);
u n c o n o a l á m b r i c o d e GLUT.
);
);
0.5) ; 7,
color
6);
de de
visualización. las
lineas
azul.
)¡
Posiciona y muestra
glPopMatrix
//
ventana
);
(0.75,
(
la
*/
z
universal
como
8.7 Objetos sin forma (Blobby)
/*
P o s i c i o n a y m u e s t r a u n c i l i n d r o a l á m b r i c o d e GLUT.
GLUquadricObj
*cylinder;
//
Establece el
nombre d e l
429
*/ objeto de
cuádrica
de
GLU. glPushMatrix
(
glTranslatef
(0.0,
cylinder
=
);
gluQuadricDrawStyle gluCyünder
(cylinder, (
void
(
);
(cylinder,
glPopMatrix glFlush
0.800^
1.2,
gluNewQuadric
0.6,
GLU_LINE);
0.6,
1.5,
6,
4)
);
(""•);
winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
i glViewport
(0,
glMatrixMode glOrtho
newWidth,
newHeight);
(GL_PROJECTION);
(-2.0,
glMatrixMode glClear
0,
2,0,
-2.0,
2.0,
0.0,
B.0);
(GL_MODELVIEW);
(GL__C0L0R_BUFFER_BIT) ;
) v o i d main
(int
glutlnit
argc,
char**
(&argc,
argv);
glutlnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow init
(
argv)
(100,
(winWidth, ("Superficies
|
GLUT_RGB);
100); winHeight); Cuádricas
con
modelo
alámbrico");
),-
glutDisplayFunc
(wireQuadSurfs);
glutReshapeFunc (winReshapeFcn); glutMainLoop ( )/
8.7 OBJETOS SIN FORMA (BLOBBY) Se han desarrollado varias técnicas para modelar objetos no rígidos en aplicaciones de gráficos por computadora. En la Sección 8.26 se estudian métodos para visualizar las características de materiales tales como la ropa y la goma. Pero otros objetos, como las estructuras moleculares, los líquidos y las gotitas de agua, objetos que se funden y las formas de los músculos de los animales y de los humanos muestran un cierto grado de fluidez. EslOS objetos cambian las características de su superficie con algunos movimientos o cuando se aproximan a otros objetos, y poseen superficies curvadas que no se pueden representar fácilmente con formas estándar. Generalmente, esta clase de objetos se denominan objetos sin forma (blobhy).
430
CAPITULO 8 Representaciones de objetos tridimensionales
88
O O
FIGURA 8.9. Enlace molecular. A medida que dos moléculas se separan una de la otra, las formas de la superficie se estiran, se rompen en dos y finalmente se contraen para formar esteras.
FIGURA 8.10. Formas de músculos «sin forma» de un brazo humano.
Una forma molecular, por ejemplo, se puede describir como esférica cuando está aislada, pero esta forma cambia cuando la molécula se aproxima a otra molécula, listo es debido al hecho de que la forma de la nube de densidad de electrones se distorsiona con la presencia de otra molécula, para que tenga lugar un efecto de unión entre las dos moléculas. La Figura 8.9 muestra los efectos de estiramiento, de ruptura en dos y de contracción de las formas moleculares cuando dos moléculas se separan. Estas características no se pueden describir adecuadamente con simples formas esféricas o elípticas. De forma similar, la Figura 8.10 muestra formas musculares de un brazo humano, que presenta características similares. Se han desarrollado varios modelos para representar objetos sin forma como funciones de distribución sobre regiones del espacio, llabitualmcntc, las formas de la superficie se describen de forma que el volumen del objeto permanece constante durante cualquier movimiento o interacción. Un método de modelado de objetos sin forma consiste en utilizar una combinación de funciones de densidad gaussianas, o bultos gaussianos (Figura 8.11). De esta manera, una función de la superficie se define como:
donde r¿ = x~l + y + r¡, el parámetro 7" es algún umbral especificado, y los parámetros a y h se utilizan para ajustar la cantidad de «sin forma» de las componentes individuales de la superficie. Los valores negativos de h se pueden utilizar para producir hendiduras en lugar de abultamientos. La Figura 8.12 muestra la estructura de la superficie de un objeto compuesto modelado con cuatro funciones de densidad gaussianas. En el nivel del umbral, se utilizan técnicas numéricas de búsqueda de raíces para localizar los valores de las coordenadas de la intersección. Las secciones rectas de los objetos individuales se modelan como círculos o elipse. Si las dos secciones rectas están próximas entre sí, se fusionan para dar lugar a una forma sin forma como se muestra en la Figura 8.9, cuya estructura depende de la separación de los dos objetos. k
k
k
k
FIGURA 8.11. Una función de densidad gaussiana tridimensional centrada en el valor 0, con altura b y desviación estándar a.
FIGURA 8.12. Un objeto compuesto sin forma formado por cuatro abultamientos gaussianos.
8.8 Representaciones con splines
431
FIGURA 8.13. Una distribución de pantalla, utilizada en los paquetes Blob Modeler y Blob Animador, para modelar objetos con metaboias. {Cortesía de Thomson Digital Image.) Otros métodos para generer objetos sin forma utilizan funciones de densidad que decrecen hasta 0 en un intervalo finito, en lugar de exponencialmente. El modelo de metaboias describe los objetos compuestos como combinaciones de Junciones de densidad cuádricas de la forma: si 0 < r < -
2
mm
3
di
\
si r >d
Y el modelo de objeto suave utiliza la función: ,_22/^ 17r
4
+
f(r) =
4
9d
4/
si 0 < /• < d
9d"
8.15)
si r >
Algunos paquetes de diseño y dibujo ahora proporcionan modelado de funciones sin forma para manejar aplicaciones que no se pueden modelar adecuadamente con otras representaciones. La Figura 8.13 muestra una interfaz de usuario de un modelador de objetos sin forma que utiliza metaboias.
8.8 REPRESENTACIONES CON SPLINES En el dibujo de bocetos, un sptine es una banda flexible que se utiliza para producir una curva suave que pasa por unos puntos concretos. Se distribuyen varios pesos pequeños a lo largo de la banda para mantenerla en su posición sobre la mesa de dibujo mientras se traza la curva. El término curva con spline en principio hacia referencia a una curva dibujada de este modo. Podemos describir matemáticamente tal curva con una función creada por tramos de polinomios cúbicos, cuya primera y segunda derivadas son continuas en las diferentes partes de la curva. En los gráficos por computadora, el término curva con spline ahora se refiere a cualquier curva compuesta formada por partes polinómicas que satisfacen condiciones de continuidad específicas en los límites de las mismas. Una superficie con splines se puede describir con dos conjuntos de curvas ortogonales con splines. Existen varias clases diferentes de especificaciones de splines que se utilizan en
432
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.14. Conjunto de seis puntos de control interpolados con secciones polinómicas continuas por tramos.
FIGURA 8.15. Conjunto de seis puntos de control aproximados con secciones polinómicas continuas por tramos.
aplicaciones de gráficos por computadora. Cada especificación individual simplemente hace referencia a un tipo particular de polinomio con ciertas condiciones específicas en los límites. Los splines se utilizan para diseñar formas de curvas y de superficies, para digitalizar dibujos y para especificar trayectorias de animación de objetos o la posición de la cámara en una escena. Entre las aplicaciones habituales de C A D con splines se incluyen el diseño de la carrocería de un automóvil, las superficies de aviones o naves espaciales, los cascos de las embarcaciones y los electrodomésticos.
Splines de interpolación y de aproximación Especificamos un curva con spline proporcionando un conjunto de coordenadas de puntos, llamados puntos de control, que marcan la forma general de la curva. Estas coordenadas se ajustan mediante funciones polinómicas paramétricas y continuas por tramos de uno de estos dos modos. Cuando las partes polinómicas se ajustan para que todos los puntos de control estén conectados, como en la Figura 8.14, se dice que la curva resultante interpola el conjunto de puntos de control. En cambio, cuando la curva de polinomios generada se dibuja para que algunos, o todos, los puntos de control no estén en la trayectoria de la curva, se dice que la curva aproxima el conjunto de puntos de control (Figura 8.15). Se utilizan métodos similares para construir superficies de interpolación o de aproximación con splines. Los métodos de interpolación se utilizan habitualmente para digitalizar dibujos o para especificar trayectorias de animación. Los métodos de aproximación se utilizan fundamentalmente como herramientas de diseño para crear formas de objetos. La Figura 8.16 muestra la visualización por pantalla de una superficie de aproximación con splines, de una aplicación de diseño. Líneas rectas conectan los puntos de control situados por encima de la superficie. Una curva o una superficie con splines se define, modifica y manipula con operaciones sobre los puntos de control. Seleccionando interactivamente posiciones espaciales para los puntos de control, un diseñador puede establecer una forma inicial. Después de que se visualiza el polinomio de ajuste para un conjunto concreto de puntos de control, el diseñador puede volver a posicionar algunos o todos los puntos de control para reestructurar la forma del objeto. Las transformaciones geométricas (traslación, rotación y cambio de escala) se aplican al objeto transformando los puntos de control. Además, los paquetes de CAD insertan puntos de control adicionales para ayudar al diseñador en el ajuste de las formas de los objetos. Un conjunto de puntos de control define un límite de una región del espacio que se denomina armazón (huli) convexo. Una manera de imaginarse la forma de un armazón convexo para una curva bidimensional consiste en imaginar una banda de goma estirada alrededor de los puntos de control para que cada punto de control esté sobre el perímetro de ese límite o dentro de éste (Figura 8.17). Por tanto, el armazón convexo de una curva bidimensional con spline es un polígono convexo. En el espacio tridimensional, el armazón convexo de un conjunto de puntos de control de splines forma un poliedro convexo. El armazón convexo
8.8 Representaciones con splines
433
FIGURA 8.16. Una superficie de aproximación con sp/ines de una aplicación de CAD de diseño de automóviles. Los contornos de la superficie se dibujan con parles de curvas polinómicas y los puntos de control de la superficie están conectados mediante segmentos de línea recta. {Cortesía de Evans & SutherJand.) proporciona una medida de la desviación de una curva o una superficie de la región del espacio próxima a los puntos de control. En la mayoría de los casos, un spline está confinado dentro de su armazón convexo, lo cual garantiza que la forma de objeto sigue los puntos de control sin oscilaciones erráticas. También, el armazón convexo proporciona una medida de las amplitudes de las coordenadas de una curva o una superficie diseñadas, por lo que es útil en subrutinas de recorte y de visualización. Una polilínea que conecta la secuencia de puntos de control de una curva de aproximación con splines se muestra habitualmente, para recordar al diseñador las posiciones de los puntos de control y su ordenación. Este conjunto de segmentos de línea conectados se denomina grafo de control de la curva. A menudo, el grafo de control se denomina «polígono de control» o «polígono característico», aunque el grafo de control es una polilínea y no un polígono. La Figura 8.18 muestra la forma del grafo de control de las secuencias de puntos de control de la Figura 8.17. En una superficie con splines, dos conjuntos de polilíneas que conectan los puntos de control forman las aristas de las caras poligonales, de una malla de cuadriláteros del grafo de control de la superficie, como se muestra en la Figura 8.16.
ib) p,* , \
FIGURA 8.17. Fonnas de los armazones convexas (líneas discontinuas) de dos conjuntos de puntos de control en el plano xy.
434
CAPÍTULO 8 Representaciones de objetos tridimensionales
I % i v
. Formas de los grafos de control (lineas .) de dos conjuntos de puntos de control en •i
Condiciones de continuidad paramétricas Para garantizar una transición suave de una parte de un spline paramétrico por tramos a la siguiente, podemos imponer varias condiciones de continuidad en los puntos de conexión. Si cada parte de la curva con spline se describe con un conjunto de funciones de coordenadas paramétricas de la forma, x = -v(w),
y = yiul
z = z(w),
(8.16)
¡r, < u < U
3
establecemos la continuidad paramétrica haciendo coincidir las derivadas paramétricas de las partes contiguas de la curva en sus extremos comunes. La continuidad paramétrica de orden cero, representada como continuidad C", significa que las curvas se encuentran, Es decir, los valores de.r, j> y z evaluados en u en la primera parte de la curva son ¡guales, respectivamente, a los valores de x,y y z evaluados en u, en la siguiente parte de la curva. La continuidad paramétrica de primer orden, referenciada como continuidad C, significa que las primeras derivadas (líneas tangentes) de las funciones de las coordenadas de las Ecuaciones 8.16 de dos partes sucesivas de la curva son iguales en su punto de unión. La continuidad paramétrica de segundo orden, o continuidad C , significa que tanto la primera como la segunda derivada paramétrica de las dos partes de la curva son iguales en la intersección. Las condiciones de continuidad paramétrica de orden superior se definen de forma similar. La Figura 8.19 muestra ejemplos de continuidad C , C y C . Con continuidad paramétrica de segundo orden, las tasas de cambio de los vectores tangente de las partes con conexión son iguales en su intersección. Por tanto, la transición de las líneas tangentes es suave de una parte de la curva a la siguiente (Figura 8.19(c)). Pero con continuidad paramétrica de primer orden, la lasa de cambio de los vectores tangentes de las dos partes pueden ser bastante diferentes (Figura 8.19(b)), de modo que las formas generales de las dos partes adyacentes pueden cambiar abruptamente. La continuidad paramétrica de primer orden es a menudo suficiente para la digitalización de dibujos y para algunas aplicaciones de diseño, mientras que la continuidad de segundo orden es útil para establecer las trayectorias de animación de movimiento de una cámara y para muchos requisitos de C'AD de precisión. Una cámara desplazándose según la trayectoria curva de la Figura 8.l9(b) con incrementos iguales en el parámetro u experimentaría un cambio abrupto en la aceleración en la frontera de las dos partes, produciendo una discontinuidad en la secuencia de movimientos. Pero si la cámara estuviese desplazándose según la trayectoria de la Figura 8.l9(c), la secuencia de cuadros del movimiento sufriría una transición suave en la frontera. 2
2
ü
1
2
Condiciones de continuidad geométrica Otro método para unir dos partes sucesivas de una curva consiste en especificar condiciones de continuidad geométrica. En este caso, requerimos sólo que las derivadas paramétricas de las dos partes sean proporcionales entre sí en su frontera común, en lugar de requerir igualdad.
8.8 Representaciones con splines
435
FIGURA 8.20. Tres puntos de control ajustados mediante dos partes de curva unidas con (a) continuidad paramélrica y con (b) continuidad geométrica, en la que el vector tangente de la curva C\ en el punto P, tiene una mayor magnitud que el vector tangente de la curva C, en P,.
ü
La continuidad geométrica de orden cero, descrita como continuidad G , es la misma que la continuidad paramétrica de orden cero. Es decir, dos partes sucesivas de la curva deben tener las mismas coordenadas en el punto frontera. La continuidad geométrica de primer orden, o continuidad G , significa que las primeras derivadas paramétricas son proporcionales en la intersección de dos partes sucesivas. Si hacemos referencia a la posición paramélrica en la curva como P(w), la dirección del vector tangente P'(w), pero no necesariamente su magnitud, será la misma en dos partes sucesivas de la curva en su punto común con continuidad G . La continuidad geométrica de segundo orden, o continuidad G , significa que tanto la primera como las segundas derivadas paramétricas de las dos partes de la curva son proporcionales en su frontera. Con continuidad G~, las curvaturas de dos partes de la curva coincidirán en el punto de unión. Una curva generada con condiciones de continuidad geométrica es similar a una generada con continuidad paramétrica, pero con ligeras diferencias en la forma de la curva. La Figura 8.20 proporciona una comparación de las continuidades geométrica y paramétrica. Con continuidad geométrica, la curva se desplaza hacia la parte con mayor magnitud en su vector tangente. 1
1
2
Especificaciones de splines Existen tres métodos equivalentes para especificar una representación de spline concreta, dado el grado del polinomio y los puntos de control: (1) Podemos establecer el conjunto de condiciones en la frontera que se imponen en el spline; o (2) podemos establecer la matriz, que caracteriza el spline; o (3) podemos establecer el conjunto de Junciones de combinación (o Junciones base) que determinan cómo las restricciones especificadas en la curva se combinan para calcular los puntos de la trayectoria de la curva. Para mostrar estas tres espeficaciones equivalentes, suponga que tenemos la siguiente representación poiinómica cúbica paramétrica para la coordenadas a lo largo de la trayectoria de una parte de una curva con spline: 2
x(u) = aj? + b u fwm* -4 x
0
(8,17)
Las condiciones de la frontera de esta curva se pueden establecer en los puntos extremos .v(0) y x(\) y en las primeras derivadas paramétricas en los puntos extremos: x'(0) y x'(\). Estas cuatro condiciones de la frontera son suficientes para determinar los valores de los cuatro coeficientes a , b c y d . A partir de las condiciones de la frontera, podemos obtener la matriz que caracteriza esta curva con splines reescribiendo en primer lugar la Ecuación 8.17 como un producto matricial: x
xt
x
x
436
CAPÍTULO 8 Representaciones de objetos tridimensionales
3
2
xUi) = \u
u
I]
u
i =U C
(818)
en el que U es la matriz fila con las potencias del parámetro u y C es la matriz columna de coeficientes. Utilizando la Ecuación 8.18, podemos escribir las condiciones en la frontera en forma matricial y resolver para la matriz de coeficientes C de este modo, C = M
spfine
• M
(8.19)
geom
donde M es una matriz columna de cuatro elementos que contiene los valores de las restricciones geométricas (condiciones en la frontera) del spline, y M es la matriz de tamaño 4 por 4 que transforma los valores de las restricciones geométricas en los coeficientes del polinomio y proporciona una caracterización de la curva con splines. La matriz M contiene las coordenadas de los puntos de control y otras restricciones geométricas que se hayan especificado. Por tanto, podemos sustituir la matriz C de la Ecuación 8.18 para obtener: gcüm
S/I¡IW
Bmm
x(n) N V • m • . \ l m
(8.20)
g e n m
La matriz M^//№> que caracteriza una representación de un spline, a veces llamada matriz base, es particularmente útil para transformar una representación de un spline a otra. Finalmente, podemos desarrollar la Ecuación 8.20 para obtener una representación polinomial de la coordenada x en términos de los parámetros de las restricciones geométricas g como las coordenadas de los puntos de control y la pendiente de la curva en los puntos de control: h
-v(") = ¿ ^ r B F ( « ) í
(8,21)
Los polinomios BF (w), con k = 0, 1,2, 3, se denominan funciones de combinación o funciones base porque combinan (funden) los valores de las restricciones geométricas para obtener las coordenadas a lo largo de la curva. En las secciones siguientes, exploraremos las características de varias curvas y superficies con splines que son útiles en aplicaciones de gráficos por computadora, incluyendo la especificación de sus representaciones con matriz y con función de fundido. 4
Superficies con splines El procedimiento habitual para definir una superficie con splines consiste en especificar dos conjuntos de curvas ortogonales con splines, utilizando una malla de puntos de control sobre una región del espacio. Si hacemos referencia a los puntos de control como p „ cualquier punto de la superficie con splines se puede calcular como el producto cartesiano de las funciones de combinación de la curva con splines: A(lAl
m v) = X P . , , , BF, (u)BF (v) K -K t
(8.22)
Los parámetros de superficie u y v a menudo varían dentro del rango de 0 a I, pero este rango depende del tipo de curvas con splines que utilicemos. Un método para designar los puntos de control tridimensionales consiste en seleccionar valores de la altura por encima de una malla bidimensional de puntos sobre un plano de tierra.
8.9 Métodos de interpolación con splines cúbicos
437
FIGURA 8.21. Modificación de una parte de una superficie utilizando curvas de recorte.
FIGURA 8.22. Interpolación con splines cúbicos continuos por tramos de n + I puntos de control,
Recorte de superficies con splines En aplicaciones CAD, un diseño de una superficie puede requerir algunas características que no se implemenlan fácilmente simplemente ajustando los puntos de control. Por ejemplo, una parte de una superficie con splines puede necesitar un recorte para encajar dos piezas del diseño, o se puede necesitar un agujero para que un conducto pueda pasar a través de la superficie. Para estas aplicaciones, los paquetes gráficos a menudo proporcionan funciones para generar curvas de recorte que se pueden utilizar para extraer partes de una superficie con splines, como se muestra en la Figura 8.21. Las curvas de recorte se definen habitualmente con coordenadas paramétricas uv de la superficie y, a menudo, se deben especificar como curvas cerradas.
8.9 MÉTODOS DE INTERPOLACIÓN CON SPLINES CÚBICOS Esta clase de splines se usa muy a menudo para establecer trayectorias para el movimiento de objetos o para proporcionar una representación de un objeto o dibujo existente, pero los splines de interpolación también se utilizan a veces para diseñar las formas de objetos. Los polinomios cúbicos ofrecen un compromiso razonable entre flexibilidad y velocidad de computación. Comparados con polinomios de mayor grado, los splines cúbicos requieren menos cálculos y espacio de almacenamiento, y son más estables. Comparados con los polinomios cuadráticos y los segmentos de línea recta, los polinomios cúbicos son más flexibles para modelado de formas de objetos. Dado un conjunto de puntos de control, los splines de interpolación cúbicos se obtienen ajustando los puntos de entrada con una curva polinómica por tramos cúbica que pasa a través de cada punto de control. Suponga que tenemos n + I puntos de control especificados con las coordenadas: P* = (x ,y ,z \ k
k
k
k = 0, 1,2,. . ., n
438
CAPÍTULO 8 Representaciones de objetos tridimensionales
En la Figura 8.22 se muestra un ajuste de interpolación cúbica de estos puntos. Podemos describir el polinomio cúbico paramétrico que hay que ajustar entre cada par de puntos de control con el siguiente conjunto de ecuaciones: 2
.\{u) = a M" + h u -t c u + d y
x
5
x
x
2
y(u) = a u + b u + c u + á y
y
z(u) = a i? + b.ir + :
y
cm
(0 < u < I)
n
(8.23)
+ d
:
Para cada una de estas tres ecuaciones, necesitamos determinar los valores de los cuatro coeficientes a. />, c y d de la representación polinómica de cada una de las n partes de la curva, entre los n + I puntos de control. Macemos esto estableciendo sullcientes condiciones en los límites en los puntos de control entre partes de la curva, para que podamos obtener los valores numéricos de todos los coeficientes. En las siguientes secciones, estudiaremos métodos habituales para establecer las condiciones en los limites de los splines cúbicos de interpolación.
Splines cúbicos naturales Una de las primeras curvas con splines que se desarrolló para aplicaciones gráficas es el spline cúbico natural. Esta c u n a de interpolación es una representación matemática del spline original de generación de borradores. Formulamos un spline cúbico natural imponiendo que dos partes adyacentes de la curva posean la mismas primera y segunda derivadas paramétricas en su límite común. Por tanto, los splines cúbicos naturales tienen continuidad C . Si tenemos n + I puntos de control, como en la Figura 8.22, entonces tenemos n partes de la curva con un total de 4n coeficientes de polinomio que hay que determinar. En cada uno de los n - I puntos de control interiores tenemos cuatro condiciones en el límite: las dos partes de la curva a cada lado de un punto de control deben tener las mismas primera y segunda derivadas paramétricas en dicho punto de control, y cada curva debe pasar por ese punto de control. Fsto nos proporciona 4n - 4 ecuaciones que hay que satisfacer con 4fl coeficientes de polinomio. Obtenemos una ecuación adicional a partir del primer punto de control p , la posición de comienzo de la curva y otra condición a partir del punto de control p , que debe ser el último punto de la curva. Sin embargo, todavía necesitamos dos condiciones más para ser capaces de determinar los valores de todos los coeficientes. Un método para obtener las dos condiciones adicionales consiste en establecer las segundas derivadas en p y p en el valor 0. Otra técnica es añadir dos puntos de control extra (llamados puntos ficticios)* uno en cada extremo de la secuencia original de puntos de control. Es decir, añadimos un punto de control etiquetado como p , en el comienzo de la curva y un punto de control etiquetado como p„,, en el final. Entonces todos los puntos de control originales son puntos interiores y tenemos las 4/J condiciones necesarias en el límite. 2
u
(l
0
n
Aunque los splines cúbicos naturales son un modelo matemático del spline de generación de borradores, tienen una desventaja principal. Si la posición de cualquiera de los puntos de control se modifica, la curva entera se ve afectada. Por tanto, los splines naturales cúbicos no permiten «control local», por lo que no podemos reestructurar parle de la curva sin especificar un conjunto totalmente nuevo de puntos de control. Por esta razón, se han desarrollado otras representaciones para un spline cúbico de interpolación.
Interpolación de Hermite Un spline de Hermite (denominado así en honor de un matemático francés llamado Charles Hermite) es un polinomio de interpolación cúbico por tramos con una tangente específica en cada punto de control. A diferencia de los splines cúbicos naturales, los splines de Hermite se pueden ajustar localmcnte porque cada parte de la curva sólo depende de las restricciones de sus puntos extremos. Si P(M) representa una función paramétrica cúbica de punto para la parte de la curva entre los puntos de control PA y Pí + |, como se muestra en la Figura 8.23, entonces las condiciones en los límites que definen esta parte de curva de Hermite son:
8.9
Pin) = M
Métodos de interpolación con splines cúbicos
439
M ;(«))
FIGURA 8.23. Función paramélrica de punto P(u) para una parle de curva de llcrmite emre los puntos de control p y p ,
•P*+ i
A
p(ü) =
Í H
p.
P(D = P . . ,
(8.24)
P'(0) = D p . P'd) = Dp.
+ I
donde Dpi y Dp¿,, especifican los valores de las derivadas paramétricas (pendientes de la curva) en los puntos de control p y p¿, |, respectivamente. Podemos escribir el vector equivalente a las Ecuaciones 8.23 para esta parte de la curva de Hermite como: A
P(w) = a w
J
+ bw
2
+ cw + d,
0 < u < 1
(8.25)
2
donde la componente .v de P(w) es x{u) = a w + b u + c u + d , y de forma similar para las componentes y y z. La matriz equivalente a la Ecuación 8.25 es: 3
x
x
t
x
a b
(8.26)
i
y la derivada de la función de punto se puede expresar como.
P ' ( m ) = [3m
j
I
2 U
01
(8.27/
Sustituyendo los valores de los puntos extremos 0 y I en el parámetro u de las dos ecuaciones anteriores, podemos expresar las condiciones 8.24 de Hermite en los límites en forma matricial: p,
ro
p«-, D P l
o
o
il
[al
l i l i
1)
0
0
1 0
c
3
2
0
d
1
(8.28)
Resolviendo esta ecuación para los coeficientes de los polinomios, tenemos: f -i
[a]
0
0
0
b
I
1
1
1
c
0
0
1
ü
d
3
2
1
0
2 - 2 1 1
p. Dp D
P*
(
1
-3
3
0
0
1 0
-2
P.
DP,
Dp,
DP,,,
DP..,
-1 1 0
0
p.
0
(8.29)
440
CAPÍTULO 8
Representaciones de objetos tridimensionales
donde M/,, la matriz de Hermite, es la inversa de la matriz de restricciones en los límites. La Ecuación 8.26 se puede escribir por tanto en función de las condiciones en el límite como:
P( ) = [ M
3
2
u
W
u
P* . Dp
IJ-M
t
(8.30)
A
Finalmente, podemos determinar las expresiones de las funciones de combinación de los polinomios de Hermite, H (u) con k = 0, 1, 2, 3, realizando las multiplicaciones de las matrices de la Ecuación 8.30 y agrupando los coeficientes de las restricciones en los límites para obtener la forma polinómica: k
P(w) = p (2w - 3u + I) + p + , (-2w + 3 i r ) + Dp (ir* - 2w + u) 5
2
J
4
2
4
3
2
+ Dp +,(w + u ) 4
= p HM k
+
+
P * i Hy + Dp, H, + Dp,+ , H
(831)
y
La Figura 8.24 muestra la forma de las cuatro funciones de combinación de Hermite. Los polinomios de Hermite pueden ser útiles en algunas aplicaciones de digitalización en las que puede que no sea demasiado difícil especificar o aproximar las pendientes de la curva. Pero en la mayoría de los problemas de gráficos por computadora es más útil generar curvas con splines que no requieran la introducción
0.8
-
0.6
-
0.4
-
0.2
-
1
i-
0.8
0,6 :
0.6
Mr
0.4
Ü.2 -
0.2 —u
0
-0.2
(c) FIGURA 8.24.
Funciones de combinación de Hermite.
(d)
8.9 Métodos de interpolación con splines cúbicos
441
de los valores de las pendientes de la curva u otra información geométrica, además de las coordenadas de los puntos de control. Los splines cardinales y los splines de Kochanek-Bartels, estudiados en las dos secciones siguientes, son modificaciones de los splines de Hermite que no requieren la introducción de los valores de las derivadas de la curva en los puntos de control. Los procedimientos para estos splines calculan las derivadas paramétricas a partir de las coordenadas de los puntos de control.
Splines cardinales Al igual que los splines de Hermite, los splines cardinales son polinomios de interpolación por tramos cúbicos con tangentes especificas en los puntos extremos en los límites de cada sección de la curva. La diferencia es que no introducimos los valores de las tangentes en los puntos exiremos. En un spline cardinal, la pendiente en el punto de control se calcula a partir de las coordenadas de los dos punios de control adyacentes. Una sección de un spline cardinal queda completamente determinada con cuatro puntos de control consecutivos. Los puntos de control centrales son los puntos extremos de la sección, y los otros dos puntos se utilizan en el cálculo de las pendientes en los puntos extremos. Si tomamos P(//) como la representación de la función de punto paramétrica cúbica de la sección de curva entre los puntos de control p y p*,„ como en la Figura 8.25, entonces los cuatro puntos de control desde p , hasta p*., se utilizan para establecer las condiciones en los límites de la sección de spline cardinal de este modo: A
A
P(0) = p,
p'
=
P l
.-p
I(i-,)(p
í l 3
l l
H n
>
< >
- ) P i
Por tanto, las pendientes en los puntos de control p y p¿+, se toman proporcionales, respectivamente, a las cuerdas p ,p ,, y p^p^ (Figura 8.26). El parámetro / se denomina parámetro de tensión, ya que controla cómo de flojo o apretado se ajusta el spline cardinal a los puntos de control de entrada. La Figura 8.27 muestra la forma de una curva cardinal con un valor muy pequeño y con un valor muy grande de la tensión /. Cuando / = 0, esta clase de curvas se denomina splines de C'almull-Rom, o splines de Overhauser. t
4
A
¥l
pon P* i
P*-1
i
FIGURA 8.25. Función paramétrica de punto P(w) de una sección de spline cardinal entre los puntos de control p y p .
Pt + 2
P* *
A
FIGURA 8.26. Los vectores tangentes en los puntos extremos de una sección de spline cardinal son paralelos a las cuerdas formadas con los puntos de control vecinos (líneas discontinuas).
2
Pt
/<0 (Curva más abierta)
i H
r>ü (Curva más cerrada)
FIGURA 8.27. Efecto del parámetro de tensión sobre la forma de una sección de spline cardinal.
442
CAPÍTULO 8 Representaáones de objetos tridimensionales
I
0,8 0.6 0.4 0.2 0
o
I
-0.2 (a)
FIGURA 8.28. Funciones de combinación de splines cardinales con / = 0 (.v = 0.5). Utilizando métodos similares a los utilizados para los polinomios de Hermite, podemos convertir las condiciones 8.32 de los límites a su forma matricial.
P*
(8.33)
P. . +
9m
donde la matriz cardinal es:
Mi =
-s
2-.v
.v-2
s
m
s-3
3-2J
-s
0
s
0
0
1
0
0
(8.34)
con.v = (1 - |)/2. Desarrollando la Ecuación matricial 8.33 en forma polinómica, tenemos:
8.9 Métodos de interpolación con splines cúbicos
443
!'(«) = R - i h w + 2s u - s u) + p [(2 - s ) * + (j - 3)w + 11 3
2
3
:
A
3
+ PA^I [(* - 2)w + (3 - 2s)tr + s u] + p Cv M - A* te) 3
AI2
= P * - , C A R ( ) + p* C A R , ( w ) + p 0
W
4 + l
CAR (w) + p , CAR (jí) 2
A
3
2
donde los polinomios CAR («) con A = 0, I, 2, 3 son las funciones de combinación de los splines cardinales. La Figura 8,28 proporciona un dibujo de las funciones base para los splines cardinales con / = 0. En las Figuras 8.29, 8.30 y 8.31 se proporcionan ejemplos de curvas producidas con las funciones de combinación de splines cardinales. En la Figura 8.29, se dibujan cuatro secciones de un spline cardinal para formar una curva cerrada. La primera paite de la curva se genera utilizando el conjunto de puntos de control ¡p, , Pi. fr* P i K ' segunda curva se produce con el conjunto de puntos de control {p,, p , p„ p„}, la tercera curva tienen los puntos de control ¡p , p¡, p , p,} y la última sección de la curva tiene los puntos de control {p , p , p„ p ¡. En la Figura 8.30, se obtiene una curva cerrada con una única sección de spline cardinal cambiando la posición del tercer punto de control a la posición del segundo punto de control. En la Figura 8.31, se produce una sección de spline cardinal que se autointersecta estableciendo la posición del tercer punto de control muy cerca de la posición del segundo punto de control. La aulointersección que resulta es debida a las restricciones en la pendiente de la curva en los puntos extremos p. y p . A
(
a
2
:
0
3
0
:
2
7
6 '5
4 3 2
II
:lai
i
• 1
i
a
. 1 . . . . 1 , 4 6
•
, . , 1 ,_ i
8
1» ) i
i
Jf
—nt)
i
i_
-1 FIGURA 8.29. Una curva cerrada con cuatro secciones de spline cardinal, obtenida con una permutación circular de los punios de control y con un parámetro de tensión t = 0.
Q
10
=
P. P2
8 6 4
2
• ' ' • 1 0
2
'
l
I
I
I 4
I
l_J
I
I 6
I
I
I
I
I 8
1
l_J
I
I
i P10
FIGURA 8.30. Un bucle de spline cardinal producido con unos puntos extremos de la curva en la misma posición en coordenadas. Se asigna el valor 0 al parámetro de tensión.
444
CAPÍTULO 8 Representaciones de objetos tridimensionales 2.50
r-
2.25 '-
\t 2.00 r 1.75
7
1.50 r 1.25 .i— 1
I 1)0
1
1
1 1 1 1
J
I
I
L
10 Pn
• P*
FIGURA 8.31. Una parte de una curva con spline cardinal que se auloinlcrsecta producida con posiciones de los puntos extremos de la curva muy próximos en el espacio. El valor del parámetro de tensión se establece en el valor 0.
Splines de Kochanek-Bartels Estos polinomios de interpolación cúbicos son extensiones de los splines cardinales. Se introducen dos parámetros adicionales en las ecuaciones de las restricciones que definen los splines de Kochanek-Bartels para proporcionar mayor flexibilidad en el ajuste de las formas de las secciones de la curva. Dados cuatro puntos de control consecutivos, etiquetados como p¿_|, p , p ,, y p d e f i n i m o s las condiciones de los límites de una sección de curva de Kochanek-Bartels entre p y p ,, del modo siguiente: A
A
P(()) = p
(
'< »,n =
4
A
4
P(l) = P p
k
4frI
^(1 -/)[< 1 + 1 - ' K P , -P _,) t
+ (l-/')(l + c)(p, -p )| ( l
^*U=^(l-/)|íU/0(l r)íp +
t ( |
-pJ
+ (|-/7)(l- -)(p^í
(SiJ6)
A
P i M
)|
donde / es el parámetro de tensión, h es el parámetro de desplazamiento (bias) y c es el parámetro de continuidad. En la formulación de Kochanek-Bartels, las derivadas paramétricas podrían no ser continuas en los límites de las secciones. El parámetro de tensión / se interpreta del mismo modo que en la formulación del spline cardinal; es decir, controla lo suelto o apretado de las secciones de la curva. El parámetro de desplazamiento. A, se utiliza para ajustar la curvatura en cada extremo de una sección, para que las secciones de la curva se puedan desplazar hacia un extremo o hacia el otro (Figura 8.32). El parámetro c controla la continuidad del vector tangente en los límites de las secciones. Si a c se le asigna un valor distinto de cero, existe una discontinuidad en la pendiente de la curva en los límites de las secciones. Los splines de Kochanek-Bartels se diseñaron para modelar trayectorias de animación. Concretamente, los cambios bruscos en el movimiento de un objeto se pueden simular con valores distintos de cero en el parámetro c. Estos cambios de movimiento se utilizan en dibujos animados, por ejemplo, cuando un personaje de dibujos animados se detiene rápidamente, cambia de dirección o colisiona con algún otro objeto.
8.10 Curvas con splines de Bézier
445
P2 p
«v_yPi
p
> 1
* —
p
« * ^ y P i
b
FIGURA 8.32. Efecto del parámetro de dcsplazamiento sobre la forma de una sección de un spfine de Kochanek-Bartels.
P»V^*P-» b>0
8.10 CURVAS CON SPLINES DE BÉZIER Este método de aproximación con spline fue desarrollado por el ingeniero francés Pierre Bézier para su uso en el diseño de las carrocerías de automóviles Renault. Los sptines de Bézier disponen de unas propiedades que los hacen especialmente útiles y convenientes para el diseño de curvas y superficies. Además, son fáciles de implementar. Por estas razones, los splines de Bézier están disponibles con mucha frecuencia en diversos sistemas CAD, en paquetes para gráficos generales y en paquetes heterogéneos de dibujo y pintura. Por lo general, una parte de una curva de Bézier se puede ajustar a cualquier número de puntos de control, aunque algunos paquetes gráficos limitan el número de puntos de control a cuatro. El grado del polinomio de Bézier se determina con el número de puntos de control que hay que aproximar y con su posición relativa. Como en los splines de interpolación, podemos especificar la trayectoria de la curva de Bézier en las proximidades de los puntos de control utilizando funciones de combinación, una matriz de caracterización, o las condiciones en los límites. En las curvas generales de Bézier, sin restricciones en el número de puntos de control, la especificación de la función de fundido es la representación más conveniente.
Ecuaciones de las curvas de Bézier En primer lugar consideraremos el caso general con n + 1 puntos de control, indicados como p = (x y z ) donde k varía desde O a n . Estos puntos se combinan para producir el siguiente vector de posición P(w), que describe la trayectoria de una función de aproximación polinómica de Bézier entre p„ y p„. 4
P ( W ) = £ p *
B
E
Z
* > ) '
0< <1 W
ky
h
k y
(8.37)
Las funciones de combinación de Bézier BEZ (w) son los polinomios de Berstein, 4(1
BEZ*„(w) =
C(A/,*)Í/(I - «)""*
(8.38)
donde los parámetros C(w, k) son los coeficientes binomiales: C(n,k) =
^ k\(n-k)\
(8.39)
La Ecuación vectorial 8.37 representa un sistema de tres ecuaciones paramétricas en las coordenadas individuales de la curva:
*(«) = £ * B E Z » t
t
y(u) = '¿y BEZ (u) k
(8.40)
ka
z(w) = ¿ z B E Z » 4
*=0
t
446
CAPITULO 8
Representaciones de objetos tridimensionales
En la mayoría de los casos, una curva de Bé/ier es un polinomio de un grado menos que el número de puntos de control designados: tres puntos generan una parábola, cuatro puntos una curva cúbica, y asi sucesivamente. La Figura 8.33 muestra la apariencia de algunas curvas de Bé/ier para varias selecciones de puntos de control en el plano xy (z = 0). Con ciertas posiciones de los puntos de control, sin embargo, obtenemos polinomios de Bé/ier degenerados. Por ejemplo, una curva de Bé/ier generada con tres puntos de control colineales es un segmento de línea recta. Y un conjunto de puntos de control que están todos en la misma posición producen una «curva» de Bé/ier que es un único punto. Se pueden utilizar cálculos recursivos para obtener los valores sucesivos de los coeficientes binomiales del siguiente modo: n
k+ l
C(n.k)= ~ C(n,k -1) k
(SAI)
para n > k. También, las funciones de combinación de Bé/ier satisfacen la relación recursiva, B E Z * » = (I - u)BEZ
kj¡
donde B E Z „ = M* y B E Z
(U
,(*/) + // BEZ,_,„-,(«),
n> k > 1
(8.42)
= (1 - úf.
Ejemplo de un programa de generación de curvas de Bézier En el siguiente programa se proporciona una implcmcntación para el cálculo de las funciones de combinación de Bézier y la generación de una curva bidimensional con splines de Bé/ier cúbicos. Se definen cuatro puntos de control en el plano xy, y se dibujan 1000 posiciones de píxeles a lo largo de la trayectoria de la curva utilizando un grosor de píxel de 4. En el procedimiento b i n o m i a l C o e f f s se calculan los valores de los coeficientes binomiales y en el procedimiento c o m p u t e B e z P t se calculan las coordenadas a lo largo de la
Pl
Pl
P2
P
(
(e) FIGURA 8 . 3 3 . I jcmplos de curvas de Bézier bidimcnsionales generadas con tres, cuatro y cinco puntos de control. Las lincas discontinuas conectan los puntos de control.
8.10 Curvas cotí sptines de Bézier
447
FIGURA 8.34. Una curva de Bézier visualizada mediante el programa de ejemplo. trayectoria de la curva. Estos valores se pasan al procedimiento b é z i e r , y se dibujan las posiciones de los pixeles utilizando las subrutinas de dibujo de puntos de OpenGL. De forma alternativa, podríamos haber aproximado la trayectoria de la curva con segmentos de línea recta, utilizando menos puntos. En la Sección 8.17 se estudian métodos más eficientes para generar las coordenadas a lo largo de la trayectoria de una curva con splines. En este ejemplo, los límites de las coordenadas universales se establecen para que se visualicen sólo los puntos de la curva dentro del visor (Figura 8.34). Si quisiéramos también dibujar los puntos de control, el grafo de control, o el armazón convexo, necesitaríamos ampliar los límites de la ventana de recorte en coordenadas universales.
Kinclude
JJinclude
«include
/*
Establece
GLaizei /*
el
winWidth
Establece
el
tamaño i n i c i a l =
600,
de
winHeight
tamaño d e
la
la -
ventana
ventana
de v i s u a l i z a c i o n .
*/
600; de
GLfloat
xwcMin
=
-50.0,
xwcMax
=
50.0;
QLfloat
ywcMin
=
-50.0,
ywcMax
=
50.0;
recorte en
coordenadas
universales.
*/
CAPITULO 8 Representaciones de objetos tridimensionales
c l a s s wcPt3D
{
publics GLfloat
void
init
/*
x,
y,
z;
el
color de
(void)
Establece
glClearColor
void plotPoint
U.O,
1.0,
la ventana de v i s u a l i z a c i o n en bianco
1.0,
0.0),-
(wcPt3D b e z C u r v e P t )
\ glBegin
(GL_POINTS);
glVertex2f glEnd
/*
(
(bezCurvePt.x,
Calcula
los
coeficientes
void binomialCoeffe
binomiales
(GLint n,
GLint
I^^^^^^^^P GLint
k,
C
k <= n;
*
C para un v a l o r dado de
n.
*/
C)
^^^^^^^^^^^^^^^
j;
f o r (k = 0; /*
bezCurvePt.y);
);
k++l
Compute n ! / ( k ! (n - k) t) . -A .*../ . :
[k]
for
- 1;
(j
- tij
C [k]
j
>- k + 1;
( j - n - k; C ik]
j--)
*- j ; j
ir+)
>- 2 ;
/- j ;
^^^^^^^^^^^^^^^^^^^^^^^ void
computeBezPt
(GLfloat
u,
wcPt3D
wcPt3D * G L i n t k, GLfloat
«
nCtrlPts
-
bezPt,
ctrlPts,
GLint
nCtrlPts,
G L i n t * C)
1;
bezBlendFcn;
bezPt->x /*
n
*
=
Calcula
bezPt->y las
=
bezPt->z
funciones de
combinación.
-= 0; k < n C t r l P t s ; +»
0.0;
combinación y
C
[kj
ctrlPts
k++)
* pow
control
[k].x
{ (u,
k)
* pow
*
bezBlendFcn;
bezPt->y +»
ctrlPts
[k].y *
bezBlendFcn;
bezPt->z
ctrlPts
fk].z
bezBlendFcn;
+«
l o s puntos de
*/
bezBlendFcn = bezPt->x
*
*
íl
- u,
n - k);
de
8.10 Curvas con splines de Hézier
void b e z i e r
wcPt3D
(wcPt3D
/* =
*C,
e s p a c i o para
new G L i n t
(k u
= =
(nCtrlPts
0;
coeficientes
-
1,
GLfloat
(k)
/
(u
SbezCurvePt,
[
]
c u r v a que
glColor3f bezier
•
4,
[4]
se
ctrlPta,
C);
nBezCurvePts =
{
de
control
=
de lo
e j e m p l o y un número de l a r g o de
0.0,
(ctrlPts,
{-40.0,
-40.0,
{10.0,
-200.0, //
0.0),
{-10.0,
0.0},
Borra
200.0,
{40.0,
40.0,
0.0);
//
nCtrlPts,
winReshapeFcn
(GLint
M a n t i e n e una (0,
glMatrixMode
Establece
el
color
nBezCurvePts) ;
newWidth,
GLint
newHeight)
glClear
relación
0,
de
aepeto de valor
newHeight,
newHeight);
(GL_PROJECTION);
glLoadldentity gluOrtho2D
(
);
(xwcMin,
xwcMax,
ywcMin,
(GL_COLOR_BUFFER_BIT);
} v o i d main
(int
Bezier.
0.0), 0.0}
};
la ventana de visualizaciÓn.
1 /*
curva de
1000;
) ;
glViewport
la
(4);
(1.0,
(
nCtrlPts,
deben d i b u j a r a
(GL_COL0R_BUFFER_BIT);
glPointSize
glFlush
(nBezCurvePts);
un número de p u n t o s
de
ctrlPte
glClear
GLfloat
(
ívoid)
nCtrlPts
wcPt3D
(
k++)
C;
puntos
GLint
*/
(bezCurvePt);
Establece
*
binomiales
C) ;
k <= n B e z C u r v e P t s ;
displayFcn
void
los
computeBezPt
delete
/*
GLint nBezCurvePti
[nCtrlPtsl ;
plotPoint
void
nCtrlPts,
k;
binomialCoeffs for
GLint
U;
Reserva
C
ctrlPts,
bezCurvePt;
GLfloat GLint
*
arge,
char**
argv)
ywcMax);
1.0.
*/
de
los
puntos
en
rojo
449
450
CAPÍTULO 8
Representaciones de objetos tridimensionales
glutlnit
(&argc,
argv);
gliltJnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow init
(
(50,
(winWidth, ("Curva
|
GLDT_RGBÍ ;
50);
de
winHeight); r t
Bezier );
);
glutDisplayFunc
(displayFcn)¡
glutReshapeFunc
(winReshapeFcn);
glutMainLoop
{
);
)
Propiedades de las curvas de Bézier Una propiedad muy útil de una curva de Bézier es que la curva une el primer punto de control con el último. Por tanto, una característica básica de cualquier curva de Bézier es que,
P(0) = p
0
( S A > )
PCD-P.
Los valores de las primeras derivadas paramétricas de una curva de Bézier en los puntos extremos, se pueden calcular a partir de las coordenadas de los puntos de control del siguiente modo: P'(0) = -np + «p, tí
1> (1) = -/ip,,_, + w
(
M
4
)
Ptt
En estas expresiones, vemos que la pendiente en el comienzo de la curva tiene la dirección de la línea que une los dos primeros puntos de control y la pendiente en el extremo final de la curva tiene la dirección de la línea que une los dos últimos puntos extremos. De forma similar, las segundas derivadas paramétricas de una curva de Bézier en sus puntos extremos se calcula como sigue:
P " ) = n{n - ])[(p - p ) - (p, - p )] (0
2
(
0
P"(l) = / ! ( » - D K R . - 2 - P , ,)-(P„ , - p „ ) J Otra propiedad importante de cualquier curva de Bézier es que se encuentra dentro del armazón convexo (polígono convexo) de los puntos de control. Esto se deriva del hecho de que las funciones de combinación de Bézier son todas positivas y su suma es siempre 1, ¿BEZ >)=1 4
(8.46)
de forma que cualquier punto de la curva es simplemente la suma ponderada de los puntos de control. La propiedad del armazón convexo de una curva de Bézier garantiza que el polinomio sigue suavemente los puntos de control sin oscilaciones erráticas.
Técnicas de diseño utilizando curvas de Bézier Una curva de Bézier cerrada se genera cuando establecemos el último punto de control en la posición del primer punto de control, como en el ejemplo mostrado en la Figura 8.35. También, especificando múltiples
8.10 Curvas con splines de Bézier
451
9a
FIGURA 8.35. Una curva de Bézier cerrada generada especificando el primer y el úkimo punto de control en la misma posición.
FIGURA 8.36. Se puede conseguir que una curva de Bézier pase más cerca de una posición dada asignando múltiples puntos de control a dicha posición.
puntos de control en una única posición proporciona más peso a dicha posición. En la Figura 8.36, una única posición de coordenadas se introduce como dos puntos de control y la curva resultante se desplaza hacia las proximidades de esta posición. Podemos ajustar una c u n a de Bézier a cualquier número de puntos de control, pero esto requiere el cálculo de funciones polinómicas de grado superior. Cuando hay que generar curvas complicadas, éstas se pueden formar uniendo varias secciones de curvas de Bézier de menor grado. La generación de secciones de curvas de Bézier más pequeñas también proporciona un mejor control local sobre la forma de la curva. Ya que las curvas de Bézier tienen la importante propiedad de que la tangente a la curva en un punto extremo tiene la dirección de la línea que une aquel punto extremo con el punto de control adyacente. Por tanto, para obtener continuidad de primer orden entre las secciones de la curva, podemos seleccionar los puntos de control p„ y p, para la siguiente sección de la curva de forma que estén sobre la misma línea que los puntos de control P*-i y de la parte anterior (Figura 8.37). Si la primera sección de la curva tiene // puntos de control y la sigúeme sección tiene n' puntos de control, entonces hacemos coincidir las tangentes a la curva colocando el punto de control p, en la posición —
P ^ + ^ Í P ^ - P n - l )
(H.47)
Para simplitlar la colocación de p , , podemos requerir sólo continuidad geométrica y colocar p,. en cualquier sitio sobre la línea que une p„. , y p„. Obtenemos continuidad C utilizando las expresiones de las Ecuaciones 8.45 para emparejar las segundas derivadas paramétricas de las dos partes de Bézier adyacentes. Esto establece una posición para el punto de control p , además de las posiciones lijadas para p„- y p que necesitamos para obtener continuidad & y C . Sin embargo, requerir continuidad de segundo orden para las secciones de la curva de Bézier puede ser una restricción innecesaria. Esto es particularmente cierto en curvas cúbicas, que tienen sólo cuatro puntos de control en cada parte. En este caso, la continuidad de segundo orden tija la posición de los tres primeros puntos de control y nos deja sólo un punto para que podamos ajustar la forma del segmento de curva. :
1
?
r
Curvas de Bézier cúbicas Muchos paquetes gráficos proporcionan funciones para visualizar únicamente splines cúbicos. Esto permite una flexibilidad de diseño razonable en tanto que evita el incremento de cálculos que necesitan los polinomios de orden más elevado. Las curvas de Bézier cúbicas se generan con cuatro puntos de control. Las cuatro
452
CAPÍTULO 8
Representaciones de objetos tridimensionales
FIGURA 8.37. Curva de aproximación por tramos formada por dos secciones de Bézier. La continuidad de orden cero y de primer orden se logra en las dos secciones de la curva estableciendo p„ = p y definiendo p, sobre la línea formada por los puntos p y p . :
2
(c)
FIGURA 8.38. Las cuatro funciones de combinación para curvas cúbicas (n = 3).
(d)
8.10 Curvas con splines de Bézier
453
funciones de combinación para curvas de Bézier cúbicas, obtenidas sustituyendo n = 3 en la Ecuación 8.38, son:
BEZ = (1 - u? W
BEZ
I>3
BEZ
2 3
BEZ
3 3
= 3w(l - $
(8.48)
= 3w-(l - u) = w?
En la Figura 8.38 se proporcionan gráficas de las cuatro funciones cúbicas de fundido de Bézier. La forma de las funciones de combinación determina la influencia de los puntos de control en la forma de la curva para los valores del parámetro u en el rango que varía desde 0 a I. Para u = 0, la única función de fundido distinta de cero es B E Z q , que tiene el valor 1. Para u = 1, la única función de fundido distinta de cero es B E Z (1) = I, Por tanto, una curva de Bézier cúbica siempre comienza por el punto de control pt, y termina en el punto de control p . Las otras funciones, B E Z , , y B E Z , influyen en la forma de la curva para valores intermedios del parámetro w, de modo que la curva resultante tiende hacia los puntos p, y p . La función de fundido BEZ, í tiene su máximo en u = 1/3, y B E Z en u = 2/3. 3
U
3
2 i
2
2 3
En la Figura 8.38 apreciamos que cada una de las cuatro funciones de combinación es distinta de cero sobre todo el rango del parámetro u entre los puntos extremos. Por tanto, las curvas de Bézier no permiten control local de la forma de la curva. Si reposicionamos cualquiera de los puntos de control, se ve afeclada toda la curva. En los puntos extremos de la curva de Bézier cúbica, las primeras derivadas (pendientes) paramétricas son:
P'(0) = 3(p, - p ),
P'(D = 3 ( P . i - p )
0
2
Y las segundas derivadas paraméticas son
P"(0) = 6 ( p - 2 p , + p ), o
P"
2
P l
2
3
Podemos construir curvas complejas con splines utilizando una serie de secciones de curvas cúbicas de Bézier. Utilizando expresiones para las derivadas paramétricas, podemos igualar las tangentes a la curva para lograr continuidad C entre las secciones de la curva. Y podríamos utilizar las expresiones para las segundas derivadas para obtener continuidad C\ aunque esto nos deja sin opciones en la colocación de los tres primeros puntos de control. Se obtiene una formulación matemática para la función de curva de Bézier cúbica, desarrollando las expresiones polinómicas de las funciones de combinación y reestructurando las ecuaciones como se indica a continuación.
P« P(u) = l«
3
:
u
u
Pl
l ] M tici
(8.49)
p p, 3
donde la matriz de Bézier es: - 1
3
1
-6
- 3
1
3
0
- 3
3
0 0
1
0 0 0
(8.50)
También podríamos introducir parámetros adicionales que permitan ajustar la «tensión» y el «desplazamiento» de la curva como hicimos con los splines de interpolación. Pero los splines B que son más versátiles, así como los splines / j , se proporcionan a menudo con esta capacidad.
454
CAPÍTULO 8
Representaciones de objetos tridimensionales
8.11 SUPERFICIES DE BÉZIER Dos familias de curvas de Bézier ortogonales se pueden utilizar para diseñar una superficie de un objeto. La función paramétrica del vector de una superficie de Bézier se crea con el producto cartesiano de las funciones de combinación de Bézier:
P<«^) = ¿ ¿ p , B E Z , ( v ) B E Z , ( / i ) i
; (
i
i
(
(8.51)
donde p especifica la localización de los (m + I) por (n + 1) puntos de control. La Figura 8.39 muestra dos dibujos de superficies de Bézier. Los puntos de control se unen mediante líneas discontinuas, y las lincas continuas muestran las curvas con // constante y v constante. Cada curva con u constante se dibuja variando v en el intervalo de 0 a 1, manteniendo en un valor fijo // dentro de este intervalo unitario. Las curvas con v constante se dibujan de forma similar. Las superficies de Bézier tienen las mismas propiedades que las curvas de Bézier y proporcionan un metodo conveniente para aplicaciones interactivas de diseño. Para especificar las posiciones de los puntos de control con coordenadas tridimensionales, podríamos en primer lugar construir una cuadrícula rectangular en el plano xy «de tierra». A continuación, elegimos las alturas sobre el plano de tierra en las intersecciones de la cuadrícula como los valores de la coordenada z de los puntos de control. Los parches de superficie se pueden representar con polígonos y sombrear utilizando las técnicas de sombreado expuestas en el Capítulo 10. La Figura 8.40 muestra una superficie formada por dos secciones de superficie de Bézier. Como en el caso de las curvas, se garantiza una transición suave de una sección a otra estableciendo tanto continuidad de orden cero como de primer orden en la línea límite. La continuidad de orden cero se obtiene haciendo coincidir los puntos de control en los límites. La continuidad de primer orden se obtiene seleccionando los puntos de control a lo largo de una línea recta que recorre el límite y manteniendo una relación constante entre los segmentos de línea colineales para cada conjunto de puntos de control específicos de los límites de las secciones. /tJt
8.12 CURVAS CON SPLÍNES B Esta clase de splines es la más profusamente utilizada y las funciones de splines B están disponibles habitualmente en los sistemas CAD y en muchos paquetes de programación de gráficos. AI igual que los splines de Bézier, los splines B se generan aproximando un conjunto de puntos de control. Pero los splines B presentan dos ventajas frente a los splines de Bézier: (1) el grado de un polinomio de un spline B se puede establecer de forma independiente al número de puntos de control (con ciertas limitaciones), y (2) los splines B permiten control local sobre la forma de un spline. La desventaja es que los splines B son más complejos que los splines de Bézier.
Ecuaciones de una curva con splines B Podemos escribir una expresión general para el cálculo de las coordenadas a lo largo de una curva con splines B utilizando la formulación con funciones de combinación del siguiente modo:
P<«) = I p A » >
№* * " S 9 m m
2 < < /i + 1
(8.52)
pj donde pt define un conjunto de entrada de n -F 1 puntos de control. Existen varias diferencias entre esta for
mulación con splines B y las expresiones de una curva con splines de Bézier. El rango de variación del parámetro // ahora depende de cómo elijamos los otros parámetros de los splines B. Y las funciones de combina-
8.12 Curvas can splines B
455
ción de los splines B B , son polinomios de grado d - 1, donde des el p a r á m e t r o de grado. (A veces al parámeiro í/se le llama «orden» del polinomio, pero esto puede confundir, ya que el término orden se utili/a a menudo también para indicar simplemente el grado del polinomio, que es d — 1.) Al parámetro de grado dse le puede asignar cualquier valor entero dentro del rango que varía desde 2 hasta el número de puntos de conIrol n + 1. Realmente, podríamos también establecer el valor del parámetro de grado en 1, pero entonces nuestra «curva» sería sólo una gráfica de puntos con los puntos de control. El control local en los splines B se logra definiendo las funciones de combinación sobre subintervalos del rango total de variación de u. k¡
(a)
(b)
FIGURA 8.39. Superficies de Bé/ier en modelo alámbrico contruidas con (a) nueve puntos de control dispuestos en una malla de tamaño 3 por 3 y (b) dieciséis puntos de control dispuestos en una malla de tamaño 4 por 4. Las lineas discontinuas unen los puntos de control.
FIGURA 8.40. Un superficie de Bé/ier compuesta eonstruida con dos secciones de Bezier, unidas por la línea límite indicada. Las líneas discontinuas unen los puntos de control. La continuidad de primer orden se establece haciendo que la relación entre la longitud /., y la longitud Z. sca constante para cada linea colineal de puntos de control en el limite entre las secciones de la superficie. ;
456
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.41. Modificación loca! de una curva con sptines B. Cambiando uno de los puntos de control en (a) se genera la curva mostrada en (b), que sólo se modifica en la vencindad del punto de control alterado. Las funciones de combinación para las curvas con de Cox-deBoor: 1
sptines
B se definen mediante las fórmulas recursivas
si u
0
it
traducir (8.53)
donde cada función de fundido se define sobre d stibintervalos del rango total de variación de //. Cada punto extremo de los subintervalos se denomina nudo, y el conjunto entero de los puntos extremos seleccionados de los subintervalos se denomina vector de nudos. Podemos elegir valores cualesquiera para los puntos extremos de los subintervalos con tal de que u
v
min
La Figura 8.41 muestra las características de control local de los splines B. Además del control locah los splines B nos permiten variar el número de puntos de control utilizados para diseñar una curva sin cambiar el grado del polinomio. Y podemos incrementar el número de valores del vector de nudos para ayudar al diseño de la curva. Cuando se hace esto, sin embargo, debemos añadir puntos de control ya que el tamaño del vector de nudos depende del parámetro /;. Las curvas con splines B tienen las siguientes propiedades: 2
•
La curva polinómica tiene grado d — 1 y continuidad C'
sobre el rango de variación de
•
En los n + 1 puntos de control, la curva se describe con n + I funciones de combinación.
•
Cada función de fundido B se define sobre d subintervalos del rango total de variación de zando por el nodo de valor u . u
comen-
k
•
El rango de variación del parámetro u se divide en n + ¿/subintervalos con los n 4- d 4- 1 valores especificados en el vector de nudos.
•
Dado que los valores de los nodos están etiquetados como {w„, W, la curva con splines B resultante está definida únicamente en el intervalo que varia desde el valor de nudo u _ , hasta el valor de nudo w . (Algunas funciones de combinación no están definidas fuera de este intervalo.) d
n+l
•
Cada sección de la curva con splines (entre dos valores de nodo sucesivos) se ve influenciada por d puntos de control.
8.12 Curvas can splines B
457
• Cualquier punto de control puede afectar a la forma de a lo sumo d secciones de la curva. Además, una curva con splines B se encuentra dentro del casco convexo de a lo sumo d + I puntos de control, de modo que los splines B están ajustadamente ligados a las posiciones de entrada. Para algún valor de N del intervalo desde el valor tic nudo w „, a w, . „ la suma sobre todas las funciones base es I: rf
H
¿
(8.54)
Dadas las posiciones de los puntos de control y el valor del parámetro de grado d, entonces necesitamos especificar los valores de los nudos para obtener las funciones de combinación utilizando las relaciones de reeurrencia 8.53. Hay tres clasificaciones generales de los vectores de nudos: uniforme, uniforme abierto y no uniforme. Los splines B se describen habitualmente según la clase seleccionada de vector de nudos.
Curvas con splines B periódicos y uniformes Cuando el espaciado entre valores de nudos es constante, la curva resultante se denomina spline B uniforme. Por ejemplo, podemos establecer un vector uniforme de nudos como el siguiente: {-1.5, - 1 . 0 , - 0 . 5 , 0.0, 0.5, 1.0, 1.5,2.0} A menudo los valores de los nudos están normalizados en el rango que varía entre 0 y 1, como en, {0.0, 0 . 2 , 0 . 4 , 0 . 6 , 0 . 8 , 1.0} Es conveniente en muchas aplicaciones establecer valores uniformes de nudos con una separación de I y un valor inicial de 0. El siguiente vector de nudos es un ejemplo de este modo de especificación. }0, 1.2, 3 , 4 , 5 , 6 , 7 }
FIGURA 8.42. Funciones de combinación de splines B periódieos para n ~ d = 3 y un vector de nudos uniforme y entero.
458
CAPÍTULO 8 Representaciones de objetos tridimensionales
Los splines B uniformes tienen funciones de combinación periódicas. Es decir, para valores dados de n y d, todas las funciones de combinación tienen la misma forma. Cada función sucesiva de fundido es simplemente una versión desplazada de la función anterior: (X.55) donde Aw es el intervalo entre valores de nudo adyacentes. La Figura 8.42 muestra las funciones de combinación de splines B uniformes y cuadráticos generados en el siguiente ejemplo para una curva con cuatro puntos de control.
Ejemplo 8 . 1
Splines B uniformes y cuadráticos
Para ilustrar la formulación de las funciones de combinación de splines B para un vector de nudos uniforme y entero, seleccionamos los valores de los parámetros n = d = 3. El vector de nudos debe contener n -h d +- \ = 7 valores de nudo: {0, 1 , 2 . 3 , 4 , 5 , 6 ! y el rango de variación del parámetro u es de 0 a 6, con /; + d = 6 subintcrvalos. Cada una de las cuatro funciones de combinación abarca d = 3 subintcrvalos del rango total de variación de w, Utilizando las relaciones de recurrencia 8.53, obtenemos la primera función de fundido: para ü < u < 1 1«(2- ) + 1(«-1)(3-H), M
para 1 < u < 2 para 2 < M < 3
Obtenemos la siguiente función periódica de fundido utilizando la relación 8.55, sustituyendo // por u — 1 en 5 , y desplazando las posiciones de comienzo hacia arriba una unidad: 0
para 1
para 2 < M < 3
i<4-„>>
para 3 < u < 4
Similarmente, las dos restantes funciones periódicas se obtienen desplazando sucesivamente 5,,, hacia la derecha: para 2 < M < 3 ^(M-2)(4-H) + ^0/-3)(5-M).
para 3 < H < 4 para 4 < u < 5
8.12 Curvas can splines B
^(w-3)\
459
para 3 < M < 4
-(W-3)(5-ÍO + -(«-4)(6-W), 2 2
para4
1
-(6-tt)
para
5<,u<6
En la Figura 8.42 se proporciona una gráfica de las cuatro funciones periódicas y cuadráticas de fundido, que muestra la caraterística local de los splines B. E^l primer punto de control se multiplica por la función de fundido # (w). Por tanto, el cambio de la posición del primer punto de control sólo afecta a la forma de la curva hasta // = 3. De forma similar, el último punto de control influye en la forma de la curva con spltnes en el intervalo donde B está definida. La Figura 8.42 también muestra los límites de la curva con splines B para este ejemplo. Todas las funciones existen en el intervalo que varía desde = 2 hasta w = 4. Por debajo de 2 y por encima de 4, no todas las funciones de combinación existen. Este intervalo desde 2 a 4, es el rango de variación de la curva polinómica, y el intervalo en el que la Ecuación 8.54 es válida. Por tanto, la suma de todas las funciones de combinación vale 1 dentro de este intervalo. Fuera de este intervalo, no podemos sumar todas las funciones de combinación, ya que no todas ellas están definidas por debajo de 2 y por encima de 4. Ya que el rango de variación de la curva polinómica que resulta es desde 2 a 4, podemos determinar el punto inicial y el punto llnai de la curva evaluando las funciones de combinación en estos puntos para obtener: (U
X}
n H
P , „ i = ^ P < , + P,>.
Pn„=^(P +P,) 2
Por tanto, la curva comienza en el punto medio entre los dos primeros puntos de control y termina en el punto medio de los dos últimos puntos de control. También podemos determinar las derivadas parainétricas en el punto inicial y en el punto final de la curva. Tomando las derivadas de las funciones de combinación y sustituyendo el parámetro // por su valor en los puntos extremos, encontramos que: Plni = Pi - Po.
P'im = ?^ - P:
La pendiente paramétrica de la curva en el punto inicial es paralela a la línea que une los dos primeros puntos de control, y la pendiente paramétrica en el punto final de la curva es paralela a la línea que une los dos últimos puntos de control. En la Figura 8.43 se proporciona un dibujo de una curva con splines B cuadrálicos y periódicos para cuatro puntos de control situados en el plano xy.
Pl
P2
FIGURA 8.43. Un spline B cuadrático y periódico ajustado a cuatro puntos de control situados en el plano xy.
En el ejemplo anterior, observamos que la curva cuadrática comienza entre los dos primeros puntos de control y termina en un punto entre los dos últimos puntos de control. Este resultado es válido para los spli-
460
CAPÍTULO 8 Representaciones de objetos tridimensionales
nes B cuadráticos y periódicos ajustados a cualquier número de punios de control distintos. Por lo general, en los polinomios de orden más elevado, el punto de comienzo y el punto final son cada uno medias ponderadas de d - I puntos de control. Podemos aproximar a cualquier punto de control cualquier curva con spiines especificando dicho punto múltiples veces. Las expresiones generales de las condiciones en los límites de los spiines B periódicos se pueden obtener volviendo a parametrizar las funciones de combinación, de manera que el rango de variación del parámetro u se transforme en el intervalo que varía desde 0 a 1. Las condiciones de comienzo y fin se obtienen entonces para u — 0 y u = 1.
Curvas con splines B cúbicos y periódicos Ya que los spiines B cúbicos y periódicos se utilizan habitual mente en los paquetes gráficos, tendremos en cuenta la formulación de esta clase de spiines. Los spiines periódicos son particularmente útiles para generar ciertas curvas cerradas. Por ejemplo, la curva cerrada de la Figura 8.44 se puede generar por secciones especificando cíclicamente cuatro de los seis puntos de control de cada sección. También, si las posiciones en coordenadas de tres puntos de control son idénticas, la curva pasa a través de dicho punto. En curvas con spiines B cúbicos, d = 4 y cada función de fundido abarca cuatro subintervalos del rango total de variación de «. Si tenemos que ajustar la cúbica a cuatro puntos de control, entonces podríamos utilizar el vector entero de nudos: 1,2.3,4,5,6,7» y las relaciones de recurrencia 8.53 para obtener las funciones periódicas de fundido, como hicimos en la última sección de los spiines B cuadráticos y periódicos. Para obtener las ecuaciones de la curva para un spline B periódico y cúbico, consideraremos una formulación alternativa comenzando por las condiciones en los límites y obteniendo las funciones de combinación normalizadas al intervalo 0 < u < 1. Utilizando esta formulación, también podemos obtener fácilmente la matriz característica. Las condiciones en los límites para spiines B cúbicos y periódicos con cuatro puntos de control, etiquetados como p , p , , p y p son: 0
2
3
P(0)
-(Po+4p,+p )
P(D
7
2
2
(8.56) P'(0)
2
(P2-P0)
P'(l)
Y
FIGURA 8.44. Un spline B cúbico por tramos, periódico y cerrado construido utilizando una especificación cíclica de cuatro puntos de control en cada sección de la curva.
8.12
Curvas con splines B
461
Estas condiciones en los límites son similares a las de los splines cardinales: las secciones de la curva se definen con cuatro puntos de control y las derivadas paramétricas (pendientes) en el comienzo y en el final de cada sección de la curva son paralelas a las cuerdas que unen los puntos de control adyacentes. La sección de la curva con splines B comienza en una posición cercana a p, y termina en una posición cercana a p . Una formulación matricial de un spline B cúbico y periódico con cuatro puntos de control se puede escribir del siguiente modo: :
Pn P.
(8.57)
P P, donde la matriz del spline B para polinomios cúbicos y periódicos es: -i
3
-3
3
-6
3
6 -3 I Esta matriz se puede obtener resolviendo los coeficientes en una expresión general polinomial cúbica, utilizando las cuatro condiciones específicas en los limites. También podemos modificar las ecuaciones del spline B para incluir un parámetro de tensión / (como en los splines cardinales). La matriz de un spline B periódico y cúbico, en la que se incluye el parámetro de tensión /, es:
'
-i
\2-9t
9/-12
3í
I2/-I8
18-15/
0
3/
6-2/
t
6 -3/ ;
(8.59)
que coincide con M„ cuando / = 1. Obtenemos las funciones de combinación de splines B periódicos y cúbicos en el rango de variación del parámetro desde 0 a 1 desarrollando la representación matricial hasta la forma polinómica. Por ejemplo, utilizando el valor de tensión 1=1, tenemos: 0
fi («) = | ( l - ) \ o n i
M
e ( )= ll
M
3
2
-(3« -6u +4) 6
(8.60)
í
&u(u) = y{-3u + 3 / r + 3 « + l ) 6
Curvas con splines B abiertos y uniformes Esta clase de splines B es una combinación de splines B uniformes y splines B no uniformes. A veces se trata como un tipo especial de spline B uniforme y otras se considera como un spline B no uniforme. En los 473/»-
462
CAPÍTULO 8 Representaciones de objetos tridimensionales
nes B abiertos y uniformes, o simplemente splines B abiertos, el espaciado de los nudos es uniforme excepto en los extremos, en los que los valores de los nudos se repiten d veces. A continuación se muestran dos ejemplos de vectores de nudos abiertos, uniformes y enteros que comienzan por el valor 0. {0, 0, 1, 2, 3, 3}
donde d = 2 y n = 3 (8.61)
{0, 0, 0, 0, 1, 2, 2, 2, 2}
donde d = 4 y n = 4
Podemos normalizar estos vectores de nudos al intervalo que varía desde 0 a I del siguiente modo: {0, 0, 0.33, 0.67, 1, 11
donde d = 2 y n = 3
^
^
{ 0 , 0 , 0 , 0 , 0 . 5 , 1. i, I, 1} donde ¿/ = 4 y * = 4 Para valores cualesquiera de los parámetros dy //, podemos generar un vector de nudos abierto y uniforme con valores enteros utilizando los cálculos: 0
para ü < j < d
jd +1 n-d + 2
para d < j < n
(8,63)
para / > n
para valores de j dentro del rango de variación de 0 a n + d. Con esta asignación, a los primeros d nudos se les asigna el valor 0 y los últimos d nudos tienen el valor n — d + 2. Los splines B uniformes tienen características que son muy similares a las de los splines de Bézier. De hecho, cuando d = n +1 (el grado del polinomio es w), los splines B son idénticos a los splines de Bézier, y lodos los valores de los nudos son 0 o 1. Por ejemplo, pan» un spl/ne B abierto y cúbico (d = 4) y cuatro puntos de control, el vector de nudos es: ¡ 0 , 0 , 0, 0. 1, 1. I. 1} La curva polinómica de un spline B abierto une los primeros con los últimos puntos de control. También, la pendiente paramétrica de la curva en el primer punto de control es paralela a la línea recta formada por los dos primeros puntos de control, y la pendiente paramétrica en el último punto de control es paralela a la línea definida por los dos últimos puntos de control. Por tanto, las restricciones geométricas para hacer coincidir las secciones de la curva son las mismas que las de las curvas de Bézier. Como en las curvas de Bézier, especificar múltiples puntos de control en la misma posición en coordenadas desplaza cualquier curva con splines B más cerca de dicha posición. Ya que los splines B abiertos comienzan por el primer punto de control y terminan en el último punto de control, se puede generar una curva cerrada estableciendo el primer punto de control y el último en la misma posición de coordenadas.
Ejemplo 8 . 2 Splines B a b i e r t o s , u n i f o r m e s y c u a d r á t i c o s A partir de las condiciones 8.63 con d = 3 y n = 4 (cinco puntos de control), obtenemos los ocho valores siguientes del vector de nudos: §¿g «„ w ,i/ , M . w , % ity ! = {0, 0, 0, 1, 2, 3, 3, 3 ¡ 2
3
4
5
El rango total de variación de tt se divide en siete subintervalos, y cada una de las cinco funciones de combinación B están definidas sobre tres subintervalos, comenzando por el nudo u . Por tanto, 5„, está definido desde u = 0 hasta = 1, B está definido desde H, = 0 hasta u = 2 y B está definido desde // = 2 hasta u-¡ — 3. Las expresiones explícitas polinómicas de las funciones de combinación se obtienen a partir de las relaciones de recurrencia 8.53 y son las siguientes: u
k
{ )
4
u
A
A > 3
8.12 Curvas con splineí B
FIGURA 8.45. I-unciones de combinación de xplines H abiertos y uniformes con n = 4 y d = 3.
B {u) ll}
0
2
=
(\-u) 1
M(4-3M) 2
±<2-«)
fi,,( ) = M
2
-H(2-H)+-«(«-1)(3-M) 2 2
0 <« < I 1
1SM<2
2 < « < 3
464
CAPÍTULO 8 Representaciones de objetos tridimensionales
\
4
» = (i/-2)
2
2
La Figura 8.45 muestra la forma de estas cinco funciones de combinación. Se observan de nuevo las características locales de los splines B. La función de fundido fí es distinta de cero sólo en el subinlervalo que varía de 0 a 1, de modo que el primer punto de control sólo influye en la curva en este intervalo. De forma similar, la función B , es 0 fuera del intervalo que varía de 2 a 3, y la posición del último punto de control no afecta a la forma del comienzo ni a las partes medias de la curva. OÍ
4
Las formulaciones matricialcs de los splines B abiertos no se generan tan cómodamente como las de los splines B periódicos y uniformes. Esto es debido a la multiplicidad de los valores de los nodos en el comienzo y final del vector de nudos.
Curvas con splines B no uniformes En esta clase de splines, podemos especificar cualesquiera valores e intervalos en el vector de nudos. En los splines B no uniformes, podemos elegir múltiples valores de nudos internos y espaciados desiguales entre los valores de los nudos. Algunos ejemplos son: {0,1,2,3,3,4} {0, 2, 2 , 3 , 3 , 6 } { 0 , 0 , 0 , I, 1,3, 3 , 3 } {0, 0.2, 0.6, 0.9, 1.0} Los splines B no uniformes proporcionan una mayor flexibilidad en el control de la forma de la curva, Con los intervalos desigualmente espaciados en el vector de nudos, obtenemos formas diferentes en las funciones de combinación en intervalos diferentes, que se pueden utilizar para diseñar las características de los splines. Al incrementar la multiplicidad de los nudos, podemos producir variaciones sutiles en la trayectoria de la curva e introducir discontinuidades. Los valores múltiples de los nodos también reducen la continuidad en una unidad con cada repetición de valor concreto. Obtenemos las funciones de combinación de un spline B no uniforme utilizando métodos similares a los estudiados para los splines B uniformes y abiertos. Dado un conjunto de n + I puntos de control, establecemos el grado del polinomio y seleccionamos los valores de ios nudos. A continuación, utilizando las relaciones de recurrencia, podríamos obtener el conjunto de funciones de combinación o evaluar directamente los puntos de la curva para su visualización. Los paquetes gráficos a menudo restringen los intervalos de los nodos a 0 o 1 para reducir los cálculos. LIn conjunto de matrices características se puede almacenar entonces y utilizar para calcular los valores a lo largo de la curva con splines sin evaluar las relaciones de recurrencia en cada punto de la curva que hay que dibujar.
8.13 SUPERFICIES CON SPLINES B La formulación de una superficie con splines B es similar a la de la superficie con splines de Bézier. Podemos obtener una función vectorial del punto sobre una superficie con splines B utilizando el producto cartesiano de las funciones de combinación de los splines B de este modo:
8.14 Splines beta
465
FIGURA 8.46. Un prototipo de helicóptero, diseñado y modelado por Daniel Langlois de SOFTIMAGE, Inc., Montreal, Quebec, Canadá, utilizando 180.000 parches de superficie con splines B. La escena se sombreó utilizando trazado de rayos, mapas de abultamienlos y mapas de rellexión. {Cortesía de Silicon Graphics, Inc.)
P(«,v) = ¿ ¿
Pt„,A.,
L
(«)»,.„,
№
(8.64)
A„-0A,»0
donde los valores del vector
^ especifican las posiciones de los ( « „ + ! ) por ( & + 1 ) puntos de control.
Las superficies con splines B exhiben las mismas propiedades que sus curvas componentes con splines B. Una superficie se puede construir a partir de valores seleccionados para los parámetros de grado d y d que u
V9
establecen los grados de los polinomios ortogonales de la superficie en d„ - 1 y d - 1. Para cada parámetro u y v de la superficie, también podemos seleccionar valores para los vectores de nudos, que determinan el rango del parámetro en las funciones de combinación. La Figura 8.46 muestra un objeto modelado con superficies con splines B. v
8.14 SPLINES BETA Los splines beta son una generalización de los splines B, también denominados splines que se formulan imponiendo condiciones de continuidad geométrica en la primera y segunda derivadas paramétricas. Los parámetros de continuidad en los splines beta se denominan parámetros beta.
Condiciones de continuidad de los splines beta En un vector específico de nudos, nombramos las secciones del spline de izquierda a derecha de un nudo particular Uj con los vectores de posición P, y P,(w) (Figura 8.47). La continuidad de orden cero (continuidad pos icional), G°, en Uj se obtiene requiriendo que: P,_,(« ) = Vj( )
(8.65)
Uj
;
La continuidad de primer orden {continuidadde tangente unitaria), G\ se obtiene requiriendo que los vectores tangente sean proporcionales: J
8 p;. (« ) = P > l
1
y
i
) ,
A>o
(8.66)
En este punto, las primeras derivadas paramétricas son proporcionales y los vectores unitarios tangentes son continuos a través del nudo.
466
CAPÍTULO 8
Representaciones tic objetos tridimensionales
P.l«)
FIGURA 8.47.
VectoreN de posición a lo largo de las secciones de la curva a
la i/quierda y a la derecha del nudo
¥-1
P. " I FIGURA 8.48.
Pi » I
Efecto del páramela) /f sobre la forma de una curva con
p
(
P: - »
splines
2
beta.
» I
FIGURA 8.49. bfeclo del parámetro /J,on la forma de una curva con splines beta. La continuidad de segundo orden (continuidad Je vector Je curvatura), G^, se impone con la condición: ,
A- p;: («,)+Ap;_ («,)=p;'(« ) l
l
mn
y
donde a f} se le puede asignar cualquier número real y /3, > 0. El vector de curvatura! proporciona una medida de la cantidad que se dobla la curva en la posición u Cuando /3, = I y fi, = 0, los splines beta se convierten en splines B. El parámetro /3, se denomina parámetro Je Jesplazamiento ya que controla el desplazamiento de la curva. Parfl ¡í\ > 1. la curva tiende a alisarse a la derecha en la dirección del vector unitario tangente en los nudos. Para (í < /3, < 1. la curva tiende a alisarse hacia la izquierda. El efecto de /3, sobre la forma de la curva con splines se muestra en la Figura 8.48. El parámetro /3 se denomina parámetro Je tensión ya que controla cómo de tenso o suelto se ajusta el spline al gralb de control. A medida que crece, la curva se aproxima a la forma del grafo de control, como se muestra en la Figura 8.4°. 2
r
:
Representación matricial de splines beta cúbicos y periódicos Aplicando las condiciones en los límites de un spline beta a un polinomio cúbico con un vector uniforme de nudos, obtenemos la representación matricial de un spline beta periódico.
M
*4
6tf
- 3 ( f t +
2/V+2/J;)
3 ( & + 2 / 3 f )
ü (8.68)
-6/?/
6( # - / ? , )
20f
&+4
donde S = £ + 2/3,' + 40? + 40, + 2.
2
8,15 Splines racionales
467
Obtenemos la matriz M del spline B cuando /í, = 1 y fí = 0. Y tenemos la matriz M de tensión del spline B (Ecuación 8.59) cuando. H
2
Hl
8.15 SPLINES RACIONALES Una función racional es simplemente el cociente de dos polinomios. Por tanto, un spline racional es el cociente de dos funciones de splines. Por ejemplo, una curva con splines B racionales se puede describir con el vector de posición:
donde Pí define un conjunto de n + I puntos de control. Los parámetros 0) son los factores de ponderación de los puntos de control. Cuanto mayor es valor de un (ú concreto, tanto más es atraída la curva hacia el punto de control p¡ ponderado por aquel parámetro. Cuando lodos los factores de ponderación tienen el valor I, tenemos la curva estándar con splines B. ya que el denominador de la Ecuación 8.69 es entonces simplemente la suma de las funciones de combinación, la cual toma el valor 1 (Ecuación 8.54). Los splines racionales presentan dos ventajas importantes comparados con los splines no racionales. En primer lugar, proporcionan una representación exacta de curvas cuadráticas (cónicas), tales como los círculos y las elipses. Los splines no racionales, que son polinomios, sólo representan de forma aproximada las cónicas. Esto permite a los paquetes gráficos modelar todas las formas de las curvas con una representación, splines racionales, sin necesidad de una biblioteca de funciones de curvas para manejar formas de diseño diferentes. La segunda ventaja de los splines racionales es que son invariantes frente a las transformaciones de visualizaeión (Sección 7.8). Esto significa que podemos aplicar una transformación de visualización a los puntos de control de una curva racional, y obtendremos la vista correcta de la curva. Los splines no racionales, en cambio, no son invariantes frente a una transformación de visualización de la perspectiva. Ilabitualmenie. los paquetes de diseño tic gráficos utilizan representaciones con vectores no uniformes de nudos para construir splines B racionales. Estos splines se denominan NURBS (nonuniform rational W-splines\ splines B racionales no uniformes), o NURBs. Las representaciones con coordenadas homogéneas se utilizan en splines racionales, ya que el denominador se puede tratar como el tactor homogéneo h en una representación de cuatro dimensiones de los puntos de control. Por tanto, un spüne racional se puede considerar como la proyección de un spline no racional de cuatro dimensiones sobre un espacio tridimensional. Por lo general, la construcción de una representación con un spline B racional se realiza utilizando los mismos procedimientos que empicamos para obtener una representación no racional. Dado el conjunto de puntos de control, el grado del polinomio, los factores de ponderación y el vector de nudos, aplicamos las relaciones de redundancia para obtener las funciones de combinación. En algunos sistemas CAD, construimos una sección de una cónica especificando tres puntos de un arco. Una representación de un spline racional en coordenadas homogéneas se determina a continuación calculando las posiciones de los puntos de control que generan el lipo de cónica seleccionado. Como ejemplo de la descripción de secciones de cónicas con splines racionales, podemos utilizar una función de splines B cuadráticos {ti = 3), tres puntos de control y un vector abierto de nudos, k
k
¡0. 0, Ü,
U h l¡
que es el mismo que el del spline cuadrático de Bézier. Después establecemos las funciones de ponderación en los valores:
468
CAPÍTULO 8
Representaciones de objetos tridimensionales
(8.70)
()•
y la representación del spl'me B racional es: p„fí («) + [ r / ( 1 - r ) l p f i ( H ) + p B , ( : lu
P(«) =
l
u
2
2
M
fl,,,(«) + ['-/(l-r)|fi .,(«) + «,,(«/) 1
Posteriormente, obtenemos las distintas cónicas (Figura 8.50) con los siguientes valores del parámetro r. r > 1/2,
fi),
r = 1/2, r < 1/2, r = 0,
> 1 o), = 1
ft),
< I o>, = 0
sección de hipérbola sección de parábola sección de elipse segmento de línea recta
Podemos generar un arco formado por un cuarto de un círculo unidad del primer cuadrante del plano ¿y (Figura 8.51) estableciendo el valor de ¿o, en eos
p, = ( U ) ,
p = (1.0) 2
Hipérbola (r > 1/2, <Ú. >
/
Parábola (r- 1/2, a>, = I)
Línea recta (r - O . í o , = 0 )
Elipse
FIGURA 8.50. Secciones de cónicas generadas utilizando varios valores del factor de ponderación de splines racionales o),.
(r<
Po=<0. 1
FIGURA 8.51. Un arco circular en el primer cuadrante del plano xy.
1
1/2,
to, < l
1
Pj=
Pi = ( U )
( L O ) *
8.16 Conversión entre representaciones de splines
469
Se puede obtener un círculo generando secciones en los otros tres cuadrantes utilizando puntos de control similares. O podríamos producir un círculo completo a partir de la sección del primer cuadrante utilizando transformaciones geométricas en el plano xy. Por ejemplo, podemos reflejar el arco circular de un cuadrante según los ejes x e y para obtener los arcos circulares de los otros tres cuadrantes. Esta es una representación homogénea de un arco circular unidad del primer cuadrante del plano xy.
U (u)~
]
2
\ ~" }
h
fM
2u
(8.72)
0
h(u)
l+«
2
Esta representación homogénea conduce a las ecuaciones paramétricas del círculo en el primer cuadrante. x (u) h(u)
xrr
_\- \+u
h
u
2
=
y№
h(u)
(
8
J
3
)
_2u_
I + H
2
8.16 CONVERSIÓN ENTRE REPRESENTACIONES DE SPLINES A veces es conveniente ser capaz de pasar de una representación de un spline a otra. Por ejemplo, una representación de Bézier es más conveniente para subdividir una curva con splines, mientras que una representación con splines B ofrece una mayor flexibilidad en el diseño. Por lo que podríamos diseñar una curva utilizando secciones de splines B, después realizar una conversión a una representación equivalente de Bézier para visualizar el objeto utilizando un procedimiento de subdivisión recursivo para posicionar los puntos a lo largo de la curva. Supóngase que tenemos una descripción mediante splines de un objeto que se puede expresar con el siguiente producto matricial: P(II) = U • | y y • M ^ ,
(8.74)
donde M es la matriz que caracteriza la representación con splines y M^^, es la matriz columna con las restricciones geométricas (por ejemplo, las coordenadas de los puntos de control). Para transformarla a una segunda representación con la matriz del spline M , debemos determinar la matriz de restricciones geométricas M que produce la misma función vectorial de punto para el objeto. Es decir, iplirKi
spliw2
gcom2
Plu) = V • M
st>llne2
• M
(8.75)
geom2
o
U • M*«*a • Resolviendo en M^
(llll2
U •M^,• M
M
&om2 =
BCOmt
(8.76)
, tenemos: (8.77) =
M
, u : '
M
p , n i
Por tanto, la matriz requerida de transformación que convierte la primera representación con splines a la segunda es: M„,,=M, : .M ,„ , (
wj
ip/
f
(8.78)
470
CAPÍTULO 8
Representaciones ¡ie objetos tridimensionales
Un spline B no uniforme no se puede canicleri/ar con una mairi/ general de splines. Pero podemos reorganizar la secuencia de nudos para convenir el spline B no uniforme en una representación de Bézier. A continuación la matriz de Bézier se puede convertir a cualquier otra forma. El siguiente ejemplo calcula la matriz de transformación para convertir una representación con spline B periódico y cúbico a una representación con spline de Bézier cúbico.
-I
3
-3
I
-I
3
-3
1]
3
-6
3
0
3
-6
3
0
-3
1
o
0
-3
0
3
0
I
o
o
o
1 4
1 0 (8№
1
4
1
0
0
4
2
0
0
2
4
0
0
1
4
1
Y la matriz de transformación para convertir desde una representación de Bézier cúbica a una representación con spline B periódico y cúbico es: i
2
6
-
0
— I
í)
M
0 — .
2
\6
-7
0 0 0
2
T-i
3
-3
3
-6
3
o
-3
3
o
o
1 0
0
i]
0
„
(8.60)
()]
2 - 1 0 -1
2
0
2 - 7 6
8.17 VISUALIZACIÓN DE CURVAS Y SUPERFICIES CON SPLINES Para visualizar una curva o una superficie con splines, debemos determinar las coordenadas de la curva o de la superficie que se proyectan en los píxeles del dispositivo de visualización. Esto significa que debemos evaluar las funciones polinómicas paramétricas del spline en ciertos incrementos sobre el rango de las funciones. Se han desarrollado varios métodos para realizar esta evaluación de forma eficiente.
Regla de Horner El método más simple para evaluar un polinomio, aparte del cálculo directo de cada término de forma sucesiva, es la regla de ¡lamer, que realiza los cálculos mediante una láctorización sucesiva. Esto requiere una multiplicación y una suma en cada paso. Para un polinomio de grado n. hay n pasos.
8.17 Visualización de curvas y superficies con splines
471
A modo de ejemplo, suponga que tenemos una representación con spline cúbico donde la coordenada x se expresa como: 2
x(u) = ajf + hM + c\u + d
(8.81)
x
Las expresiones para las coordenadas y y z son similares. Para un valor concreto del parámeiro % evaluamos este polinomio en el siguiente orden factori/ado. x(n) = [(a u + b )u + cjw + ¿A x
(8.82)
x
El cálculo de cada valor de v requiere tres multiplicaciones y tres sumas, de modo que la determinación de cada posición en coordenadas (v, \\ z) sobre la curva con spline cúbico requiere nueve multiplicaciones y nueve sumas. Se podrían aplicar manipulaciones adicionales de factorización para reducir el número de cálculos requeridos por el método de Horner, especialmente en el caso de polinomios de mayor orden (grado mayor que 3). Pero la determinación repetida de las posiciones en coordenadas sobre el rango de una función de spline, se puede calcular mucho más rápidamente utilizando cálculos de diferencias hacia delante o métodos de subdivisión de splines.
Cálculos de diferencias hacia adelante 1 n método rápido para evaluar funciones polinómicas consiste en generar valores sucesivos de forma recursiva incrementando los valores previamente calculados, por ejemplo, de este modo: % | = x, + Ax
(8.83)
k
Por tanto, una vez que conocemos el incremento y el valor de v, de un paso cualquiera, obtenemos el valor siguiente simplemente añadiendo el incremento a X , El incremento Av¿ en cada paso se denomina diferencia hacia delante. En el caso de la representación paramétrica de la curva, obtenemos las diferencias hacia delante a partir de los intervalos que seleccionamos para el parámetro u. Si dividimos el rango total de variación de u en subintervalos de tamaño lijo A entonces dos valores sucesivos deX son x ~ x(u ) yx ^ - x(u ,,), donde: k
k
" A + I - %+-*|
k
k
}
t
A = 0, 1 , 2 , . . .
(8.84)
y"o=0. Para ilustrar este método, consideraremos en primer lugar la representación polinómica x(u) ~ a u +• b para las coordenadas a lo largo de una curva con spline lineal. Dos valores sucesivos de la coordenada v se representan como: y
t
Xi = a u + b x
k
x
(8,85, í j | = ".('A + o) + % Restando las dos ecuaciones, obtenemos la siguiente diferencia hacia delante: &Xk k-\ " k Sfeí = x
=
x
(8.86)
En este caso, la diferencia hacia adelante es una constante. En el caso de polinomios de orden más elevado, la diferencia hacia adelante es ella misma una función polinómica del parámetro //. Esta diferencia hacia adelante polinómica tiene un grado menos que el polinomio original. En la representación con splines cúbicos de la Ecuación 8.81, dos valores sucesivos de la coordenada .v tienen las representaciones polinómicas:
=a ul+b u; + r w + < t
t
f
4
(8.87) El resultado de la evaluación de la diferencia hacia adelante ahora es:
472
CAPÍTULO 8
Representat iones de objetos tridimensionales
2
Ax = 3a 8u¡ + ( 3 « < 5 ' + 2b 8)u + (a 8 + / > 5 + c 8) s
k
1
K
x
k
(
t
(8.88)
%
que es una función cuadrática del parámetro u . Ya que Ax es una función polinómica de //, podemos utilizar el mismo procedimiento incremcntal para obtener valores sucesivos de Ax . lis decir, k
k
k
j M ^ , = Ax +
(0,89)
k
donde la segunda diferencia hacia adelante es la función lineal: 1
2
&¿x¿ = 6a 8 \ + 6a 8 + 2b 8 x
x
(8.90)
x
Repitiendo este proceso una vez más, podemos escribir, A ^ . ^ A ^ + A^
(8.91)
en la que la tercera diferencia hacia adelante es la expresión constante: A,**
=
6a
8"
x
(8.92)
Las licuaciones 8.83, 8.89, 8.91 y 8.92 proporcionan un cálculo incrementa! de las diferencias hacia delante de los puntos a lo largo de la curva cúbica. Comenzando por u = 0 con un paso constante de tamaño ó\ los valores iniciales de la coordenada x y sus primeras dos diferencias hacia adelante son: 0
x = d 0
t
2
Ax = a 8* + b S + c\S 0
AvC
x
x
(8.93)
2
(t
= 6a 8' + 2b 8 t
x
Una vez que se han calculado estos valores iniciales, el cálculo de cada valor sucesivo de la coordenada x requiere sólo tres sumas. Podemos aplicar los métodos de las diferencias hacia adelante para determinar los puntos a lo largo de curvas con splines de cualquier grado n. Cada punto sucesivo (x, y, z) se evalúa con una serie de 3/; sumas. Para las superficies, los cálculos increméntales se aplican tanto al parámetro u como al parámetro v.
Métodos de subdivisión Los procedimientos recursivos de subdivisión de splines se utilizan para dividir repetidamente una sección de curva por la mitad, incrementando el número de puntos de control en cada paso. Los métodos de subdivisión son útiles para visualizar curvas de aproximación con splines, ya que podemos continuar con el proceso de subdivisión hasta que el grato de control se aproxime a la trayectoria de la curva. Las coordenadas de los puntos de control se pueden entonces dibujar como puntos de la curva. Otra aplicación de la subdivisión es generar más puntos de control para perfilar una curva. Por tanto, podríamos diseñar una forma general de una curva con unos pocos puntos de control, para a continuación aplicar un procedimiento de subdivisión para obtener puntos de control adicionales. Con los puntos de control añadidos, podemos entonces realizar un ajuste fino en secciones pequeñas de la curva. La subdivisión de splines se aplica más fácilmente a una sección de curva de Bézier, porque la curva comienza en el primer punto de control y termina en el último punto de control, el rango de variación del parámetro U es siempre de 0 a 1 y es fácil determinar cuándo los puntos de control están «suficientemente cerca» de la trayectoria de la curva. La subdivisión de Bézier se puede aplicar a otras representaciones con splines mediante la siguiente secuencia de operaciones. (1)
Conversión de la representación actual con splines en una representación de Bézier.
(2)
Aplicación del algoritmo de subdivisión de Bézier.
(3)
Conversión de la representación de Bézier en la representación original con splines.
8.17 Visualización de curvas y superficies can splines
p
Antes de la subdivisión
l 2
Pn
p
P20
473
21
FIGURA 8.52. Subdivisión de una sección de curva de Bézier cúbica en dos segmentos, cada uno con cuatro puntos de control.
Después de la subdivisión
La Figura 8.52 muestra el primer paso de una subdivisión recursiva de una sección de curva de Bézier cúbica. Los puntos a lo largo de la curva de Bézier se describen con la función de punto paramétrica P(//) con 0 < w < 1. En el primer paso de la subdivisión, utilizamos el punto medio P(0.5) para dividir la curva original en dos segmentos. El primer segmento se describe a continuación con la función de punto P,(.v) y el segundo segmento se describe con P ( / ) , donde 2
g = 2w,
para 0 . 0 < w < 0.5
t= 2u - 1,
para0.5 < « < 1.0
(8.94)
Cada uno de los dos segmentos de curva tiene el mismo número de puntos de control que la curva original. También, las condiciones en los límites (posición y pendiente paramétrica) de los extremos de cada uno de los dos segmentos de curva deben coincidir con la posición y la pendiente de la función de la curva original P(w). Esto nos proporciona cuatro condiciones para cada segmento de curva que podemos utilizar para determinar la posición de los puntos de control. Para el primer segmento, los cuatro puntos de control son: P..o = Po Pu = ^ ( P o + P . )
Pu Pi.
i =-(P» + 2 p , + p )
(8.95)
2
=
^(Po + 3
P l
+3p +p ) 2
3
Y para el segundo segmento de curva, obtenemos los cuatro puntos de control: P2.o=¿(Po
+ 3
Pi
+ 3
+
P: P«>
P:« = P j
Se puede establecer un orden eficiente para el cálculo del nuevo conjunto de puntos de control, utilizando sólo operaciones de suma y desplazamiento (división por 2) del siguiente modo: Pi.o = Po
Pu = | ( P o + P ) l
T = j(p,+p ) 2
474
CAPÍTULO 8 Representaciones de objetos tridimensionales
fe =p* P .2 = ^ ( P 2 + P . O 3
mm P2,=^T+P
P2.0 =^
=
2 ; 2
)
IftjP
P-2JI
Los pasos anteriores se pueden repetir cualquier número de veces, dependiendo de si subdividimos la curva para obtener más puntos de control o intentamos localizar puntos aproximados de la curva. Cuando subdividimos para obtener un conjunto de puntos de visualizarán, podemos terminar el procedimiento de subdivisión cuando los segmentos de la curva son suficientemente pequeños. Un modo de determinar esto consiste en comprobar la distancia desde el primero al último punto de control de cada segmento. Si esta distancia es «suficientemente» pequeña, podemos detener la subdivisión. Otra prueba consiste en comprobar las distancias entre pares adyacentes de puntos de control. O podríamos detener la subdivisión cuando el conjunto de puntos de control de cada segmento esté próximo a la trayectoria de una línea recta. Los métodos de subdivisión se pueden aplicar a curvas de Bézier de cualquier grado. En el caso de un polinomio de Bézier de grado n — 1, los 2n puntos de control de cada uno de los dos segmentos iniciales de curva son: =
Pu ^ X < * - . / > P / > r
I Pz<
=
A' = 0 , U , . . . , „
1
V'
^rrX "- ''"--/')P, C(
A
M M donde C{J\,j) y C\tt ~ k, n — j) son los coelicientes binomiales. Los métodos de subdivisión se pueden aplicar directamente a splines B no uniformes añadiendo valores al vector de nudos. Pero, por lo general, estos métodos no son tan eficientes como la subdivisión de splines de Bézier.
8.18 FUNCIONES OpenGL DE APROXIMACIÓN CON SPLINES Tanto los splines de Bézier como los splines B se pueden visualizar utilizando funciones de OpenGL, así como curvas de recorte de superficies con splines. La biblioteca de núcleo conliene funciones de Bézier y la biblioteca GLU (OpenGL Ulility) contiene las funciones para splines B y curvas de recorte. A menudo, las funciones de Bézier se implementan en el bardware, y las funciones de GLU proporcionan una interfaz que accede a las funciones de dibujo de puntos y de dibujo de líneas de OpenGL.
Funciones OpenGL para curvas con splines de Bézier Especificamos los parámetros y activamos las subrutinas para la visualización de curvas de Bézier con las siguientes funciones OpenGL:
8.18
glMapl* glEnable
(GL_MAP1_VERTEX_3, (GL_MAP1_VERTEX
uMin,
uMax,
Funciones OpenGL de aproximación con splines
stride,
nPts,
475
*ctrlPta);
3);
Y desactivamos las subrutinas con: glDisable
{GL_MAP1_VERTEX_3);
Se emplea el sufijo f o d en g l M a p l para indicar que los valores d e los datos se especifican en punto flotante o doble precisión. Los valores mínimo y máximo del parámetro de la curva u se especifican en los parámetros u M i n y u M a x , aunque estos valores se establecen para una curva de Bézier habitualmente en 0 y 1.0, respectivamente. Los valores de las coordenadas cartesianas tridimensionales en punto dotante de los puntos de control de Bézier se enumeran en la matriz c t r l P t s , y el número d e elementos d e esta matriz se proporciona como un entero positivo utilizando el parámetro n P t s . Al parámetro s t r i d e se le asigna un entero d e incremento (offset) que indica el número de datos entre el comienzo de una posición en coordenadas en la matriz c t r l P t s y el comienzo d e la siguiente posición d e coordenadas. Para una lista d e puntos d e control iridimcnsionales, planteamos que s t r i d e = 3 . Un valor mayor en s t r i d e se utilizaría si especificásemos los puntos de control utilizando coordenadas homogéneas de cuatro dimensiones o entrelazásemos los valores de las coordenadas con otros datos, tales como el color. Para expresar las posiciones de los puntos de control en coordenadas homogéneas de cuatro dimensiones (v, y, z, //), sólo necesitamos cambiar el valor de s t r i d e y d e la constante simbólica en g l M a p l y en g l E n a b l e a G L _ M A P i _ V E R T E X _ 4 .
Después de que hayamos establecido los parámetros de Bézier y activado las subrutinas de generación declinas, necesitamos evaluar las posiciones a lo largo de la trayectoria del spline y visualizar la curva resultante. Una posición de coordenadas a lo largo de la trayectoria de la curva se calcula con: glEvalCoordl"
(uValue);
donde al parámetro u V a l u e se le asigna algún valor dentro del intervalo que varía desde u M i n a u M a x . El código de sufijo para esta función puede ser f o d, y podemos también utilizar el código de sufijo v para indicar que el valor del argumento se proporciona en forma de matriz. La función g l E v a l C o o r d l calcula una posición de coordenadas utilizando la Ecuación 8.37 con el valor del parámetro: n,
~" '°
(8.99)
que mapca el valor u V a l u e al intervalo que varía 0 a 1.0. Cuando g l E v a l C o o r d l procesa un valor del parámetro de la curva //. genera una función g l V e r t e x 3 . Para obtener una curva de Bézier. invocamos por tanto repetidamente la función g l E v a l C o o r d l para producir un conjunto de punios a lo largo de la trayectoria de la c u n a , utilizando valores seleccionados del rango de variación desde u M i n a u M a x . Uniendo estos puntos con segmentos de línea recta, podemos aproximar la curva con splines medíante una polilínea. Como un ejemplo de subrutinas para creación de curvas de Bézier con OpenGL, el código siguiente utiliza los cuatro puntos de control del programa de la Sección 8.10 para generar una curva de Bézier cúbica bidimensional. En este ejemplo, se dibujan 50 puntos a lo largo de la trayectoria de la curva, y se conectan los puntos de la curva mediante segmentos de línea recta. La trayectoria de la curva se visualiza a continuación como una polilínea azul, y los puntos de control se dibujan como puntos rojos de tamaño 5 (Figura S.53 en escala de grises).
GLfloat
ctrlPts
[4] [3]
=
{
{-40.0, (10.0,
glMaplf glEnable
(GL_MAP1_VERTEX_3 ,
0.0,
(GL_MAP1_VERTEX_3);
1.0,
40.0,
0.0),
-200.0, 3,
4,
(-10.0,
0.0},
{40.0,
*ctrlPts)
200.0, 40.0,
0.0}, 0.0}
};
476 CAPITULO 8 Represen {aciones de objetos tridimensionales
GLint
k;
glColor3f glBegin
(0.0,
0.0,
1.0);
(GL_LINE_STRIP);
//
Establece
el
//
Genera
"curva"
la
color
de
linea
de
en
azul.
Bézier.
f o r (k = 0 ; k < - 5 0 ; k+ + ) glEvalCoordlf glEnd
(
glColor
(k)
/
50.0);
); (1.0,
glPointSize glBegin
(GLfloat
0.0,
0.0);
(5.0);
(GL_P0INTS);
//
Establece
//
rojo.
//
Establece
//
Dibuja
los
el
color
el
tamaño
puntos
de
de
los
del
puntos
punto
en
en
5.0.
control,
f o r (k = 0 ; k < 4 ; k+ + ) ; glVertex3fv glEnd
(
<&CtrlPts
[k] [0] ) ;
) ;
FIGURA 8.53. Un conjunto de cuatro puntos de control y la curva de Bézier asociada, visualizados con las subrutinas de OpenCiL como una polilínea de aproximación. Aunque el ejemplo anterior generó una curva con spl'mes con valores del parámetro espaciados uniformemente, podemos utilizar la función g l E v a l C o o r d l f para obtener cualquier espaciado del parámetro %
8.18
Punciones OpenGL de aproximación con splines
477
Habitualmente, sin embargo, una curva con splines se genera con valores del parámetro uniformemente espaciados, y OpenGL proporciona las siguientes funciones que podemos utilizar para producir un conjunto de valores del parámetro uniformemente espaciados. glMapGridl*
(n,
glEvalMeshl
Imode,
ul,
u2); ni,
n2) ;
El código de sufijo de g l M a p G r i d l puede ser f o d. El parámetro n especifica el número entero de subdivisiones iguales sobre el rango de variación de ul a u 2 , y los parámetros ni y n2 especifican un rango entero correspondiente a u l y u 2 . Al parámetro m o d e se le asigna G L _ P O I N T o G L L I N E , dependiendo de si queremos visualizar la curva utilizando puntos discretos (una curva de puntos) o utilizando segmentos de línea recta. Para una curva que hay que visualizar c o m o una polilínea, la salida de estas dos funciones es la misma que la salida del siguiente código, excepto que el argumento de g l E v a l C o o r d l se establece en ul o u2 si k = 0 o si k = >/, respectivamente, para evitar errores de redondeo. En otras palabras, con m o d e = GL__LINE, los comandos anteriores de OpenGL son equivalentes a: glBegin
(GL_LINE_STRIP);
Cor (k = n i ; k <= n 2 ; k+ + ) lEvalCoordlf glEnd
(
(ul
+
k
*
(u2
-
ul |
/
n>;
) ;
Por tanto, en el ejemplo de programación anterior, podríamos reemplazar el bloque de código que contiene el bucle de generación de la curva de Bézier por las siguientes líneas. glColor3f
(0.0,
0.0,
glMapGridlf
(50,
glEvalMeshl
(GL_LINE,
0.0,
1.0); 1.0); 0,
50);
Mediante el uso de las funciones g l M a p G r i d l y g l E v a l M e s h l , podemos dividir un curva en un número de segmentos y seleccionar el parámetro de espaciado de cada segmento de acuerdo con su curvatura. Por tanto, a un segmento con más oscilaciones se le podrían asignar más intervalos y a una sección más recta de la curva se le podrían asignar menos intervalos. En lugar de visualizar curvas de Bézier, podemos utilizar la función g l M a p i para especificar valores para otras clases de datos. Hay disponibles otras siete constantes simbólicas de OpenGL para este propósito. Con la constante simbólica G L _ M A P I C O L O R _ 4 , utilizamos la matriz c t r l P t s para especificar una lista de colores de cuatro elementos (rojo, verde, azul, alfa). Después se puede generar un conjunto de colores linealmente interpolados para su uso en una aplicación, y estos valores de color generados no cambian la configuración actual del estado de color. De forma similar, podemos especificar una lista de valores de la tabla de color indexado con Gtj M A P I _ I N D E X . Y una lista de vectores tridimensionales normales a la superficie se especifica en la matriz c t r l P t s cuando utilizamos la constante simbólica G L _ M A P I _ N O R M A L . Las cuatro restantes constantes simbólicas se utilizan con listas de información sobre la textura de la superficie. Se pueden activar simultáneamente múltiples funciones g l M a p i , y las llamadas a g l E v a l C o o r d l o g l M a p G r i d l y g l E v a l M e s h l producen entonces puntos con datos para cada tipo de datos habilitado. Esto nos permite generar combinaciones de posiciones en coordenadas, valores de color, vectores nonnales a la superficie y datos de la textura de la superficie. Pero no podemos activar simultáneamente G L _ M A P I _ V E R TEX_3 y M A P I _ _ V E R T E X _ 4 . Sólo podemos activar uno de los generadores de texturas de la superficie en cualquier momento.
Funciones OpenGL para superficies con
splines
de Bézier
La activación y la especificación de parámetros de las subrutinas de OpenGL para superficies de Bézier se realizan con:
478
CAPÍTULO 8 Representaciones tie objetos tridimensionales
punto flotante o de doble precisión. Para una superficie, especificamos los valores mínimo y máximo lanío del parámetro u como del parámetro v. Las coordenadas cartesianas tridimensionales de los puntos de control de Bézier se enumeran en la matriz de doble índice c t r l P t s , y el tamaño entero de la matriz se proporciona con los parámetros n u P t s y n v p t s . Si hay que specificar los puntos de control con coordenadas homogéneas de cuatro dimensiones, utilizamos la constante simbólica G L _ M A P 2 _ V E R T E X _ 4 en lugar de GL_MAP2_ VERTEX3. El incremento entero entre el comienzo de los valores de las coordenadas del punto de control p,> lo proporciona u s t r i d e . Y el incremento entero entre el comienzo de las coordenadas del punto de control p y las coordenadas del punto de control p , ¿ , , lo proporciona v S t r i d e . Esto permite entrelazar los datos de las coordenadas con otros datos, de modo que sólo necesitamos especificar los incrementos para localizar los valores de las coordenadas. Desactivamos las subrutinas para las superficies de Bézier con: y í
glDisable
{GL_MAP2_VERTEX_3)
Las posiciones de coordenadas sobre la superficie de Bézier se pueden calcular con: glEvalCoord2*
(uValue,
vValúe);
o con glEvalCoord2*v
(uvArray);
Al parámetro uValue se le asigna algún valor dentro del intervalo que varia desde uMin a uMax, y al parámetro w a l u e se le asigna un valor dentro del intervalo que varía desde vMin a vMax. El vector de versión es uvArray = (uValue, v V a l u e ) . El código de sufijo para cualquiera de las dos funciones puede ser f o d. La función g l E v a l C o o r d 2 calcula una posición de coordenadas utilizando la Ecuación 8.51 con los valores de los parámetros: //Value-»Min í/Max - «Min
v -
t'Value-vMin
(8.100)
vMax - viví in
que mapea cada uno de los valores uValue y v V a l u e al intervalo que varía de 0 a 1.0. Para visualizar una superficie de Bézier, invocamos repetidamente g l E v a l c o o r d 2 , que genera una serie de funciones g i v e r t e x 3 . Esto es similar a la generación de una curva con splines excepto en que ahora tenemos dos parámetros. // y v. Por ejemplo, una superficie definida con 16 puntos de control, distribuidos en una cuadrícula de tamaño 4 por 4, se puede visualizar como un conjunto de líneas de superficie con el código siguiente. El incremento para los valores de las coordenadas en la dirección de u es 3, y el incremento en la dirección de v e s 12. Cada posición en coordenadas se especifica con tres valores, siendo la coordenada y de cada grupo de cuatro posiciones constante. y
GLfloat CtrlPCS
14] [ 4 ] [ 3 ]
{ {-1-5, - 1 . 5 , 4.0} {-0.5, - l . S , . - 1 . 0 } , { M - * , - 0 . 5 , 1.P}, { 0.5, -0.5, 0 . 0 } , 4,0}, { ( - 1 - 5 , 0.5, { 0.5, 0.5, 3.0}, 2 .0}, 1.5, { {"I-*, { 0.5 1.5, 0 . 0 ) , r
r
=
{
{-0.5, { 1.5, {-0.5, { 1.5, {-0.5, { 1.5, {-0.5, { 1.5,
-1.5, 2 . 0 } , -1-5, 2.0} -0..5, 3.0}, -0.5, -1.0} O.5., 0 . 0 } , 0.5, 4.0} h 1.5, - 2 . 0 } , 1.5, - 1 . 0 } }
%
8.18 Funciones OpenGL de aproximación con splines 4 7 9
glMap3f
(GL_MAP2_VERTEX_3, 0.0,
1,0,
0.0,
12,
glEnable
(GL_MAP2_VERTEX_3);
GLint
j;
k,
glColor^f for
(k
(0.0,
=
0;
0.0,
k <-
glBegin
1.0,
4,
3,
fcctrlPts
4, [0] [0] [0] ) ;
1.0);
B;
k++)
(GL_LINE_STRIP);
//
Genera
las
líneas
de
la
superficie
Bézier. for
{j
=
0;
j
<-
40;
glEvalCoord2f glEnd
(
/
40.0,
(k)
/
8.0,
GLfloat
(k)
/
8.0);
(GL__LINE_STRIP) ;
(j
•
0;
j
40;
glEvalCoord2f glEnd
(j)
);
glBegin for
j++)
(GLfloat
(
j++)
(GLfloat
GLfloat
(j)
/
40.0);
);
Bn lugar de utilizar la función espaciados sobre la superficie con: glMapGrid2*
(nu,
glEvalMesh2
(mode,
ul ,
podemos generar valores del parámetro uniformemente
glEvalCoord2,
u2,
nul,
nv, nu2,
vi, nvl,
v2) ; nv2í;
El código de sufijo para g l M a p G r i d 2 es de nuevo f o d , y al parámetro mode se le puede asignar el valor o G L _ F I L L . Se produce una cuadricula bidimensional de puntos, con n u intervalos igualmente espaciados entre ul y u 2 , y con nv intervalos igualmente espaciados entre vi y v 2 . El rango entero correspondiente al parámelro u varía desde n u l a n u 2 , y el rango entero correspondiente al parámetro v varia desde n v l a n v 2 . Para una superficie que hay que visualizar como una cuadricula de polilineas, la salida de g l M a p G r i d 2 y g l E v a l M e s h 2 es la misma que la del siguiente fragmento de programa, excepto en las condiciones que evitan los errores de redondeo en los valores inicial y final de las variables del bucle. En el comienzo de los bucles, el argumento de g l E v a l C o o r d l se establece en ( u l , v i ) . Y al final del bucle, el argumento de
GL_P0INT, G L _ L I N E
g l E v a l C o o r d l s e establece e n ( u 2 , v 2 ) .
f o r (k = n u l ; k <« n u 2 ; k+ + ) { glBegin
(GL_LINES);
for
(j
™
nvl;
j
glEvalCoord2f
<- n v 2 ; (ul
+ vi
glEnd
{
k * +
(u2 j
ü
)
for
(j
=
nvl;
glBegin
j
<-
ov2;
{
(GL_LINES);
f o r (k • n u l ; k < - n u 2 ; k* + )
*
{v2
ul) -
/ nu, vi)
/ nv) ;
480
CAPÍTULO 8
Representaciones de objetos tridimensionales
glEvalCoord2f
+
k vi
glEnd
(
*
(u2
+
j
*
-
ul)
(v2
-
/
nu,
vi)
/
nv) ;
);
0 De forma similar, para una superficie visualizada como un conjunto de caras poligonales rellenas (mode la salida de g l M a p G r i d 2 y g l E v a l M e s h 2 es la misma que la del siguiente fragmento de programa, excepto en las condiciones que evitan los errores de redondeo en los valores inicial y final de las variables del bucle. =
GL_FILL),
f o r (k = n u l ; k < n u 2 ; k-f + ) { glBegin for
(GLJ3UADJ3TRIP) ; (j
=
nvl;
j
<=*
glEvalCoord2£
nv2;
(ul
+ k vi
glEvalCoord2f
(ul
+
+
*
tu2
j
*
(k +
+ j
1) *
(v2 * (v2
ulí -
/
nu.
vi)
(u2
-
/
nv);
ul)
- Vi)
/
/
nu
f
nv) ;
Podemos utilizar la función g l M a p 2 para especificar los valores de otras clases de datos, del mismo modo que lucimos con g l M a p i . Para este propósito hay disponibles constantes simbólicas similares, tales como GL_MAP2_COLOR_4 y G L _ M A P 2 _ N O R M A L . Y podemos activar múltiples funciones g l M a p 2 para generar varias combinaciones de datos.
Funciones GLU para curvas con splines B Aunque las subrutinas de GLU para splines B se denominan funciones «nurbs», se pueden utilizar para generar splines B que no son ni no uniformes ni racionales. Por tanto, podemos utilizar estas subrutinas para visualizar un spline B polinómico que tiene un espaciado uniforme de nudos. Y también se puede utilizar las subrutinas de GLU para producir splines de Bézier, racionales y no racionales. Para generar un spline B (o spline de Bézier), necesitamos definir el nombre del spline, activar el sombreador de splines B de GLU, y entonces definir los parámetros del spline. Las líneas siguientes ilustran la secuencia básica de llamadas para visualizar una curva con splines B.
GLUnurbsObj
curveName
*curveName;
=
gluBeginCurve
gluNewNurbsRenderer
gluNurbsCurve
(curveName,
);
nknota,
degParam, gluEndCurwe
(
(curveName); *knotVector,
stride,
«ctrlPts,
GL_MAP1_VERTEX_3 í ;
(curveName);
En la primera línea, asignamos un nombre a la curva, a continuación invocamos las subrutinas de sombreado de GLU para splines B para esta curva utilizando el comando g l u N e w N u r b s R e n d e r e r . Se asigna un
8.18
Fundones OpenGL de aproximación con splines
481
valor O a curveName cuando no hay memoria disponible suficiente para crear una curva con splines B. Dentro de un par g l u B e g i n C u r v e / g l u E n d C u r v e , establecemos a continuación los atributos de la curva utilizando la función gluNurbsCurve. Esto nos permite configurar múltiples secciones de curva, y cada sección se referencia con un nombre de curva distinto. El parámetro k n o t V e c t o r hace referencia al conjunto de valores de los nudos en punto flotante, y el parámetro entero n k n o t s especifica el número de elementos del vector de nudos. El grado del polinomio es degParam — I. Enumeramos los valores de las coordenadas de los puntos de control tridimensionales en el argumento c t r l P t s , que es un vector y contiene nknots - degParam elementos. Y el desplazamiento entero inicial entre el comienzo de las sucesivas posiciones en coordenadas en el vector c t r l P t s se especifica con el parámetro entero s t r i d e . Si las posiciones de los puntos de control son contiguas (no entrelazadas con otros tipos de datos), el valor de s t r i d e se establece en 3. Eliminamos un spline B definido con: gluDeleteNurbsRenderer
(curveName);
A modo de ejemplo de utilización de las subrutinas de GLU para visualización de una curva con splines, el código siguiente genera un polinomio cúbico de Bézier. Para obtener esta curva cúbica, establecemos el parámetro de grado en el valor 4. Utilizamos cuatro puntos de control y seleccionamos una secuencia de nudos de ocho elementos abierta uniforme con cuatro valores repetidos en cada extremo.
GLfloat
knotVector
GLfloat
ctrlPts
[8]
=
{0.0,
[ 4 ] [3]
*
{
0.0,
0.0,
(-4.0,
0.0,
(2.0,
-8.0,
0.0, 0.0),
1.0, {-2.0,
0.0),
{4.0,
1.0, 8.0, 0.0,
1.0,
1.0);
0.0}, 0.0)
);
GLUnurbsObj * c u b i c B e z C u r w e ,-
cubicBezCurve gluBeginCurve
•
gluNewNurbsRenderer
(
) ;
(cubicBezCurve);
gluNurbsCurve
(cubicBezCurve, 4,
8,
knotVector,
3,
¿ctrlPts
[0][0],
GL_MAP1_VERTEX_3);
gluEndCurve(cubicBezCurve);
Para crear una curva con splines B racionales, sustituimos la constante simbólica G L _ M A P I _ V E R T E X _ 3 G L _ M A P I _ V E R T E X _ 4 . A continuación, se utilizan las coordenadas homogéneas de cuatro dimensiones (x y,,i z h) para especificar los puntos de control y la división homogénea resultante produce el polinomio racional deseado. También podemos utilizar la función gluNurbsCurve para especificar las listas de los valores de color, vectores normales, o propiedades de la textura de la superficie, del mismo modo que hicimos con las funciones g l M a p l y g l M a p 2 . C u a l q u i e r a de las c o n s t a n t e s s i m b ó l i c a s , tales c o m o G L M A P 1 C O L O R 4 o GL_MAPl NORMAL, se pueden utilizar como último argumento en la función gluNurbsCurve. Cada llamada se enumera a continuación dentro del par g l u B e g i n C u r v e / g l u E n d C u r v e , con dos restricciones: no podemos enumerar más de una función para cada tipo de dato y debemos incluir exactamente una función para generar la curva con splines B. Un curva con splines B se divide automáticamente en un número de secciones y se visualiza como una polilínea con las subrutinas de GLU. Pero también se puede seleccionar una gran variedad de opciones de sombreado de splines B con llamadas repetidas a la siguiente función. por h
h
gluNurbsProperty
(splineName,
property,
valué);
Al parámetro s p l i n e N a m e se le asigna el nombre del spline B, al parámetro p r o p e r t y se le asigna una constante simbólica de GLU que identifica la propiedad de sombreado que queremos cambiar y al parámetro v a l u é se le asigna un valor numérico en punto flotante o una constante simbólica de GLU que establece el
482
CAPÍTULO 8 Representaciones tic objetos tridimensionales
valor de la propiedad seleccionada. Se pueden especificar varias funciones g l u N u r b s P r o p e r t y después de la linea con g l u N e w N u r b s R e n d e r e r . Muchas de las propiedades que se pueden cambiar usando la función g l u N u r b s P r o p e r t y son parámetros de la superficie, como se describe en la sección siguiente.
Funciones GLU para la creación de superficies con splines B El siguiente fragmento de código ilustra la secuencia básica de llamadas para generar una superficie con spli-
nes tí.
: GLUnurbsObj surfName
* surfÑame
= gluNewNurbsRenderer
(
)
gluNurbsProperty
(surfName,
propertyl,
valuel),•
gluNurbsProperty
(surfName,
property2,
value2) ;
gluNurbsProperty
{surfName,
property3,
value3);
gluBeginSurface
(surfName);
gluNurbsSurface
gluEndSurface
(surfName,
nuKnots,
uKnotvector,
vKnotVector,
uStride,
uDegParam,
vDegParam,
vStride,
nvKnots, fcctrlPts
[0] [0] [0] ,
GL_MAP2_VERTEX_3);
(surfName);
Por lo general, el código y los parámetros de GLU para definir una superficie con splines tí es similar al de una curva con splines tí. Después de invocar las subrutinas de sombreado de splines B con gluNewNurbsRenderer. podríamos especificar valores opcionales de las propiedades de la superficie. Los atributos de la superficie se establecen a continuación con una llamada a gluNurbsSurf a c e . í)e este modo se pueden definir múltiples superficies, cada una con un nombre distinto. El sistema devuelve un valor 0 en la variable surfName cuando no hay suficiente memoria disponible para almacenar un objeto de tipo spline tí. Los parámetros u K n o t V e c t o r y vKnotVector hacen referencia a las matrices con los valores de los nudos en punto llotante en las direcciones de los parámetros // y v. Podemos especificar el número de elementos tic cada vector de nudos con los parámetros n u K n o t s y n v K n o t s . El grado del polinomio en el parámetro // lo proporciona el valor de uDegParam — I, y el grado del polinomio en el parámetro v es el valor de vDegParam — 1. Enumeramos los valores en punto flotante de las coordenadas tridimensionales de los puntos de control del parámetro c t r l P t s , que es un vector y que contiene ( n u K n o t s uDegParam) X (nvKnots - vDegParam) elementos. El desplazamiento entero inicial entre el comienzo de los sucesh 08 puntos de control en la dirección paramétrica // se especifica con el parámetro entero uStride, y el desplazamiento en la dirección paramétrica i se especifica con el parámetro entero v S t r i d e . Borramos una superficie con sp/ines para liberar su memoria reservada con la misma función gluDeleteNurbsRenderer que usamos para una curva con splines tí. De forma predeterminada, una superficie con splines tí se visualiza automáticamente como un conjunto de áreas de relleno poligonales mediante las subrutinas GLU, pero podemos elegir otras opciones y parámetros de visualización. Se pueden establecer nueve propiedades, con dos o más posibles valores en cada propiedad, en una superficie con sp/ines tí. Como ejemplo de definición de propiedades, el siguiente fragmento de código especifica una visualizaeión de una superficie en su modelo alámbrico teselada con triángulos. g1uNurbsProperty
(surfÑame,
GLU_NURBS MODE,
GLU NURBS TES3ELLATOR);
8.18 Funciones OpeuGL de aproximación con splines gluNurbsProperty
(surfÑame,
483
GLU_DISPLAY_MODE,
GLU_OUTLINE_POLYGON);
Las subrutinas de teselaeión de GLU dividen la superficie en un conjunto de triángulos y muestran cada triángulo como el contorno de un polígono. Además, estas primitivas para triángulos se pueden recuperar utilizando la función g l u N u r b s C a l l b a c k . O t r o s v a l o r e s de la p r o p i e d a d G L U _ D I S P L A Y _ M O D E son GLU_OUTLiNE_PATCH y G L U _ F I L L (el valor predeterminado). Mediante el valor G L U \ _ O U T L I N E \ _ P A T C H , también obtenemos una visualización en modelo alámbrico, pero la superficie no se divide en secciones triangulares. En su lugar, se dibuja el contomo de la superficie original, junto con cualquier curva de recorte que se haya especificado. El único valor restante de la propiedad GLU_NURBS_MODE que se puede modificar es GLU_NURBS_RENDERER, que sombrea los objetos sin dejar disponibles los datos teselados para su devolución. Establecemos el número de puntos de muestreo por unidad de longitud con las propiedades G L U U S T E P y G L U _ V _ S T E P . El valor predeterminado para cada una de ellas es 100. Para establecer los valores de muestreo de u o v, también debemos establecer la propiedad G L U _ S A M P L I N G _ M E T H O D con el valor G L U _ D O M A I N _ D I S T A N C E . Se pueden utilizar otros valores con la propiedad GLU_SAMPLiNG_METHOD para especificar cómo se lleva a cabo la teselaeión de la superficie. Las propiedades G L U S A M P L I N G T O L E R A N C E y G L U P A R A M E T R I C T O L E R A N C E se utilizan para establecer las longitudes máximas de muestreo. Modificando la propiedad G L U _ C U L L I N G con el valor G L T R U E , podemos mejorar las prestaciones del sombreado no teselando objetos que se encuentran fuera del volumen de visualización. El valor predeterminado de la selección (culling) de (iLU es G L _ F A L S E . Y la propiedad G L U _ A U T O _ L O A D _ M A T R I X permite que se descarguen del servidor de OpenGL las matrices de visualización y proyección cuando su valor es G L _ T R U E (el valor predeterminado). De lo contrario, si cambiamos el valor a G L _ F A L S E , una aplicación debe proporcionar estas matrices empleando la función g l u L o a d S a m p l i n g M a t r i c e s . Para determinar el valor actual de una propiedad de un spline li, utilizamos la siguiente función de consulta. gluGetNurbsProperty
(splineName,
property,
valué);
Para nombre de spline s p l i n e N a m e y una propiedad p r o p e r t y especificadas el valor correspondiente se oblicué en el parámetro v a l u é . Cuando la propiedad G L U _ A U T O _ L O A D _ M A T R I X se establece en el valor G L F A L S E , invocamos, gluLoadSamplingMatrices
(splineName,
modelviewMat,
projMat,
viewport);
Esta función especifica la matriz de vista del modelo, la matriz de proyección y el visor que hay que utilizar en las subrutinas de muestreo y de selección para un objeto de tipo spline. Las matrices de vista de modelo y de proyección actuales se pueden obtener mediante llamadas a la función g l G e t F l o a t v , y la vista actual se puede obtener con una llamada a g l G e t l n t e g e r v . Varios eventos asociados a los objetos de tipo spline se procesan empleando. gluNurbsCallback
(splineName,
event,
fen);
Al parámetro e v e n t se le asigna una constante simbólica de GLU, y el parámetro ten especifica una función que hay que invocar cuando el evento correspondiente a la constante de (iLU se produce. Por ejemplo, si establecemos el parámetro e v e n t en GLU_NURBS_ERROR, entonces se llama a f e n cuando se produce un error. Las subrutinas p&rd splines de GLU utilizan otros eventos para devolver los polígonos de OpenGL generados por el proceso de teselaeión. La constante simbólica GL_NURBS_BEGIN indica el comienzo de primitivas tales como segmentos de linea, triángulos o cuadriláteros, y GL_NURBS_END indica el final de la primitiva. El argumento de la función de comienzo de una primitiva es una constante simbólica tal como G L _ L I N E _ STRIP, GL_TRIANGLES o GL_QUAD_STRIP. La constante simbólica indica que aquellos dalos con las coordenadas tridimensionales se deben suministrar y se invoca una función de los vértices. Hay disponibles constantes adicionales para indicar otros datos tales como los valores de color. Los valores de los datos de la función g l u N u r c s C a l l b a c k se proporcionan mediante:
484
CAPÍTULO 8 Representaciones de objetos tridimensionales gluNurbsCallbackrjata
(splineName,
dataValuea) ;
Al parámetro s p l i n e N a m e se le asigna el nombre de objeto de tipo spline que hay que teselar, y al parámetro d a t a V a l u e s se le asigna una lista con los valores de los datos.
Funciones GLU para el recorte de superficies Se especifica un conjunto de una o más curvas de recorte bidimensionales de una superficie con sp/ines B mediante el siguiente fragmento de código.
gluBeginTrim
{surfName);
gluPwlCurve
gluEndTrim
(surfName,
nPts,
*curvePta,
stride,
GLÜ_MAP1_TRIM_2);
(surgName);
F.l parámetro surfName es el nombre de la superficie con splines B que hay que recortar. En el parámetro c u r v e P t s , que es un vector ya que contiene n P t s posiciones de coordenadas, se especifica un conjunto de coordenadas en punto flotante para la curva de recorte. En el parámetro s t r i d e se especifica un desplazamiento inicial entero entre las sucesivas posiciones de coordenadas. Las coordenadas especificadas de la curva se utilizan para generar una función de recorte lineal por tramos para la superficie con splines B. En otras palabras, la «curva» de recorte generada es una polilínea. Si los puntos de la curva se deben proporcionar en el espacio tridimensional y homogéno del parámetro (w, v, /7), entonces el argumento final de g l u P w l C u r v e se establece en la constante simbólica de GLU G L U _ M A P I _ T R I M _ 3 . También podemos utilizar una o más funciones g l u N u r b s C u r v e como en el caso del recorte de curvas. Y podemos construir curvas de recorte que sean combinaciones de funciones g l u P w l C u r v e y g l u N u r b s C u r v e . Cualquier «curva» de recorte de GLU que se especifique no se debe intersectar y debe ser una curva cerrada. El siguiente código ilustra las funciones de recorte de GLU para una superficie cúbica de Bézier. En primer lugar establecemos las coordenadas de los puntos de la curva de recorte más exterior. Estas posiciones
FIGURA 8.54. Una curva exterior de recorte alrededor del perímetro del cuadrado unidad se especifica en dirección contraria al movimiento de las agujas del reloj, y las secciones de la curva interior de recorte se definen en el sentido del movimiento de las agujas del reloj.
0,2 -r
02
H h
0.4
H 0.6
r
(í.í
I
0
8.19 Representaciones de barrido
485
se especifican en sentido contrario al movimiento de las agujas del reloj alrededor del cuadrado unidad. A continuación, establecemos las coordenadas de los puntos de la curva de recorte más interna en dos secciones, y estas posiciones se especifican en el sentido de las agujas del reloj. Y los vectores de nudos tanto para la superficie como para la primera sección de la curva de recorte interior se configuran para producir curvas cúbicas de Bé/ier. En la Figura 8.54 se muestra un dibujo de las curvas de recorte interior y exterior sobre el cuadrado unidad.
GLUnurbaObj
*bezSurface;
OLfloat
outerTrimPts
[5] [2]
OLfloat
innerTrimPtsl
GLfloat
innerTrimPts2
m
{
{0.0,
O.of,
[3] [2]
-
{
{0.25,
[4] [ 2 ]
-
{
{0.75,
(0.0,
{l.O, 1.0},
0.5},
{0.75,
GLfloat
surfKnots
GLfloat
trimCurveKnota
bezSurfac©
=
[8]
=
(0.0, [8]
=
0.5)
{1.0, 0.0)
1.0),
};
0.75},
};
{0.75,
0.25),
0.25},
(0.25,
0.5)
};
0.0,
O.O,
0.0,
1.0,
1.0,
1.0,
1.0);
{0.0,
0.0,
0.0,
0.0,
l.O,
1.0,
1.0,
gluNewNurbsRenderer
gluBeginSurface
{0.0,
{0.5,
0.5},
{0.25,
0.0},
(
1.0);
);
íbezSurface);
gluNurbsSurface
ÍbezSurface,
8,
&CtrlPtB gluBeginTrim
surfKnots,
[0] [0] [0] ,
8,
4,
surfKnots,
4,
4 * 3 ,
3,
GL_MAP2J/ERTEX_3) ;
(bezSurfaceí;
/*
Curva
de
/*
a
agujas
las
gluPwlCurve
recorte del
exterior
en
sentido
contrario
*/
reloj.*/
ÍbezSurface,
5,
&outerTrimPts
[0] [ 0 ] ,
2,
GLU__MAP1_TRIM_2) ; gluEndTrim
ÍbezSurface);
gluBeginTrim
ÍbezSurface);
/*
Secciones
/*
en el
gluPwlCurve
de
la
curva
sentido de
las
ÍbezSurface,
de
recorte
agujas 3,
del
interior*/ reloj.*/
&innerTrimPtsl
10] [01 ,
2,
GLUJ4AP1_TRIM_3); gluNurbsCurve
ÍbezSurface,
8,
trimCurweKnots,
&innerTrimPts2 gluEndTrim gluEndSurface
[0] [0] ,
4,
2,
GLU_MAP1_TRIM_2) :
ÍbezSurface); ÍbezSurface);
8.19 REPRESENTACIONES DE BARRIDO Los paquetes de modelado de sólidos proporcionan a menudo un gran número de técnicas de construcción, [.as representaciones de b a r r i d o son útiles para construir objetos tridimensionales que poseen simetrías de traslación, de rotación o de otra clase. Podemos representar tales objetos especificando una forma bidimensional y un recorrido por el que se mueve la forma a través de una región del espacio. Se puede disponer de
486
CAPÍTULO 8
Represeutationes de objetos tridimensionales
Uje de rotación
Viul Poi-
4 P «
Pí«.
vi
(a)
i
Pin) 4P.
P(M.
v) tu)
F I G U R A 8 . 5 5 . Construcción de un sólido con un barrido de traslación. La traslación de los puntos de control de una curva con
F I G U R A 8 . 5 6 . ( onslrucción de un sólido con un barrido de rotación. La
sp/int's periódicos de (a) genera el sólido
rotación de los puntos de control de una curva con
mostrado en (b), cuya
superficie
se puede
describir con la función de punto P(w, v).
spJines
periódicos (a)
alrededor del eje de rotación dado genera el sólido mostrado en (b), cuya superficie se puede describir con la función de punto P i n , v).
un conjunto de primitivas bidimensionales, tales como círculos o rectángulos, para representaciones de barrido como opciones de menú. Entre otros métodos para obtener figuras bidimensionales se pueden incluir las construcciones con curvas con splines y las secciones rectas de objetos sólidos. La Figura 8.55 ilustra un barrido de traslación. La curva con splines periódicos de la Figura 8.55(a) define la sección recta del objeto. Después realizamos un barrido de traslación para una distancia específica moviendo los puntos de control p a p, a lo largo de una trayectoria de una línea recta perpendicular al plano de la sección recta. A intervalos a lo largo de esta trayectoria, repetimos la forma de la sección recta y dibujamos un conjunto de líneas de conexión en la dirección del recorrido para obtener la representación alámbrica mostrada en la Figura 8.55(b). 0
En la Figura 8.56 se propociona un ejemplo de un diseño de un objeto utilizando un barrido de rotación. Esta vez, la sección recta con spline periódico se rota alrededor de un eje específico en el plano de la sección recia, para producir la representación alámbrica mostrada en la Figura 8.56(b). Se puede elegir cualquier eje para el barrido de rotación. Si utilizamos un eje de rotación perpendicular al plano de la sección recta con splines de la Figura 8.56(a), generamos una forma bidimensional. Pero si la sección recta mostrada en esta figura tiene profundidad, entonces utilizamos un objeto tridimensional para generar otro. Por lo general, podemos especificar construcciones de barrido utilizando cualquier trayectoria. En barridos de rotación, podemos realizar el movimiento a lo largo de una trayectoria circular de cualquier distancia angular desde 0 a 360°. En trayectorias no circulares, podemos especificar la función de curva que describe la trayectoria y la distancia recorrida a lo largo de la trayectoria. Además, podemos variar la forma o el tamaño de la sección recta a lo largo de la trayectoria de barrido. O podríamos variar la orientación de la sección recta, con respecto a la trayectoria de barrido a medida que movemos la forma a través de una región del espacio.
8.20 MÉTODOS DE GEOMETRÍA CONSTRUCTIVA DE SÓLIDOS Otra técnica de modelado de sólidos consiste en generar un nuevo objeto a partir de dos objetos tridimensionales utilizando una operación de conjuntos. Este método de modelado, llamado geometría constructiva de sólidos (Construetive Solid (ieomctry; C S C ) , crea el nuevo objeto aplicando las operaciones de unión, intersección o diferencia de dos sólidos seleccionados.
Métodos de geometría constructiva de sólidos
487
Oí
(a)
FIGURA 8.57. La combinación de los dos objetos mostrados en (a) utilizando un operación de unión produce el nuevo objeto sólido compuesto de (b).
íh)
Ic)
FIGURA 8.58. Dos objetos que se superponen (a) se pueden combinar para producir el objeto con forma de cuña de (h>. utilizando la operación de intersección, o el bloque modificado mostrado en (c), utilizando la operación diferencia.
FIGURA 8.59. Un ejemplo de representación de árbol CSG de un objeto. Las Figuras 8.57 y 8.58 muestran ejemplos de formación de formas nuevas utilizando las operaciones de los conjuntos. En la Figura 8.57(a), un bloque y una pirámide se colocan adyacentes una a otra. Mediante la operación de unión, obtenemos el objeto combinado de la Figura 8.57(b). La Figura 8.58(a) muestra un bloque y un cilindro que se superponen en volumen. Utilizando la operación de intersección, obtenemos el sólido de la Figura 8.58(b). Mediante la operación diferencia, podemos visualizar el sólido mostrado en la Figura 8.58(c). Una aplicación de CSG comienza con un conjunto inicial de objetos tridimensionales, llamados primitivas CSG, tales como un bloque, una pirámide, un cilindro, un cono, una esfera y tal vez algunos sólidos con superficies con splines. Las primitivas se pueden proporcionar en el paquete CSG como un menú de selección, o las primitivas se podrían formar utilizando métodos de barrido, construcciones con splines, u otros procedimientos de modelado. En un paquete interactivo de CSG, podemos seleccionar una operación (unión, intersección o diferencia) y arrastrar dos primitivas a una posición dentro de alguna región del espacio para formar un nuevo objeto. Este nuevo objeto se podría entonces combinar con una de las formas existentes para formar otro objeto nuevo. Podemos continuar este proceso hasta que tengamos la forma final del objeto que estamos diseñando. Un objeto construido con este procedimiento se representa con un árbol binario, como en la Figura 8.59.
488
CAPÍTULO 8
Representaciones de objetos tridimensionales Plano de
FIGURA 8.60. Imple-mentación de operaciones CSG utilizando trazado de rayos.
t,.v Rayo de pixel
Plano de disparo
Operación
Límites ile la aúpemele
Unión Intersección Diferencia
A, D C, B B. D
(a*
FIGURA 8.61. Determinación de los límites de la superficie a lo largo de un rayo de pixel. Los métodos de trazado de rayos (ray casting) se utilizan habitualmente para implementar operaciones de geometría constructiva de sólidos cuando los objetos se describen mediante representaciones por contorno. Aplicamos el trazado de rayos determinando los objetos que son intersectados por un conjunto de líneas paralelas que emanan del plano xy según la dirección del eje z. Este plano se denomina plano de disparo (/¡ring plañe) y cada rayo tiene su origen en un píxel, como se muestra en la Figura 8.60. Entonces calculamos las intersecciones con la superficie a lo largo de la trayectoria de cada rayo, y ordenamos los puntos de intersección según la distancia al plano de disparo. Los límites de la superficie del objeto compuesto se determinan a continuación mediante la operación de conjunto especificada. En la Figura 8.61 se proporciona un ejemplo de determinación mediante trazado de rayos de los límites de la superficie de un objeto CSCi, que muestra las secciones rectas yz de dos objetos (un bloque y una esfera) y la trayectoria de un rayo perpendicular de píxel al plano de disparo. Kn la operación de unión, el volumen nuevo es el interior combinado ocupado por los dos objetos. En la operación de intersección, el volumen nuevo es la región interior común a ambos objetos. Y una operación de diferencia sustrae el interior de un objeto del otro donde los dos objetos se superponen. Cada primitiva de CSG se define habitualmente en su propias coordenadas locales (de modelado). La posición correspondiente en coodenadas universales se determina mediante las matrices de transformación de modelado utilizadas para crear una posición de solapamiento con otro objeto. La inversa de las matrices de modelado del objeto se pueden utilizar entonces para transformar los rayos de píxel a coordenadas de modelado, donde los cálculos de las intersecciones con la superficie se realizan en las primitivas individuales. Entonces las intersecciones con la superficie de los dos objetos superpuestos se ordenan según la distancia a lo largo de la trayectoria del rayo y se usan para determinar los límites del objeto compuesto, según la operación de conjuntos especificada. Este procedimiento se repite para cada par de objetos que hay que combinar en el árbol CSG de un objeto concreto. Una vez que se ha diseñado un objeto CSCi, el trazado de rayos se utiliza para determinar propiedades físicas, tales como el volumen y la masa. Para determinar el volumen del objeto, aproximamos el área de cada píxel del plano de disparo mediante un pequeño cuadrado (Figura 8.62). Podemos entonces aproximar el volumen Wi de una sección transversal del objeto de área A en la dirección de la trayectoria de un rayo de píxel de la posición (i,j) de este modo: H
(8.101)
8.21 Arboles ot tules 489
Plano de
FIGURA 8.62. Determinación del volumen de un objeto en la dirección de la trayectoria de un rayo de un área de píxel A del plano de disparo. tl
donde AZy es la profundidad del objeto en la dirección del rayo desde la posición (/,/). Si el objeto tiene agujeros internos, Az,, es la suma de las distancias entre pares de puntos de intersección en la dirección del rayo. Aproximamos el volumen total del objeto CSG mediante la suma de los volúmenes individuales según las trayectorias de los rayos:
Dada la función de densidad, p (v, v, z), del objeto, podemos aproximar la masa en la dirección del rayo desde la posición (/, /) con esta integral:
donde la integral simple se puede aproximar a menudo sin realizar la integral, dependiendo de la forma de la función de densidad. La masa total del objeto CSG se aproxima entonces mediante la suma: w = £m
í (
(H.I04)
y Otras propiedades físicas, tales como el centro de masas y el momento de inercia, se pueden obtener con cálculos similares. Podemos mejorar la precisión de los cálculos de los valores de las propiedades físicas mediante rayos adicionales generados desde posiciones de subpíxeles en el plano de disparo. Si las formas de los objetos se representan mediante árboles octales, podemos implementar el conjunto de operaciones de los procedimientos CSG rastreando la estructura del árbol que describe los contenidos de los ociantes del espacio. Este procedimiento, descrito en la sección siguiente, busca en los octantes y los suboclanles de un cubo unidad para localizar las regiones ocupadas por los dos objetos que hay que combinar.
8.21 ÁRBOLES OCTALES Las estructuras jerárquicas con árboles, llamadas árboles octales, se utilizan para representar objetos sólidos en algunos sistemas gráficos. La generación de imágenes médicas y otras aplicaciones que requieran la visualización de secciones rectas de objetos utilizan a menudo representaciones con árboles octales. La estructura de un árbol está organizada de modo que cada nodo se corresponde con una región del espacio tridimensional. Esta representación de sólidos se aprovecha de la coherencia espacial para reducir los requerimientos de almacenamiento de los objetos tridimensionales. También proporciona una representación adecuada para almacenar información acerca del interior de los objetos. La representación mediante árboles octales de un objeto tridimensional es una ampliación de una técnica de representación bidimensional similar, llamada codificación con árboles cuaternarios. Los árboles cuaternarios se generan mediante divisiones sucesivas de una región bidimensional (habitualmente un cuadrado) en cuadrantes. Cada nodo del árbol cuádrico tiene cuatro elementos de datos, uno por cada uno de los cuadrantes de la región (Figura 8.63). Si todos los puntos contenidos en un cuadrante tienen el mismo color (un cuadrante homogéneo), el elemento correspondiente de datos del nodo almacena dicho color. Además, se modifica un indicador (flag) en el elemento de datos para indicar que el cuadrante es homogéneo. Si, por ejemplo.
490
CAPÍTULO 8 Representaciones de objetos Iriiiimensionales
Cuadrante 0
Cuádrame 1
ü
Cuádrame 3
1
2
3
Elementos de datos en el modo representativo del árbol cuaternario
Cuádrame 2
Región de un espacio bidimensional
FIGURA 8.63. Una región cuadrada del plano xy dividida en cuadrantes numerados y el nodo asociado del árbol cuaternario con cuatro elementos de datos.
ü
1 ()
í
1
l
3
0
1
3
Representación del árbol cuaternario Región de un espacio bidiiiiensioitul
FIGURA 8.64. Una región cuadrada del plano xy con divisiones en cuadrantes de dos niveles y la representación asociada mediante árbol cuaternario. todos los puntos del cuadrante 2 de la Figura 8.63 son de color rojo, el código de color para el rojo se coloca entonces en el elemento de datos número 2 del nodo. De lo contrario el cuadrante es heterogéneo, y se divide en subcuadrantes, como se muestra en la Figura 8.64. En el elemento de datos correspondiente del nodo del cuadrante 2 ahora se modifica un indicador para marcar el cuadrante como heterogéneo y se almacena un puntero al nodo siguiente del árbol cuaternario. Un algoritmo de generación de un árbol cuaternario comprueba los valores de color asignados a los objetos dentro de una región bidimensional seleccionada y configura los nodos del árbol cuaternario consecuentemente. Si cada cuadrante de espacio original tiene un único color, el árbol cuaternario tiene un único nodo. En el caso de una región heterogénea del plano, las sucesivas subdivisiones en cuadrantes continúan hasta que todas las partes de la región subdividida son homogéneas. La Figura 8.65 muestra la representación mediante un árbol cuaternario de una región que contiene un área con un color liso que es diferente del color uniforme del resto de áreas dentro de dicha región. Las codificaciones mediante árboles cuaternarios propocionan ahorros considerables de almacenamiento cuando existen amplias zonas de un único color en una región del espacio, ya que un único nodo puede representar una gran parte del espacio. Y esta técnica de representación se puede utilizar para almacenar los valores del color de los píxeles. Para un área que contiene 2n por 2n píxeles, una representación mediante un árbol cuaternario contiene como máximo n niveles. Y cada nodo del árbol cuaternario tiene como máximo cuatro descendientes inmediatos.
8.21 Árboles octales
0
ü
2
1
i
i
1
^0
r
491
0
1
2
1
2
¡1
3
i
m
t)
I I [2|}|4
i
6
4
FIGURA 8.65. Una representación mediante árbol cuaternario de una región cuadrada del plano xy que condene una única área de color de primer plano sobre un fondo de color liso.
Elementos de datos en el nodo representativo del árbol octal
Región de un espacio tridimensional FIGURA 8.66. Un cubo dividido en octantcs numerados y el nodo asociado del árbol octal de ocho elementos de datos. Una técnica de codificación mediante un árbol octal divide una región del espacio tridimensional (habitualmente un cubo) en octantes y almacena ocho elementos de datos por nodo del árbol, como se muestra en la Figura 8.66. Las subregiones individuales del espacio tridimensional subdividicto se denominan elementos de volumen, o vóxeles, por analogía con los píxeles de un área de visualización rectangular. Un elemento de vóxel de una representación mediante un árbol octal almacena los valores de la propiedad de una subregión homogénea del espacio. Entre las propiedades de los objetos dentro de una región tridimensional del espacio se puede incluir el color, el tipo de material, la densidad y otras características físicas. Por ejemplo, entre los objetos de una región seleccionada del espacio podrían estar incluidas piedras y árboles o pañuelos de papel, huesos y órganos humanos. Las regiones vacías del espacio se representan mediante el tipo de vóxel «vacio» (void). Como en el caso de la representación mediante un árbol cuaternario, un ociante heterogéneo de una región se subdivide hasta que las subdivisiones son homogéneas. En un árbol octal, cada nodo puede tener desde cero a ocho descendientes inmediatos. Los algoritmos de generación de árboles octales se pueden estructurar para aceptar definiciones de objetos de cualquier forma, tales como una malla poligonal, parches de superficie curvada, o construcciones de geometría sólida. En el caso de un único objeto, el árbol octal se puede construir a partir de la caja que lo contiene (paralelipédica) determinada mediante las extensiones de coordenadas del objeto. Una vez que se ha establecido una representación mediante un árbol octal de un objeto sólido, se pueden aplicar al objeto varias subrutinas de manipulación. Se puede aplicar un algoritmo para realizar operaciones de conjuntos a dos representaciones mediante árboles octales de la misma región del espacio. En una operación de unión, se construye un nuevo árbol octal utilizando los nodos del árbol octal de cada uno de los árbo-
492
CAPÍTULO 8 Representaciones de objetos tridimensionales
les de partida. Para establecer una representación de intersección de dos árboles octales, construimos el nuevo árbol utilizando los ociantes donde los dos objetos se superponen. De forma similar, en una operación de diferencia, buscamos las regiones ocupadas por un objeto y no por el otro. Se ha desarrollado un gran número de otros algoritmos de procesamiento de árboles octales. Las rotaciones tridimensionales, por ejemplo, se realizan aplicando las transformaciones a las regiones espaciales representadas por los ociantes ocupados. Para localizar los objetos visibles de una escena, podemos determinar en primer lugar si cualquiera de los ociantes frontales están ocupados. Si no, proseguimos con los ociantes situados detrás de los ociantes frontales. Este proceso continúa hasta que los ociantes ocupados son localizados en la dirección del punto de vista. El primer objeto detectado en la dirección de cualquier trayectoria de punto de vista a través de los ociantes espaciales, desde la parte frontal hasta la parte trasera, es visible, y la información de dicho objeto se puede transferir a una representación mediante un árbol cuaternario para su visualización.
8.22 ÁRBOLES BSP Esta estrategia de representación es similar a la codificación mediante árboles octales, excepto que ahora dividimos el espacio en dos particiones en lugar de ocho en cada etapa. Mediante un árbol de particionamiento binario del espacio (binary space-particioning; BSP), subdividimos una escena en dos partes en cada etapa mediante un plano que puede estar en cualquier posición y con cualquier orientación. En una codificación mediante un árbol octal, la escena se subdivide en cada paso mediante tres planos perpendiculares entre sí, alineados con los planos de coordenadas cartesianas. En la sudivisión adaptativa del espacio, los árboles BSP pueden proporcionar un particionamiento más eficiente, ya que podemos posicionar y orientar los planos de corte para acomodarnos a la distribución espacial de los objetos. Esto puede reducir la profundidad de la representación de la escena mediante un árbol, en comparación con un árbol octal y, por tanto, reducir el tiempo de búsqueda en el árbol. Además, los árboles BSP son útiles para identificar la superficie visible y para el particionamiento del espacio en algoritmos de trazado de rayos.
8.23 MÉTODOS DE GEOMETRÍA FRACTAL Todas las representaciones de objetos que hemos considerado en las secciones anteriores usaban métodos de geometría euclídea; es decir, las formas de los objetos se han descrito mediante ecuaciones. Estos métodos son adecuados para describir objetos fabricados: aquellos que tienen superficies suaves y formas regulares. Pero los objetos naturales, tales como las montañas y las nubes, tienen características irregulares o fragmentadas, y los métodos euclídeos no proporcionan representaciones realistas de tales objetos. Los objetos naturales se pueden describir de forma realista mediante métodos de geometría fractal, en donde se utilizan procedimientos en lugar de ecuaciones para modelar los objetos. Como es lógico pensar, los objetos definidos mediante procedimientos tienen características bastante diferentes de los objetos descritos con ecuaciones. Las representaciones de geometría fractal de objetos se aplican habitualmente en muchos campos para describir y explicar las características de fenómenos naturales. En gráficos por computadora, utilizamos los métodos fractales para generar visualizaciones de objetos naturales y de sistemas matemáticos y físicos, Un objeto fractal posee dos características básicas: detalle infinito en cada punto, y una cierta autosimili' tud entre las partes del objeto y las características totales del objeto. Las propiedades de autosimilitud de un objeto pueden presentar formas diferentes, dependiendo de la representación que elijamos del fractal. Describimos un objeto fractal mediante un procedimiento que especifica una operación repetida para producir el detalle en las subpartes del objeto. Los objetos naturales se representan con procedimientos que se repiten teóricamente un número infinito de veces. Las visualizaciones gráficas de objetos naturales se generan, por supuesto, mediante un número finito de pasos.
8.23 Métodos de geometria fractal
493
Primer plano
FIGURA 8.67. Apariencia escarpada del contorno de una montaña con diferentes niveles de ampliación. Si ampliamos una forma continua euclídea, no importa cómo sea de complicada, podemos finalmente obtener la vista ampliada para verla con contornos más suaves. Pero si ampliamos un objeto fractal, continuamos viendo cada vez más detalles en las ampliaciones sin obtener finalmente una apariencia del objeto con contornos suaves. El contorno de una montaña frente al cielo continúa teniendo el mismo aspecto escarpado a medida que la vemos desde una posición cada vez más cercana (Figura 8.67). A medida que nos acercamos a la montaña, el detalle más pequeño de los salientes y de las rocas se hace visible. Acercándonos aún más, vemos los contornos de las rocas, después las piedras y a continuación los granos de arena. En cada paso, el contomo revela más curvas y vueltas. Si tomamos los granos de arena y los analizamos con un microscopio, veríamos de nuevo el mismo detalle repetido a nivel molecular. Formas similares describen las costas y los bordes de plantas y nubes. Para obtener una vista ampliada de un fractal, podemos seleccionar una parte del fractal para su visualización dentro de un área de visualización del mismo tamaño. Entonces llevamos a cabo las operaciones de construcción del fractal en aquella parte del objeto y visualizamos el mayor detalle de aquel nivel de ampliación. A medida que repetimos este proceso, continuamos visualizando cada vez más detalles del objeto. Como consecuencia del detalle infinito inherente a los procedimientos de construcción, un objeto fractal no tiene un tamaño definido. Cuando añadimos más detalle a la descripción de un objeto, las dimensiones crecen sin limite, pero las amplitudes de las coordenadas del objeto pennanecen confinadas dentro de una región finita del espacio. Podemos caracterizar la cantidad de variación del detalle de un objeto mediante un número ilamado¿//W£'wsion fractal. A diferencia de la dimensión euclídea, este número no es necesariamente un entero. La dimensión fractal de un objeto se denomina a veces dimensión fraccionad que es la base del nombre «fractal». Los métodos fractales han resultado ser útiles para modelar una gran variedad de fenómenos naturales. En aplicaciones gráficas, las representaciones fractales se utilizan para modelar el terreno, las nubes, el agua, los árboles y otra llora, las plumas, el pelo y variadas texturas superficiales, y a veces sólo para elaborar patrones atractivos. En otras disciplinas, los patrones fractales se han encontrado en la distribución de estrellas, islas de ríos y cráteres de la Luna; en la lluvia; en las variaciones de la bolsa; en música; en el tráfico; en la utilización de la propiedad urbana; y en los límites de las regiones de convergencia en técnicas de análisis numérico.
Procedimientos para generación de fractales Un objeto fractal se genera por aplicación repetida de una función de transformación específica a puntos dentro de una región del espacio. Si P„ = (.v v o) selecciona como posición inicial, cada iteración de una función de transformación F genera niveles sucesivos de detalle mediante los cálculos: z
(h
p, = m$>
sc
(h
= FIA§•
h =
• • •
É
ws)
Por lo general, la función de transformación se puede aplicar a un conjunto de puntos especifico o a un conjunto inicial de primitivas, tales como líneas rectas, curvas, áreas de color o superficies. También, pode-
494
CAPÍTULO 8
Representaciones de objetos tridimensionales
mos utilizar procedimientos deterministas o aleatorios. La función de transformación se podría definir utilizando transformaciones geométricas (cambio de escala, traslación, rotación), o mediante transformaciones no lineales de coordenadas y parámetros de decisión estadísticos. Aunque los objetos fractales, por definición, contienen detalles infinitos» aplicamos la función de transformación un número finito de veces, y, por supuesto, los objetos que visualizamos tienen dimensiones finitas. Una representación procedimental aproxima un fractal «real» a medida que el número de transformaciones se incrementa para producir cada vez más detalle. La cantidad de detalle incluido en la visualización gráfica final de un objeto depende del número de iteraciones realizadas y la resolución del sistema de visualización. No podemos visualizar variaciones de detalle que sean menores que el tamaño de un píxel. Pero podemos ampliar de forma repetida porciones seleccionadas de un objeto para ver más de sus detalles.
Clasificación de fractales Los fractales autosimilares poseen partes que son versiones reducidas en tamaño del objeto entero. Comenzando por una forma inicial, construimos las subpartes del objeto aplicando un parámetro de escala s a toda la forma. Podemos utilizar el mismo factor de escala S para todas las subpartes, o podemos utilizar factores de escala diferentes en partes del objeto diferentes de escala reducida. Si también aplicamos variaciones aleatorias a las supartes de escala reducida, se dice que el fractal es estadísticamente autosimilar. Las partes entonces tienen las mismas propiedades estadísticas. Los fractales estadísticamentes similares se utilizan habitualmente para modelar árboles, arbustos y otras plantas. Los fractales autoafines poseen partes que se forman mediante parámetros de escala diferentes, ,v,, s y según direcciones de coordenadas diferentes. Y podemos también incluir variaciones aleatorias para obtener fractales autoafines estadísticamente. El terreno, el agua y las nubes se modelan habitualmente mediante métodos de construcción de fractales autoafines estadísticamente. Los conjuntos invariantes de fractales se forman mediante transformaciones no lineales. En esta clase de fractales se incluyen los fractales autocuadrúticos, tales como el conjunto de Mandelbrot (formado con funciones cuadráticas en el espacio complejo), y los fractales autoinversos, construidos mediante procedimientos de inversión. vt
Dimensión fractal La cantidad de variación de la estructura de un objeto fractal se puede describir mediante un número D llamado dimensión fractal, que es una medida de la aspereza, o de la fragmentación, del objeto. Los objetos con mayor aspecto dentado presentan mayores dimensiones fractales. Un método para generar un objeto fractal consiste en establecer un procedimiento iterativo que utiliza un valor seleccionado de D. Otra técnica es determinar la dimensión fractal a partir de las propiedades deseadas de un objeto, aunque, por lo general, puede ser difícil calcular la dimensión fractal. Los métodos para calcular D se basan en conceptos desarrollados en ramas de las matemáticas, particularmente de topología. t
Mediante analogía con la subdivisión de un objeto euclídeo se obtiene una expresión de la dimensión fractal de un fractal autosímilar construido con un único factor de escala .y. La Figura 8.68 muestra las relaciones entre el factor de escala y el número de subpartes n de división de un segmento unidad de línea recta, un cuadrado unidad y un cubo unidad. Para s == 7, el segmento de línea unidad (Figura 8.68(a)) se divide en dos subpartes de igual longitud. Con el mismo factor de escala, el cuadrado de la Figura 8.68(b) se divide en cuatro subpartes de igual área, y el cubo (Figura 8.68(c)) se divide en ocho subpartes de igual volumen. En cada uno de estos objetos, la relación entre el número de subpartes y el factor de escala es n • s = I. En analogía con los objetos euclídeos, la dimensión fractal D de objetos aulosimilares se puede obtener a partir de; nE
D
ns = 1 Resolviendo esta expresión en £>, la dimensión de similitud fractal, tenemos:
(8.106)
8.23
L
ué
~
Métodos de geometría
fractal
495
n
= i
A' =
b - 2,
« =
E
—
4
ÉL.
n
•
D, = 3.
•
v
=
=
w *"
8
3
n.v = 1 (c) FIGURA 8.68. Subdivisión de una línea unidad (a), un cuadrado unidad (b), y un cubo unidad (c). La dimensión ecuclídea se representa como D¿, y el factor de escala de cada objeto es s = ~.
l n f l
D=
(8J07)
\n(\/s)
En un fractal autosimilar construido con diferentes factores de escala en las diferentes subpartes del objeto, la dimensión de similitud fractal se obtiene a partir de la relación implícita: Y.VS1
(8.108)
donde SÍ es el factor de escala de la subparte fe. En la Figura 8.68, consideramos la subdivisión de formas simples (línea recta, rectángulo y caja). Si tenemos formas más complejas, incluidas las líneas curvas y los objetos con superficies no planas, la determinación de la estructura y las propiedades de las subpartes es más difícil. Para formas de objetos generales, podemos utilizar métodos de cobertura topológica que aproximan las subpartes del objeto mediante formas simples. Una curva gubdividida, por ejemplo, se podría aproximar mediante secciones de línea recta, y una superficie con splines subdividida se podría aproximar mediante pequeños cuadrados o rectángulos. Otras formas de cobertura, tales como círculos, esferas y cilindros, también se pueden utilizar para aproximar las características de un objeto dividido en partes más pequeñas. Los métodos de cobertura se utilizan habilualmente en matemáticas para determinar propiedades geométricas tales como la longitud, el área, o el volumen de un
496
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.69. (aja do cobertura de un objeto de forma irregular. objeto complejo mediante la suma de las propiedades de un conjunto de objetos de cobertura más pequeños. También podemos utilizar los métodos de cobertura para determinar la dimensión fractal D de algunos objetos. Los conceptos de cobertura topológica se utilizaron originariamente para ampliar el significado de las propiedades geométricas a formas no estándar. Una ampliación de los métodos de cobertura que utiliza circuios o esferas condujo a la idea de dimensión de llausdorff-Besicovilch, o dimensión fracciona!. La dimensión de Hausdorlf-Besicovitch se puede utilizar como la dimensión fractal de algunos objetos, pero por lo general, es más difícil su evaluación. De forma más habitual, la dimensión fractal de un objeto se estima mediante métodos de i-oher/ura con cujas que utilizan retángulos o paralelepípedos. La Figura 8.6 ) ilustra la idea de caja de cobertura. Aquí, el área dentro de los límites irregulares se puede aproximar mediante la suma de las áreas de los pequeños rectángulos de cobertura. 1
Los métodos de cobertura mediante cajas se aplican determinando en primer lugar las amplitudes de las coordenadas de un objeto, después subdividiendo el objeto en un número de pequeñas cajas utilizando los factores de escala proporcionados. El número de cajas n que es necesario para cubrir un objeto se denomina dimensión de caja, y n está relacionada con la dimensión fractal D. F.n objetos aulosimilares estadísticamente con un único factor de escala A, podemos cubrir el objeto con cuadrados o cubos. A continuación contamos el número /; de cajas de cobertura y utilizamos la Ecuación 8.107 para estimar la dimensión fractal. Para objetos autoafines, cubrimos el objeto con cajas rectangulares, ya que las direcciones diferentes se cambian de escala de forma diferente. Fn este caso, estimamos la dimensión Iractal utilizando tanto el número de cajas n como los parámetros de transformación afín. La dimensión fractal de un objeto es siempre mayor que la dimensión euclídea correspondiente (o dimensión topológica), que es simplemente el menor número de parámetros necesarios para especificar el objeto. Una curva euclídea tiene una sola dimensión ya que podemos determinar sus puntos con LUÍ parámetro, u. Una superficie euclídea es bidimensional, con parámetros de superficie u y v. Y un sólido euclídeo, que requiere ucs parámetros en cada especificación de coordenadas, es tridimensional. En una curva fractal que se encuentra completamente dentro de un plano bidimensional, la dimensión fractal D es mayor que 1 (la dimensión euclídea de una curva). Cuanto más cercano es D a 1, más suave es la Curva fractal. Si D - 2, tenemos una curva de Peana ; es decir, la «curva» rellena completamente una región finita del espacio bidimensional. Para 2 < D < 3, la curva se intersecta a sí misma y el úrea se podría cubrir con un número infinito de veces. Las curvas fractales se pueden utilizar para modelar los límites de objetos naturales, tales como las costas. Las curvas fracutles espaciales (aquellas que no se encuentran completamente dentro de un único plano) también tienen dimensión fractal D mayor que I. pero I) puede ser mayor que 2 sin intersección consigo misma. Una curva que rellena un volumen del espacio tiene dimensión I) = 3, y una curva en el espacio que se intersecta a sí misma tiene una dimensión fractal D > 3. Las superficies fractales tienen habitualmentc una dimensión dentro del rango 2 < D < 3. Si D = 3, la «superficie» rellena un volumen del espacio. Y si D> 3, hay una cobertura de superposición del volumen, hl terreno, las nubes y el agua se modelan habitualmenle con superficies fractales. La dimensión de un fractal sólido se encuentra habitualmentc en el rango 3 < D < 4. De nuevo, si D > 4, tenemos un objeto que se autosuperpone. Los sólidos fractales se pueden utilizar, por ejemplo, para modelar las propiedades de las nubes como densidad de vapor de agua o la temperatura dentro de una región del espacio.
8.23 Métodos de geometria fractal
497
Construcción geométrica de fractales deterministas autosimilares Para construir geométricamente un fractai determinista (no aleatorio) autosimilar, comenzamos por una forma geométrica dada, llamada iniciador. Las subpartes del iniciador se reemplazan a continuación por un patrón, llamado generador. A modo de ejemplo, si utilizamos el iniciador y el generador mostrados en la Figura 8.70, podemos construir el patrón de copo de nieve, o curva de Koch, mostrada en la Figura 8.71. Cada segmento de línea recta del iniciador se reemplaza por el patrón del generador, que consta de cuatro segmentos de línea de igual longitud. Después se cambia de escala el generador y se aplica a los segmentos de línea del iniciador modificado, y este proceso se repite un número de pasos. El factor de escala en cada paso es T. por lo que la dimensión fractai es D = In 4/ln 3 ~ 1.2619. También, la longitud de cada segmento de línea del iniciador se incrementa en un factor ~ en cada paso, de modo que la longitud de la curva fractai tiende a infinito a medida que se añade más detalle a la curva (Figura 8.72). La Figura 8.73 ilustra los patrones adicionales de generador que se podrían utilizar para constmir curvas fractales autosimilares. Los generadores de la Figura 8.73(b) y (e) contienen más detalle que el generador de la curva de Koch y tienen mayores dimensiones fractales.
FIGURA 8.70. Iniciador y generador de la curva de Koch.
FIGURA 8.71. Tres primeras iteraciones de la generación de la curva de Koch.
498
CAPÍTULO 8
Representaciones de objetos tridimensionales
1 ongitud del segmento = 1
Longitud del segmento = -J-
Longitud del segmento = -L
3
Longitud = I FIGURA 8 7 2 .
9
Longitud = ~
Longitud = y
La longitud de cada lado de la curva de Koch se incrementa en un Tactor de | en cada paso, mientras que
las longitudes de los segmentos de linea se reducen en un factor de j-.
FIGURA 8.73. Generadores de curvas
Longitud del segmento = 1 / V 7
fractales autosimilares y sus dimensio-
D * 1.129 (a)
nes fractales asociadas.
FIGURA 8.74. Generadores de fractales con partes múltiples y disjuntas.
FIGURA 8.75.
Longitud del segmento = 1/3 I)
(l.fvíl
Longitud del segmento • 1/4
Longitud del segmento • 1/6
D = 1,500
D - 1.613
№
m
I I I I I 1 I longitud del segmento = 1/8 1.333
D
N
I
I
I
Longitud del segmento = 1/8 D
.333
La aplicación de este generador a las aristas de un triángulo equilátero produce
una cuna de Peano de relleno con copos de nieve (también llamada espacio de Peano).
También podemos utilizar generadores con múltiples componentes disjuntos. En la Figura 8.74 se muestran algunos ejemplos de generadores compuestos. Podríamos combinar estos patrones con variaciones aleatorias para modelar varios objetos naturales que presentan múltiples partes desconectadas, tales como distribuciones de islas a lo largo de la costa. El generador de la Figura 8.75 contiene segmentos de línea de longitud variable y se utilizan múltiples factores de escala para la construcción de la curva fraclal. Por tanto, la dimensión ("racial de la curva generada se determina a partir de la Ecuación 8.108. Las visuali/aciones de árboles y otras plantas se pueden construir mediante métodos de construcción geométrica autosimilar. Cada rama del contorno del helécho mostrada en la Figura 8.76(a) es una versión cambiada de escala de la forma del helécho total. En la parte (b) de esta figura, el helécho se sombrea totalmente con un giro aplicado a cada rama. Como ejemplo de la construcción de un fractal autosimilar de las superficies de un objeto tridimensional, cambiamos de escala el tetraedro regular mostrado en la Figura 8.77 con un factor 1/2, después colocamos el
8.23 Métodos de geometría fractal
499
FIGURA 8.77. Cambio de escala del tetraedro (a) en un tactor de 1/2 y posicíonando la versión con el cambio de escala aplicado en una cara del tetraedro original produce la superficie fractal mostrada en (b). objeto que hemos cambiado de escala en cada una de las cuatro superficies originales del tetraedro. Cada cara del tetraedro original se convierte en seis caras más pequeñas y el área de la cara original se incrementa en un factor 3/2. La dimensión fractal de esta superficie es: D = — = 2.584% In2 que indica que es una superficie bastante fragmentada. Otro modo de crear objetos fractales autosimilares consiste en perforar agujeros en un iniciador dado, en lugar de añadir más área. La Figura 8.78 muestra algunos ejemplos de objetos fractales creados de este modo.
Construcción geométrica de fractales estadísticamente autosimilares Para introducir variabilidad en la construcción geométrica de un fractal autosimilar, podríamos seleccionar de forma aleatoria un generador en cada paso a partir de un menú de patrones. O podríamos construir un fractal autosimilar calculando pequeños desplazamientos de las coordenadas mediante pequeñas variaciones aléalo-
500
CAPÍTULO 8
Representaciones de objetos tridimensionales
FIGURA 8.78. Pradales autosimilares iridimensionalcs formados con generadores que sustraen subpartes de un iniciador. (Cortesia de John Ç, Hart. Department of Computer Science, Universidad de Illinois en Urbana-Champai^n.)
FIGURA 8.79. Un patrón modificado de «copo de nieve» que utiliza un desplazamiento aleatorio del pumo medio. rias. Por ejemplo, en la Figura 8.79 utilizamos una función de distribución de probabilidad para calcular desplazamientos variables del punto medio en cada paso de la creación de un patrón aleatorio de copo de nieve. En la Figura 8.80 se muestra otro ejemplo de este método. En esta visualización se hace un cambio de escala aleatorio de parámetros y ramificación aleatoria de direcciones para modelar los patrones de la venas de una hoja. Una vez que se ha creado un objeto fractal, podemos modelar una escena utilizando varias instancias transformadas del objeto. La Figura 8.81 muestra la instanciación de un árbol fractal con rotaciones aleatorias. En la Figura 8.82, se muestra un bosque fractal empleando varias transformaciones aleatorias. Para modelar las formas nudosas y retorcidas de algunos árboles, podemos aplicar funciones de giro así como de cambio de escala para crear las ramas aleatorias y autosimilares. Esta técnica se ilustra en la Figura 8.83. Comenzando por el cilindro con tapas de la parle izquierda de esta figura, podemos aplicar transformaciones para producir (secuencialmente de izquierda a derecha) una espiral, una hélice y un patrón con giro aleatorio. En la Figura 8.84, se muestra un árbol modelado mediante giros aleatorios. La corteza de árbol de esta visualización se modela utilizando mapas de abultamiento {httmp mapping) y variaciones (raciales brownianas de los patrones de abultamiento. Los métodos de generación de curvas (raciales brownianas se estudian en la siguiente sección, y los métodos de mapas de abultamiento se exploran en la Sección 10.17,
FIGURA 8.80. Construcción aleatoria y autosimilar de ramificación de venas de una hoja en otoño. {Cortesía de f'cter Oppenheimer. Computer Graphics Lab, New York Instílate of Technologyí)
8.23 Métodos de geometría fraetal 501
FIGURA 8.81. Modelado de una escena que emplea instanciaciún múltiple de objetos. Las hojas fractales se añaden a un árbol en posiciones transformadas de forma aleatoria, y varias instancias rotadas y con cambio de escala del árbol se utilizan para formar una arboleda. Ll césped se modela mediante instancias múltiples de conos verdes. (Cortesía Je John C Han, Department <>f ('ompuíer Science,
Universidad de Illinois en Vrbaná'Chatnpaigñ.)
FIGURA 8.82. Un bosque fractal creado con instancias múltiples de hojas, agujas de pino, césped y corle/a de árbol. (Cortesía de John ('. íiart, Dcpartnivnt of Computer Seience, Universidad de llliimis en Urbcma-Champaign.)
Métodos de construcción de fractales afines Podemos obtener representaciones altamente realistas del terreno y de otros objetos naturales utilizando metodos con fractales afines que modelan las características de los objetos como el movimiento brownianojnacional. Este es una ampliación del mo\ imienlo browniano estándar, una forma de «paseo aleatorio», que describe el movimiento en zigzag y errático de partículas de gas u otro Huido. La Figura 8.X5 ilustra la trayectoria de un paseo aleatorio en el plano xy. Comenzando por una posición dada, generamos un segmento de linea recta según una dirección aleatoria y con una longitud aleatoria. Otra línea aleatoria se construye a continuación desde el extremo de esta primera linea, y el proceso se repite un número concreto de segmentos de línea.
502
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.83. Modelado de ramas de árboles mediante giros en espiral, helicoidales y aleatorios. (Cortesía de Peter Oppenheimer, Computer Graphics Lab, New York Institute of Technology.)
FIGURA 8.85. Un ejemplo de movimiento browniano (paseo aleatorio) en el plano xy.
FIGURA 8,84. Ramas de árbol modeladas con serpenteos aleatorios. (Cortesía de Peter Oppenheimer, Computer Graphics Lab. New York Institute of Technology.)
FIGURA 8.86. Un planeta con movimiento browniano observado desde la superficie de un planeta con movimiento browniano, con cráteres añadidos, en primer plano. (Cortesía de R. V. Vass and B. B. Mandelbrot, adaptado a partir de The Fractal Geometry of Nature de Benoit B. Mandelbrot (W. H. Freeman and Co., Nueva York, 1983).)
El movimiento browniano fraccional se obtiene al añadir un parámetro adicional a la distribución estadística que describe el movimiento browniano. Este parámetro adicional modifica la dimensión fractal de la trayectoria del «movimiento». Una única trayectoria browniana fraccional se puede utilizar para modelar una curva fractal. Y con una matriz bidimensional de alturas brownianas fracciónales aleatorias sobre una cuadrícula de un plano de tierra, podemos modelar la superficie de una montaña uniendo las alturas para formar un conjunto de parches de polígonos. Si las alturas aleatorias se generan sobre la superficie de una esfera, podemos modelar las monta-
8.23 Métodos de geometría fractal
503
ñus, los valles, y los océanos de un planeta. En la Figura 8.86 el movimiento browniano se utili/ó para crear las variaciones de altura sobre la superficie del planeta. Las alturas se codificaron en color de manera que las alturas más bajas se pintaron en a/u! (los océanos) y las alturas más elevadas en blacon (nieve sobre las montañas). El movimiento browniano fracciona! se utilizó para crear las características del terreno en primer plano. Los cráteres se crearon con diámetros aleatorios y en posiciones aleatorias, utilizando procedimientos con fraclales afines que describen fielmente la distribución de los cráteres observados, de las islas de los ríos, de los patrones de lluvia y de otros sistemas similares de objetos. Al ajustar la dimensión fractal en los cálculos del movimiento browniano fraccional, podemos variar el escarpado de las características del terreno. Los valores de la dimensión fractal próximos a D = 2.15 producen características realistas en las montañas, mientras que valores próximos a 3.0 se pueden utilizar para crear paisajes extraterrestres de apariencia inusual. También podemos cambiar de escala las alturas calculadas para hacer más profundos los valles e incrementar la altura de los picos de las montañas. En la Figura 8.87 se muestran algunos ejemplos de características del terreno que se pueden modelar mediante procedimientos fractales. En la Figura 8.88 se muestra una escena modelada con nubes fractales sobre una montaña fractal.
FIGURA 8.87.
Variaciones de las características del terreno modeladas mediante movimiento browniano fraccional.
{Cortesía Je (a) R. K Voss and R. 8. Mandelbrot, adaptado a partir de The Fractal Geometry of Nature de Benoit fi Mandelbrot (W. IL Freeman and Co., New York, 1983); y (b) y (c) Ken Mus grave y Benoit B. Mandelbrot, Mathematics and Computer Science. Universidad de Yale)
504 CAPÍTULO 8 Represen ¡uñones de objetos tridimensionales
a
b
x
a
u^h
b
x
FIGURA 8.89. Desplazamiento aleatorio del punto medio de un segmento de línea recia.
Métodos de desplazamiento aleatorio del punto medio Los cálculos del movimiento browniano fraccionaI requieren tiempo, ya que las coordenadas de la elevación del terreno sobre un plano de tierra se calculan mediante series de Fourier, que son sumas de términos con senos y cosenos. Los métodos que utilizan la transformada rápida de Fourier (Fast Fourier Transform; FFT) se utilizan habitualmente, pero son aún un proceso lento para generar escenas con montañas (Vacíales. Por tanto, métodos de desplazamiento aleatorio del punto medio más rápidos, similares a los métodos de desplazamiento utilizados en las construcciones geométricas, se han desarrollado para aproximar las representaciones con movimiento hrownianno aleatorio del terreno y otros fenómenos naturales. Lstos métodos se utilizaron originariamente para generar cuadros de animación en películas de ciencia ficción que involucraban características inusuales de terrenos y planetas. Los métodos de desplazamiento del punto medio ahora se utilizan habitualmente en muchas otras aplicaciones de gráficos por computadora, entre las que se incluyen las animaciones para anuncios de televisión. Aunque los métodos de desplazamiento aleatorio del punto medio son más rápidos que los cálculos del movimiento browniano fraccional, producen características de terrenos de apariencia menos realista. La Figura 8.89 ilustra el método del desplazamiento del punto medio para generar una trayectoria de un paseo aleatorio en el plano xy. Comenzando por un segmento de línea recta, calculamos un valor de la ordenada v desplazado de la posición del punto medio de la línea como el valor medio de los valores de la ordenada y del extremo más un desplazamiento aleatorio:
{
>\^= -\yUt) + y(h)\ + r
(8109)
Para aproximar el movimiento browniano fraccional, seleccionamos un valor para /• de la distribución gaussiana de media 0 y una varian/a proporcional a \(b - a)\ \ donde // = 2 - D y D > I es la dimensión fractal. Otro método para obtener un desplazamiento aletorio consiste en tomar r = srjb - A | , donde el para?t
8.23 Métodos de geometría fractal
505
metro A es un factor seleccionado de «rugosidad») de la superficie y r , es un valor aleatorio gaussiano de media ü y varianza 1. Se pueden utilizar tablas de búsqueda para obtener los valores gaussianos. LI proceso después se repite calculando un valor desplazado de la ordenada y para la posición media de cada mitad de la linea subdividida. Y continuamos la subdivisión para obtener un cierto número de segmentos o hasta que las longitudes de las secciones de la línea subdividida son menores que una longitud seleccionada. F.n cada paso, el valor de la variable aleatoria r disminuye, ya que es proporcional al ancho \b — o\ de la sección de la línea que hay que subdividir. La Figura 8.90 muestra una curva fractal obtenida con este método. Las características del terreno se generan mediante la aplicación de los procedimientos de desplazamiento aleatorio del punto medio a un plano rectangular de tierra (Figura 8.91 ). Comenzamos asignando un valor de altura z a cada una de las cuatro esquinas (a, b, c. d de la Figura 8.91 ) del plano de tierra. A continuación, dividimos el plano de tierra por el punto medio de cada arista para obtener los nuevos cinco puntos de la cuadrícula: e, f, g, h y ni. Las alturas en los puntos medios e, f, g y h de las aristas del plano de tierra se pueden calcular como la media de la altura de los dos vértices más cercanos más un desplazamiento aleatorio. Por ejemplo, la altura z . en el punto e se calcula utilizando los vértices a y b, mientras que la altura en el punto medio f se calcula utilizando los vértices b y c: y
t
| = ( z + z )!2 b
d
+ /v,
z, n ( z + z,)/2 + ig h
Los valores aleatorios t\. y r, se pueden obtener a partir de una distribución gaussiana de media 0 y varianza proporcional a la separación de la cuadrícula elevada a la potencia 2/7, donde // = 3 - Dy D>2. Valores más elevados de D, dimensión fractal de la superficie, producen un terreno con más dientes de sierra, mientras que valores más bajos generan un terreno más suave. También podríamos calcular los desplazamientos alealorios como el producto de un factor de rugosidad por la separación de la cuadrícula por un valor de la tabla de búsqueda de un valor gaussiano de media 0 y varianza 1. La altura z„, de la posición media del plano de tierra m se puede calcular utilizando los puntos e y g, o los puntos f y h. De forma alternativa, podríamos calcular z utilizando las alturas asignadas a las cuatro esquinas del plano de tierra y un desplazamiento aleatorio del siguiente modo: m
z - k + m + s& + * )/4 m
+ r
m
FIGURA 8.90. Una trayectoria de un pascti aleatorio generada a partir de un segmento de linea recta con cuatro iteraciones del procedimiento de desplazamiento aleatorio del punto medio.
Plano de tierra
FIGURA 8.91. Un plano rectangular de tierra (ai se subdivide en una cuadrícula de cuatro secciones iguales (b) en el primer paso de un procedimiento de desplazamiento aleatorio del punto medio para calcular las alturas del terreno.
506
CAPÍTULO 8
Representaciones de objetos tridimensionales
FIGURA 8.92. < >cho parches de superficie formados sobre un plano de tierra en el primer paso de un procedimiento de desplazamiento aleatorio del punto medio para la generación de características del terreno. Este proceso se repite para cada una de las nuevas cuatro parles de la cuadrícula en cada paso, hasta que la separación de la cuadrícula llega a ser más pequeña que un valor seleccionado. Los parches triangulares de superficie para la superficie del terreno se pueden formar a medida que las alturas se generan. La Figura 8.92 muestra ocho parches de superficie que se podrían construir en el primer paso de la subdivisión. En cada nivel de recursión, los triángulos se dividen sucesivamente en parches planos más pequeños. Cuando el proceso de subdivisión se ha completado, los parches se sombrean ullizando las posiciones seleccionadas de las fuentes de luz, los valores de otros parámetros de iluminación, y los colores y texturas seleccionados de la superficie del terreno. El método del desplazamiento aleatorio del punto medió se puede aplicar para generar otros componentes de una escena ademas del terreno. Por ejemplo, podríamos utilizar los mismos métodos para obtener características superficiales de ondas en el agua o patrones de nubes sobre un plano de tierra.
Control de la topografía del terreno Un modo de controlar la colocación de los picos y de los valles en una escena con terreno fraclal que se modela con un método de desplazamiento de punto medio, consiste en restringir las alturas calculadas a ciertos intervalos sobre varias secciones del plano de tierra. Podemos realizar esto designando un conjunto de superficies de control sobre el plano de tierra, como se ilustra en la Figura 8.93. Después calculamos una altura aleatoria en cada punto medio de la cuadrícula del plano de tierra que depende de la diferencia entre la altura de control y la altura media calculada para dicho punto. Este procedimiento obliga a las alturas a pertenecer a un intervalo preseleccionado en torno a las alturas de la superficie de control. Las superficies de control se pueden utilizar para modelar características existentes del terreno en las Montañas Rocosas, o en alguna otra región, construyendo las facetas del plano utilizando las alturas de un plano topográfico de una región concreta. O podriamos establecer las alturas de los vértices de los polígonos de control para diseñar nuestras propias características del terreno. También, las superficies de control pueden tener cualquier forma. Los planos son los más fáciles de utilizar, pero podríamos utilizar superficies esféricas u otras formas curv as. Utilizamos el método de desplazamiento aleatorio del punto medio para calcular las alturas de la cuadrícula, pero ahora seleccionamos valores aleatorios a partir de una distribución gaussiana en la que la media // y la desviación estándar o"son funciones de las alturas de control. Un método para obtener los valores p y a consiste en hacer ambos proporcionales a la diferencia entre la altura media calculada y la altura de control predefinida en cada punto de la rejilla. Por ejemplo, para el punto de la rejilla e de la Figura 8.91, establecemos la media y la desviación estándar del siguiente modo:
donde ZL\. es la altura de control del punto e del plano de tierra y 0 < s < I es el factor de escala. Los valores pequeños de .v, tales como .v < 0.1, producen una concordancia más ajustada a la envolvente del terreno, y valores más grandes de s permiten mayores lluctuaeiones de la altura del terreno. Para determinar los valores de las alturas de control sobre una superficie de control del plano, en primer lugar, determinamos los valores de los parálmetros del plano A /i, Cy D. En cualquier punto del plano de tierra (\\y), la altura en el plano que contiene aquel polígono de control se calcula entoces del siguiente modo: %
8.23 Melados de geometria fractal 5 0 7
FIGURA 8.93. Superficies de control sobre un plano de tierra.
x
FIGURA 8.94. Proyección de una superficie triangular de control sobre una cuadrícula del plano de tierra.
zc = (-Ax -By -DVC Se pueden utilizar métodos increméntales para calcular las alturas de control sobre los puntos de la cuadrícula del plano de control. Para llevar a cabo estos cálculos eficientemente, subdividimos el plano de tierra con una cuadrícula más pequeña de puntos xy y proyectamos cada polígono de la superficie de control sobre el plano de tierra, como se muestra en la figura 8.94. A partir de esta proyección, determinamos los puntos de la cuadrícula que se encuentran por debajo de cada polígono de control. listo se puede realizar utilizando procedimientos similares a los empleados en el relleno de áreas mediante líneas de barrido. Es decir, para cada «línea de barrido» y de la malla del plano de tierra que cruza las aristas del polígono, calculamos las intersecciones de la línea de barrido y determinamos qué puntos de la cuadricula están denla» de la proyección del polígono de control. Los cálculos de las alturas de control en estos puntos de la cuadrícula se realizan de forma incremental de este modo: =
m» m ~ M ¿ / 0 ,
= zc - AxiB/Ch tJ
(cU!0)
donde Ax y Av son los incrementos de la cuadrícula en las direcciones de los ejes .v e y. Este procedimiento es particularmente rápido cuando se aplican métodos de vectores paralelos para procesar los puntos de la cuadrícula del plano de control. La figura 8.°5 muestra una escena construida utilizando planos de control para estructurar las superficies del terreno, del agua y las nubes sobre un plano de tierra. A continuación, se aplican algoritmos de sombreado de superficies para suavizar las aristas de los polígonos y proporcionar los colores apropiados a la superficie.
Fractales autocuadráticos Otro método para generar objetos fractales consiste en aplicar repetidamente una función de transformación a los puntos del plano complejo. En dos dimensiones, un número complejo se puede representar como r = x + iy„ donde x e y son números reales e r = — I. En el espacio tridimensional y de cuatro dimensiones, los
508
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.95. Una escena compuesta modelada medíante un método de desplazamiento aleatorio del punto medio y superficies planas de control sobre un plano de tierra. Las características de la superficie del terreno, del agua y las nubes se modelaron y sombrearon de forma separada, después se combinaron para formar la imagen compuesta. {Cortesía de Eng-Kiat Koh, Encenfuate, Inc.. Cupertino, California.) puntos se representan mediante cuaternios. Una función cuadrática c o m p l e j a / ( z ) es aquella que implica el cálculo de z . Podemos utilizar algunas funciones autocuadráticas para generar formas fractales. Dependiendo del punto inicial seleccionado para iterar, la aplicación repetida de una función autocuadrátiea producirá uno de los tres resultados posibles; 1
•
EJ punto transformado puede diverger hacia infinito.
•
El punto transformado puede converger hacia un punto limite finito, llamado punto de atracción (atrac-
•
El punto transformado permanece en el limite de alguna región. 2
Como ejemplo, la operación cuadrática no fractal /(z) = z en el plano complejo transforma los puntos según su relación con el círculo unidad (Figura 8.97). Cualquier punto z cuyo módulo \z\ sea mayor que I se transforma mediante una secuencia de puntos que tienden hacia infinito. Un punto con | r |<1 se transforma hacia el origen de coordenadas. Los puntos que están originariamente en el círculo, | z \= I, permanecen en el mismo. Aunque la transformación r no produce un fractal, algunas operaciones cuadráticas complejas generan una curva fractal que es la zona límite entre aquellos puntos que se mueven hacia el infinito y aquellos que tienden hacia un límite finito. Un límite cerrado fractal generado mediante una operación cuadrática se denomina conjunto de Julia.
FIGURA 8.96. Posibles resultados de la aplicación repetida de una transformación aulocuadrática f(z) al plano complejo, dependiendo de la posición del punto inicial seleccionado.
8.23 Métodos de geometría fractal
z>
509
I
X
FIGURA 8.97. Un círculo unidad en el plano complejo. La función compleja cuadrática no fractal./(?) = r mueve los puntos que se encuentran en el interior del círculo hacia el origen, mientras que los puntos situados fuera del círculo se mueven más lejos del círculo. Cualquier punto inicial del círculo permanece en el círculo.
FIGURA 8.98. Localización de la curva frontera fractal utilizando la función autocuadrática inversa z = /*~'(z'). Por lo general, podemos localizar el límite fractal de una función cuadrática comprobando el comportamiento de los puntos seleccionados. Si un punto se transforma de modo que diverge hacia infinito o converge hacia un punto de atracción, podemos probar con otro punto próximo. Repelimos este proceso hasta que finalmente localizamos un punto del límite fractal. A continuación, la iteración de la transformación cuadrática genera la forma del fractal. En transformaciones simples del plano complejo, un método más rápido para localizar los puntos de la curva fractal consiste en utilizar la inversa de la í'unción de transformación. Entonces un punto inicial seleccionado dentro o fuera de la curva convergerá a un punto de la curva fractal (Figura 8.98). Una función rica en fractales es la transformación cuadrática: i =f(z) = Áz() -z)
(8111)
donde A es una constante compleja. En esta función, podemos utilizar el método de la inversa para localizar la curva fractal. En primer lugar reorganizamos los términos para obtener la ecuación cuadrática: ^ - z + z'/A-O
(8JJ2)
La transformación inversa es entonces la fórmula cuadrática:
z
=
i
r (z')
= M\±^-(4z')i¿.)
(8,113)
2k
Utilizando operaciones aritméticas complejas, resolvemos esta ecuación en las partes real e imaginaria de z del siguiente modo:
i
i±
discr +Re(discr) (8.114)
2 v
2
donde el discriminante de la fórmula cuadrática es discr = 1 - Az'lX. Se puede calcular e ignorar unos pocos valores iniciales de x e y (por ejemplo, 10) antes de que empezemos a dibujar la curva fractal. También, ya
510
CAPÍTULO 8
Representaciones de objetos tridimensionales
que esta función produce dos posibles puntos transformados (,v,_v), podemos elegir de forma aleatoria el signo más o menos en cada paso de la iteración siempre y cuando Im(discr) 0 > 0. Cada vez que Im(discr) < 0, los dos posibles puntos están en el segundo y tercer cuadrante. En este caso, x cy deben tener signos opuestos. El programa siguiente proporciona una implementación de esta función autocuadrática. En la Figura 8.99 se dibujan dos curvas de ejemplo.
f —-
C.
\
¡fe, -\
VI
(a)
V
5 •v
fe FIGURA 8.99. Dos curvas fractales generadas con la inversa de la función/(z) — Xz(\ - z) mediante el procedimiento s e l f S q T r a n s f , utilizando (a) X - 3 y (b) X = 2 + i. Cada curva se ha dibujado con 10000 puntos.
Su** ttinclude
ttinclude
/*
Establece
GLsizei
/*
el
winWidth
Establece
tamaño
inicial
=
winHeight
los
GLfloat
xComplexMin
GLfloat
yComplexMin
struct
complexNum
GLfloat
x,
y:
600,
límites
=
de
de
las
la ventana =
de
visualizaoión.
*/
600;
coordenadas
del
-0.25,
xComplexMax
=
1.25;
-0.75,
yComplexMax
=
0.75;
plano
complejo.
*/
! I
8.23 Métodos de. geometría frac
void
init
/*
(void)
Establece
glClearColor
void
plotPoint
el
color de
(1.0,
1.0,
la
ventana
1.0,
{complexNum
de
visualización
en blanco.
*/
0.0);
z)
{ glBegin
(GL_P0INTS);
glVertex2f glEnd
void
(
(z.x,
z.y);
);
solveQuadraticEq
(complexNum
lambda,
complexNum
*
z)
I OLfloat
lambdaMagSq,
complexOum
diecr;
static
complexOum
static
GLboolean
if
fourOverLambda firstPoint
(firstPoint) /*
discrMag;
m
=
{
0.0,
0.0
} ¡
true;
{
Calcula
el
lambdaMagSq
número
=
complejo:
lambda.x
*
4.0
lambda.x
dividido
-I-
lambda.y
por
lambda.
*
lambda.y;
fourOverLambda.x
=
4.0
*
lambda.x
/
lambdaMagSq;
fourOverLambda.y
-
-4.0=
*
lambda.y
/
lambdaMagSq;
firstPoint
•
false;
-
(z->x
*/
) discr.x
=
discr.y
=
discrMag /*
1.0 {->x •
*
(discr.x
z,
(discrMag z->X
*
+
discr.x
comprobando para
negativo. if
fourOverLambda.x
fourOverLambda.y
sqrt
Actualiza
*
z->y +
*
z->y
la
fourOverLambda.y);
fourOverLamcda.x;
discr.y
evitar
*
*
raíz
discr.y); cuadrada
*/ +
discr.x
-
0;
=
sqrt
<
0)
else z->x if
(discrMag z-»y
-
=
0;
=
0.5
((discrMag
+
discr.x)
discr.x
<
*
((discrMag
/
2.0);
0J
else z->y
/* *
Para
la
sqrt
mitad
situando
el
de
punto
los en
puntos, el
(rand
(
)
Z->X
=
-Z->X;
<
RAND_MAX
/ 2 )
discr.x)
utiliza
cuadrante
*/ if
-
(
3.
la
/
2.0);
raíz
negativa,
de
un
número
CAPÍTULO 8 Representaciones de objetos tridimensionales
/*
Cuando
*
if
/-*
la parte
deberla
estar
ídiscr.y
<
z->x
-z->x;
+
Completa
z->x
= 0 . 5
imaginaria
en el
del
cuadrante
discriminante 2
o 4,
para
ee
negativa,
invertir
el
el
signo
punto de
x.
0)
el *
c á l c u l o de (1
-
la parte
real
de
z.
*/
z->x);
} void
selfSqTransf
GLint
(complexNum
Salta
for
(k -
los 0;
primeros k
<
Dibuja el (k =
0;
puntos.
10;
eolveQuadraticEq
for
complexNum z ,
GLint
numPoints)
k;
/*
/*
lambda,
+/
k++) (lambda,
&zí;
número e s p e c i f i c o d e k < numPoints;
solveQuadraticEq plotPoint
puntos de
k+ + )
ílambda,
transformación.
*/
{
&z);
(z);
}
void
displayFcn
(void)
{ GLint
numPoints
=
10000;//
complexNum lambda complexNum z O
=
= {
{
Establece
3.0,
1.5,
0.0
0.4
};
};
el
número
// //
de
Establece Establece
el
complejo. glClear
(GL_COLOR_BUFFER_BIT);
glColor3f
(0.0,
selfSqTransf glFlush
(
0.0,
//
1.0);
(lambda,
zO,
//
Borra
la
Establece
puntos
que
el v a l o r punto
hay que
complejo de incial
del plano
ventana de v i s u a l i z a c i ó n . el
color
de
los
puntos
numPoints);
);
winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
{ /* *
Mantiene
una
el
de
ancho
glViewport
(0,
glMatrixMode glLoadldentity
r e l a c i ó n de aspecto de la
0,
ventana
compleja
newHeight,
(GL_PROJECTION); {
);
•
1.0, altura
newHeight);
larabda.
*/
} void
dibujar.
asumiendo que de
la
ventana
compleja.
en
azul.
8.23 Métodos de geometría fractal 513
gluOrcho2D glClear
v o i d main
(xComplexMin,
xComplexMax,
yComplexMin,
yComplexMax);
(GL_C0LOR_BUFFER_BIT);
(int
arge,
criar**
argv)
{ glutlnit
(&argc,
argv);
glutlnitDisplayMode
(GLÜT_SINGLE
glutlnitWindowPosition glutlnitWindowStze glutCreateWindow
(50,
|
GLUT_RGB);
50);
(winWídCh,
winHeighc);
("Self-Squaaing
Fractaltt);
i n i t ( ); glutDisplayGunc
(displayFcn);
glucReshapeFunc
(winReshapeFcn);
glucMainLoop
(
);
En la Figura 8. 100 so proporciona un gráfico tridimensional de las variables ,v, y y A correspondiente a la función autocuadrática /(z) = Ar (I - r), donde |A| = I. Cada sección recta de este gráfico es una curva fractal en el plano complejo. Otra operación cuadrática que produce una gran variedad de formas fractales es una transformación z ligeramente modificada. En este caso, el fractal es el límite de la región alrededor del conjunto de valores complejos z que no divergen frente a la transformación cuadrática: 2
— 7,f. | *í" £ | k — 1,2,3,... (
Por tanto, en primer lugar seleccionamos un punto z del plano complejo, después calculamos el punto transformado z + z. En el paso siguiente, calculamos el cuadrado de este punto transformado y se lo añadimos al valor original de z. Repetimos este procedimiento hasta que podamos determinar si la transformación es divergente o no. Los matemáticos han sido conscientes de las características inusuales de tales funciones cuadráticas durante algún tiempo, pero estas funciones eran difíciles de analizar sin computadoras. Después del desarrollo de la computadora digital, el límite de convergencia de la transformación 8.115 se dibujó con una impresora de líneas. A medida que las capacidades de las computadoras digitales se incrementaron, fue posible una investigación gráfica más profunda. Posteriormente, utlizando técnicas de gráficos por computadora más sofisticadas, lienoit Mandelbrol estudió ampliamente esta función, y el conjunto de puntos que no divergen frente a la transformación 8.115 se conoce como el conjunto de Mandelbrot. Para implementar la transformación 8.115, en primer lugar seleccionamos un área rectangular del plano complejo. Los puntos de este área se mapean a continuación a píxeles codificados en color dentro de una ventana de visualización de un monitor de video (Figura 8.101). Los colores de los píxeles se eligen según la velocidad de divergencia del punto correspondiente del plano complejo frente a la transformación 8.115. Si el módulo del número complejo es mayor que 2, entonces divergirá rápidamente cuando se calcula repetidamente su cuadrado. Por tanto, podemos establecer un bucle para repetir las operaciones de cálculo del cuadrado 2
514
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.100. I a función/(z) = Áz{\ - z) dibujada en tres dimensiones, con valores normalizados de X que varían según el eje vertical. (Cortesía ele Alan Norton, IfíM Research. )
Ventana de visuali/neión
Plano complejo
Pamall.i do video
FIGURA 8.101. Mapeo de puntos desde un área rectangular del plano complejo a pixeles codificados con color dentro de una ventana de visualizaeión. hasta que el modulo del número complejo sea mayor que 2 o hayamos alcanzado un número prescleccionado de iteraciones. El número máximo de iteraciones depende de la cantidad de detalle que queramos para visualizar y del número de puntos que haya que dibujar, liste valor se establece a menudo en algún valor entre 100 y I0OO, aunque se pueden utilizar valores más bajos para acelerar los cálculos. Con valores más bajos del límite de iteración, sin embargo, tendemos a perder cierto detalle a lo largo de los límites (conjunto de Julia) de la región tic convergencia. Al final del bucle, seleccionamos un valor de color según el número de iteraciones ejecutadas en el bucle. Por ejemplo, podemos colorear de negro el píxel si el número de iteraciones alcanza el valor máximo (un punto no divergente), podemos colorear el píxel de rojo si el número de iteraciones es próximo a 0. Se pueden seleccionar otros valores de color según el valor del número de iteraciones dentro del intervalo que varía desde ü al valor máximo. Eligiendo diferentes mapeos de color y diferentes partes del plano complejo, podemos generar una gran variedad de \ isualiz.aciones dramáticas de los puntos de la vecin-
8.23 Métodos de geometría fractal 5 1 5
dad de la frontera fractal que encierra los puntos no divergentes. En la Figura 8.102(a) se muestra una elección para codificar con color los píxeles de la región alrededor del conjunto de Mandelbrot. I n el programa siguienle se proporciona una implcmcnlación de la transformación 8.115 para visualizar el conjunto de puntos de convergencia y sus fronteras. La parte principal del conjunto de convergencia está contenido dentro de la siguiente región del plano complejo. - 2 . 0 0 < R e ( r ) < 0.50 - 1 . 2 0 < l m ( r ) 5 1.20 Podemos explorar los detalles a lo largo de la frontera del conjunto de Mandelbrot seleccionando regiones rectangulares del plano complejo sucesivamente más pequeñas de modo que podamos ampliar áreas i \e nadas de la visualización. La Figura 8.102 muestra una visualización codificada en color (aunque la figura se muestra en blanco y negro) de la región alrededor del conjunto de convergencia y una serie de ampliaciones que ilustran algunas características notables de esta transformación cuadrática.
m
№
m
FIGURA 8.102. Ampliación de las Ironieras frac tales de !a transformación 8.115. tomen/anuo por una visualización del conjunto de Mandelbrot, ki región negra de (a) y sus áreas circundantes, ampliamos regiones seleccionadas de la frontera desde íbi hasta (f). Fl contorno blanco de la caja muestra el área rectangular seleccionada en cada ampliación sucesiva. En cada paso se eligen diferentes combinaciones de color para mejorar los patrones visualizados. (Cortesía Je ¡trian EvanS,
Vamlerhilt University).
516
CAPÍTULO 8 Representaciones de objetos tridimensionales
#include /*
Establece el
GLsizei /*
winWidth
Establece
tamaño
inicial
=
winHeight
500,
los
límites
del
de
la =
área
ventana
de
rectangular del
GLfloat
xComplexMin
*~
-2.00,
xComplexMax
•
0.50;
GLfloat
yComplexMin
=
-1.25,
yComplexMax
-
1.25;
GLfloat
complexWidth
GLfloat
complexHeight
class
complexNum
=
xComplexMax F
visualización.
-
yComplexMax
*/
500; plano
complejo.
*/
xComplexMin; -
yComplexMin;
{
public: GLfloat
struct void
color
init
x,
{
y;
GLfloat
r,
g,
b;
};
(void)
{ /*
Establece el
glClearColor
color de
(1.0,
1.0,
la ventana de v i s u a l i z a c i ó n en blanco.
1.0,
0.0);
I woid
plotPoint
(complexNum
z)
i glBegin
(GL_P0INTS);
glVertex2f glEnd
(
(z.x,
z.y);
) ;
) /*
Calcula el
cuadrado de
complexNum c o m p l e x S q u a r e
u n número
(complexNum
complejo.
*/
z)
i complexNum
zSquare;
zSquare.x
=
z.x
zSquare.y
=
2
return
*
*
z.x z.x
*
-
z.y
*
z.^.f -
z.y;
zSquare;
} GLint
mandelSqTransf
(complexNum
zO,
GLint
maxlter)
{ complexNum z GLint /*
count
= =
zO; 0;
S a l e cuando z
while
((z.x *
z.x
*
z
> 4
+
z.y *
*/ z . y <= 4 . 0 )
&&
(count
<
maxlter))
{
*/
8.23
z
•
complexSquare
Métodos de geometría
fractal
(z) ;
z . x +=> z O . x ; Z . y +« z O . y ; COUnt++;
retum
count;
void mandelbrot
complexNum
(GLint
z,
nx,
GLint ny,
ptColor;
GLint
iterCount;
zlncr.x
•
complexWidth
zlncr.y
=
complexHeight
(z.x for
=
/
xComplexMin;
GLfloat /
iterCount
=
z.x
xComplexMax;
>=
z.x
(z,
+=
zlncr.x)
z . y +=
zlncr.y)
if
=
ptColor.g
(iterCount /*
{
maxlter);
maxlter}
Establece e l c o l o r de l o s p u n t o s e n n e g r o .
ptColor.r elBe
<
(ny);
z . y < yComplexMax;
mandelSqTransf
(iterCount
/*
(nx) ;
GLfloat
( z . y = yComplexMin;
if
maxlter)
zlncr;
color
for
GLint
=
>
ptColor.b
•
(maxlter / 8 ) )
Establece
el
color de
ptColor.r
=
1.0;
ptColor.g
»
0.5;
ptColor.b
•
0.0;
*/
0.0; {
los puntos en naranja.
*/
I else
if
(iterCount /*
>
(maxlter / 1 0 ) )
Establece
ptColor.r
=
ptColor.g
=
el
{
color de
l o s puntos
en
rojo.
*/
1.0; ptColor.b
=
0.0;
} else
if
(iterCount /*
>
(maxlter
Establece el oscuro.
/20))
color de
{ los
puntos
en azul
*/
p t C o l o r . b «= 0 . 5 ; ptColor.r
•
ptColor.g
=
0.0;
} else
if
(iterCount /*
>
(maxlter
Establece
el
amarillo.
else
•
ptColor.g
ptColor.b
•
0.0;
(iterCount
40))
{
los
puntos
*/
ptColor.r
if
/
color de
>
-
1.0;
(maxlter /
100))
{
en
517
518
CAPÍTULO 8 Representaciones de objetos tridimensionales
/*
Establece
*
verde
el
color de
oscuro.
ptColor.r
=
ptColor.b
ptColor.g
-
0.3;
else
los puntos en
*/ =
0.0;
{ /*
Establece
*
puntos
el
color
en c í a n .
de
los
*/
ptColor.r
=
0.0;
ptColor.g
•
ptColor.b
*
x
e
iteraciones
1.0;
) /*
Dibuja el
glColor3f
punto coloreado.
(ptColor.r,
plotPoint
*/
ptColor.g,
ptColor.b);
(2);
) void
displayFcn
(void)
I /*
Establece
el
máximas. GLint
nx
glClear
void
de
subdivisiones
1000,
ny
-
1000,
maxlter
{
en
los
ejes
y
y
las
*/
«
mandelbrot glFlush
número
ny,
m
//
1000;
Borra
la pantalla de visualización.
maxlter);
) ;
winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
i /* *
Mantiene
la
r e l a c i ó n de
complexWidth
*/ glViewport
(0,
glMatrixMode
glClear
v o i d main
newHeight,
í
newHeight);
);
(xComplexMin,
arge,
char**
{
glutlnit
asumiendo que
complexHeight.
xComplexMax,
(GL_COLORBUFFER_BIT) ,-
(int
1.0,
(GL_PROJECTION);
glLoadldentity gluOrtho2D
0,
=
aspecto en
t&argc,
argv);
argv;
yComplexMin,
yComplexMax);
8.23 Métodos de geometría fractal
glutlnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitwindowSize glutCreateWindow
init
(
(50,
|
519
GLUT_RGB);
50);
(wínWidth, ("Mandelbrot
winHeight); Set");
);
glutDiaplayFunc
(displayFcn);
glutReshapeFunc
(winReshapeFcn);
glutMainLoop
(
);
}
Las transformaciones con funciones complejas, tales como la Ecuación 8.111,se pueden ampliar para producir superficies fractales y sólidos fractales. Los métodos para generar estos objetos utili/an representaciones con cuaternios (Apéndice A) para transformar puntos del espacio tridimensional y de cuatro dimensiones. Un cuaternio posee cuatro componentes, un número real y tres números imaginarios. Podemos representar un euaternio de la siguiente forma, c o n t ó ampliación del concepto de número del plano complejo. q = s + ta +jb + kc
(8.116)
donde r =/ = le = - I. El número real .v se denomina también parle escalar del cuaternio, y los números imaginarios se llaman parte vectorial del cuaternio v = (£/, b, c). Utilizando las reglas de la multiplicación y suma de cuaternios estudiadas en el Apéndice A, podemos aplicar las funciones aulocuadráticas y otros métodos de iteración para generar superficies de objetos fractales. Un procedimiento básico consiste en comprobar puntos del plano complejo hasta que podamos identificar la frontera entre los puntos divergentes y los no divergentes. Por ejemplo, si localizamos en primer lugar un punto (interior) no divergente, entonces comprobamos los puntos vecinos respecto de dicho punto hasta que se identifique un punto (exterior) divergente. El punto interior anterior se guarda como un punto de la superficie frontera. A continuación se comprueban los vecinos de este punto de la superficie para determinar si están dentro (convergen) o si están fuera (divergen). Cualquier punto interior conectado con un punto exterior es un punto de la superficie. De este modo, el procedimiento se autodirige a lo largo de la frontera fraclal sin desviar su rumbo lejos de la superficie. Cuando se generan fractales de cuatro dimensiones, los cortes tridimensionales se proyectan sobre la superficie bidimensional del monitor de vídeo. Los procedimientos para generar fractales autocuadráticos en el espacio de cuatro dimensiones requieren un tiempo considerable de cálculo, para evaluar la función de iteración y comprobar la convergencia o divergencia de los puntos. Cada punto sobre una superficie se puede representar como un cubo pequeño, que proporciona los limites interno y externo de la superficie. La salida de tales programas para proyecciones tridimensionales contienen más de un millón de vértices en los cubos de la superficie. Visualizamos el objeto fractal mediante la aplicación de modelos de iluminación para determinar el color de cada cubo de la superficie. También se aplican métodos de detección de la superficie visible de modo que sólo se muestren las superficies visibles del objeto. Las Figuras 8.103 y 8.104 muestran ejemplos de fractales autocuadráticos de cuatro dimensiones mediante proyecciones en tres dimensiones.
Fractales autoinversos Se pueden utilizar varias transformaciones geométricas de inversión para crear formas fractales. De nuevo, comenzamos por un conjunto inicial de puntos, y aplicamos repetidamente operaciones no lineales de inversión para transformar los puntos iniciales en un fractal.
520
CAPÍTULO 8
Representaciones de objetos tridimensionales
(a)
(b)
Figura 8.103. Proyecciones iridimcnsionales de frac-tales de cuatro dimensiones generados mediante la función autoeuadrática representada con cuaternios f(q) = Xq{\ - q), que utilizan (a) A = 1.475 + 0.9061/ y (b) A = -0.57 + (Cortesia de Alan Norton. IBM Research.)
V
FIGURA 8.104. Una proyección sobre una superficie tridimensional de un objeto de cuatro dimensiones generado mediante una función autocuadrática representada con cuaternios^) = q~ - I. (Cortesía de Atan Norton, IBM Research.)
FIGURA 8.105. Inversión del punto P al punto P' situado dentro de un circulo de radio r.
Como ejemplo, consideremos una transformación bidimensional de inversión con respecto a un círculo de radio r y su centro P . = (x y ). Un punto P situado fuera del círculo se invierte en un punto P' situado dentro del círculo (Figura 8.105) mediante la transformación: (
ci
c
>
(rVP)(P^P ) = r
2
(8.117,
donde ambos puntos P y P' se encuentran situados en una línea recta que pasa por el centro del circulo P . Podemos usar también la Ecuación 8.117 para transformar los puntos que se encuentran dentro del círculo. Algunos puntos situados dentro se transforman en puntos situados fuera, mientras que otros puntos situados dentro se transforman en puntos situados dentro. Si las coordenadas de los dos puntos se representan como P = (x,y) y P' = (x\y'), podemos escribir la Ecuación 8.117 del siguiente modo: t
[(.x
á
-
+ CV -
-
*..)-
+
CV'
-
J0
=
R
8.24
Gramáticas
de formas y
otros
métodos procedimentales
521
También, ya que los dos puntos están situados en una línea que pasa a través del centro del círculo, tenemos que 0' ~ v,)/ (x — x ) — (y' — y,)/(x' - x ). Por tanto, los valores de las coordenadas transformadas del punto P ' son: r
c
2
(x-x y+(y- y r
2
(x-x ) +(y-y )
yi
v
r
Por tanto, los puntos situados fuera del círculo se mapean a puntos situados dentro de la circunferencia del círculo; los puntos distantes (±°°) se transforman en el centro del círculo. A la inversa, los puntos cercanos al centro del círculo se mapean a punios distantes situados fuera del circulo. A medida que nos alejamos del centro del círculo, los puntos se mapean a puntos más cercanos a la circunferencia del círculo, situados lucra del mismo. Y los puntos situados dentro cerca de la circunferencia se transforman en puntos situados dentro cerca del centro del círculo. Por ejemplo, los valores de la coordenada x de fuera, dentro del rango que varía desde r a + o o , se mapean a valores x' dentro del rango que varía desde / 7 2 a 0, para un círculo centrado en el origen, y los valores de x de dentro desde r / 2 hasta r se transforman en valores dentro del rango que varía desde /• hasta r/2. Se obtienen resultados similares para los valores negativos de x. Podemos aplicar esta transformación a varios objetos, tales como líneas rectas, círculos o elipses. Una línea recta que pasa por el centro del círculo es invariante frente a esta transformación de inversión; se niapea en sí misma. Pero una línea recta que no pasa por el centro del círculo se invierte en un círculo cuya circunferencia contiene el centro P,.. Y cualquier círculo que pase por el centro del círculo de referencia se invierte en una linea recta que no pasa por el centro del circulo. Si el círculo no pasa por el centro del círculo de referencia, se invierte en otro círculo, como en la figura 8.106. Otro invariante frente a la inversión es la transformación de un círculo que es ortogonal al círculo de referencia. Es decir, las tangentes de los dos círculos son perpendiculares en los puntos de intersección. Podemos crear varias formas fractales mediante esta transformación de inversión comenzando por un conjunto de círculos y aplicando la transformación utilizando diferentes círculos de referencia. De forma similar, podemos aplicar la inversión con circuios a un conjunto de líneas rectas. Se pueden desarrollar métodos de inversión similares para otras formas bidimensionales. Y, podemos generalizar el procedimiento a esferas, planos u otros objetos tridimensionales.
8.24 GRAMÁTICAS DE FORMAS Y OTROS MÉTODOS PROCEDIMENTALES Se puede utilizar un gran número de otros métodos procedimentales para diseñar formas de objetos o niveles de detalle de la superficie. Las gramáticas de formas son conjuntos de reglas de producción que se pueden aplicar a un objeto inicial, para añadir capas de detalle que son armoniosas con la forma original. Las transformaciones se pueden aplicar para alterar la geometría (forma) del objeto, o las reglas de transformación se pueden aplicar para añadir detalles del color o la textura de la superficie.
Círculo original
FIGURA 8.106. Inversión de un círculo que no pasa por el origen del círculo de referencia.
522
CAPITULO 8 Representaciones de objetos tridimensionales
Regla 1
Regla 2
Regla 3
Regla 4
Figura 8.107. Cuatro reglas geométricas de sustitución para subdividir y alterar la forma de un triángulo equilátero. Dado un conjunto de reglas de producción, un diseñador de formas puede experimentar aplicando reglas diferentes en cada paso de la transformación a partir de un objeto inicial dado hasta la estructura final. La Figura 8.107 muestra cuatro reglas geométricas de sustitución para alterar formas de triángulos. Las transformaciones de la geometría de estas reglas se pueden expresar algorítmicamente en el sistema, basándose en una imagen de entrada dibujada con un editor de reglas de producción. Es decir, cada regla se puede describir gráficamente mostrando las formas inicial y final. Se pueden establecer implementaciones con Mathematica o algunos lenguajes de programación con capacidades gráficas. En la Figura 8.108 se propociona una aplicación de las sustituciones geométricas de la Figura 8.107, en donde la Figura 8.108(d) se obtiene mediante la aplicación de las cuatro reglas sucesivamente, comenzando por el triángulo inicial de la Figura 8.l()8(a). La Figura 8.109 muestra otras formas creadas mediante reglas de sustitución de triángulos. Las formas tridimensionales y las características de la superficie se transforman con operaciones similares. La Figura 8.110 muestra los resultados de sustituciones geométricas aplicadas a poliedros. La forma inicial de los objetos mostrados en la Figura 8.111 es un icosaedro (un poliedro de 20 caras). Las sustituciones geométricas se aplicaron a la caras planas del icosaedro, y los vértices del polígono que resultan se proyectaron sobre la superficie de una esfera circunscrita.
íc)
(d)
FIGURA 8.108. Un triángulo equilátero (a) se convierte en la forma mostrada en (b) utilizando las reglas de sustitución l y 2 de la Figura 8.107. La regla 3 se utiliza a continuación para convenir (b) en la forma (c), la que a su vez se transforma en (d) utilizando la regla 4. {Cortesía de Andrew Glassner. Xerox PARC (Palo Alto Research Cen/er). © 1992.)
523
FIGURA 8.109. Un diseño creado mediante reglas geométricas de sustitución para alterar formas de triángulos. [Cortesía de Ándrew Glassner. Xerox PARC (Palo Alto Reséa
FIGURA 8.110. Un diseño creado mediante reglas geométricas de sustitución para, alterar formas prismáticas. La forma inicial de este diseño es una representación de la Serpiente de Rubik. [Cortesía de Artdrew Glassner, Xerox PARC (Palo Alio Research Center). Q 1992.]
FIGURA 8.111. Diseños creados sobre ta superficie de una esfera utilizando reglas de sustitución de triángulos apli a las caras planas de un icosaedro, seguidas de proyecciones sobre la superficie de la esfera. [Cortesía de Andrew G, Xerox PARC (Pal
524
CAPÍTULO 8 Representaciónes de objetos
Otro conjunto de reglas de producción para describir la forma de ios objetos se llaman gramáticas L, o graftales. Estas reglas se utilizan habitualmente para generar visualizaeiónes de plantas. Por ejemplo, la topología de un árbol se puede describir como un tronco, al que se unen algunas ramas y hojas. Un árbol se puede entonces modelar mediante reglas para proporcionar una conexión concreta de las ramas y de las hojas en las ramas individuales. La descripción geométrica se proporciona a continuación colocando las estructuras del objeto en puntos concretos. La Figura 8.112 muestra una escena que contiene varias plantas y árboles, contruidos con un paquete comercial generador de plantas. Los procedimientos del software aplican leyes botánicas para generar las formas de las plantas y de los árboles.
8.25 SISTEMAS DE PARTÍCULAS Para algunas aplicaciones, a menudo es útil describir uno o más objetos empleando una colección de panes disjuntas, llamada sistema de partículas. Esta técnica se puede aplicar para describir objetos con propiedades semejantes a las de los Huidos que pueden cambiar en el tiempo mediante flujo, ondulación, pulverización, expansión, contracción o explosión. Entre los objetos con estas características se incluyen las nubes, el humo, el luego, los fuegos artificiales, las cascadas de agua y el agua pulverizada. Los sistemas de partículas se han empleado, por ejemplo, para modelar la explosión de un planeta y la expansión del frente de fuego debidos a la «bomba del génesis» de la película Star Trek II: La ¡ra cíe Khan. Y los métodos basados en sislemas de partículas se han utilizado para modelar otras clases de objetos, entre las que se incluye la hierba.
FIGURA 8.112. Escenario realista generado con el paquete de software TDI-AMAP, que puede generar cerca de cien variedades de plantas y árboles utilizando procedimientos basados en leyes de la Botánica. (Cortesía de Thomson Digital lmage.)
8.25 Sistemas de partículas
525
FIGURA 8.113. Modelado de- fuegos artificiales como un sistema de partículas que viajan radíalmeníe hacia fuera desde el centro de una esfera.
x
FIGURA 8.114. Modelado de hierba mediante el lanzamiento de partículas hacia arriba desde dentro de un cilindro con lapas. Las trayectorias de las partículas son parábolas debido a la fuer/a hacia abajo de la gravedad. En una aplicación típica, un sistema de partículas se define dentro de alguna región del espacio y a continuación se aplican procesos aleatorios para variar en el tiempo los parámetros del sistema. Entre estos parámetros se incluye la trayectoria del movimiento de las partículas individuales, su color y su forma. En algún momento aleatorio, cada partícula se borra. Las formas de las partículas se podrían describir mediante pequeñas esferas, elipsoides o cajas, que pueden variar de forma aleatoria en el tiempo. También, se elige aleatoriamente la transparencia de las partículas, el color y el movimiento. Las trayectorias del movimiento de las partículas se podrían describir cinemáticamente o definir mediante fuerzas tales como un campo gravilalorio. A medida que cada partícula se mueve, se dibuja su trayectoria y se visualiza con un color particular. Por ejemplo, un patrón de fuegos artificiales se puede visualizar mediante la generación aleatoria de partículas dentro de una región esférica del espacio y permitiendo que éstas se muevan radialmenle hacia fuera, como en la Figura 8.113. Las trayectorias de las partículas se podrían codificar con color desde el rojo hasta el amarillo, por ejemplo, para simular la temperatura de las partículas que explotan. De forma similar, las visualizaciones realistas de la hierba se han modelado mediante partículas «de trayectoria» (Figura 8.114) que surgen del suelo y que vuelven a la tierra bajo la acción de la gravedad. En este caso, las trayectorias de las partículas se pueden originar dentro de un cilindro con tapas y se podrían codificar en color desde el verde hasta el amarillo. La Figura 8.115 ilustra una simulación de un sistema de partículas de una cascada de agua. Las partículas de agua caen dede una altura fija, se desvían mediante un obstáculo y entonces rebotan en el suelo. Los diferentes colores se utilizan para distinguir las trayectorias de las partículas en cada etapa. En la Figura 8.1 ló se muestra un ejemplo de una animación que simula la desintegración de un objeto. El objeto de la izquierda se desintegra en la distribución de partículas de la derecha. En la Figura 8.117 se proporciona una escena compuesta formada por una variedad de representaciones. La escena se modeló utilizando hierba con sistema de partículas y montañas fractales, además de mapeado de texturas y otros procedimientos de sombreado de superficies.
526 CAPITULO 8 Representaciones de objetos tridimensionales
FIGURA 8.115. Simulación del comporiamicnuí de una cascada que golpea una piedra (círculo). Las panículas de agua se desvian medianlc la roca y a continuación rebotan en el suelo. (Cortesía Je M. lìrooks and T. /.. ./. Howard, Department of Computer Science, Universidad de Manchester. )
8.26 MODELADO BASADO EN LAS CARACTERÍSTICAS FÍSICAS Un objeto no rígido, tal como una cuerda, una tela o una pelota de goma, se puede representar mediante metodos de modelado basado en las características físicas que describen el comportamiento del objeto en función de la interacción de las fuerzas extemas y las fuerzas internas. Una descripción precisa de la forma de una toalla de felpa colocada sobre el respaldo de una silla, por ejemplo, se obtiene al considerar el efecto de la silla sobre las ondas de la tela de la toalla y la interacción entre los hilos de ésta. Un método común para modelar un objeto no rígido consiste en aproximar el objeto medianlc una ru! de nodos de puntos con conexiones flexibles entre los nodos. Un tipo sencillo de unión es un muelle. La figura К. 118 muestra una sección de una red bidimensional de muelles que se podría utilizar para aproximar el comportamiento de una toalla o de una lámina de goma. Se podrían establecer redes similares de muelles en tres dimensiones para modelar una pelota de goma o un bloque de gelatina. Para un objeto homogéneo, podemos utilizar muelles idénticos en toda la red. Si queremos que el objeto posea diferentes propiedades según direcciones diferentes, podemos utilizar distintas propiedades del muelle en las diferentes direcciones. Cuando se aplican fuerzas extemas a la red de muelles, la cantidad de estiramiento o compresión de los muelles individuales depende del conjunto de valores de la constante de elasticidad k, que también se llama constante de fuerza del muelle.
8.26 Modelado basado en las características físicas
527
FIGURA 8.117. Una escena. Ululada Camino a Paint Reyes, que muestra hierba con sistema de partículas, montañas fractales y superficies con texturas mapeadas. (Cortesía de Pixar. O ¡983 Pixar.)
/
FIGURA 8.118. Una red bidimensional de muelles, construida con constantes de elasticidad k idénticas.
—-
—'''3№
• (poción sin alargamiento)
FIGURA 8.119. Una fuerza externa F tira de un extremo de un muelle, con una unión rígida en el otro extremo. (
El desplazamiento horizontal x de la posición de un nodo bajo la influencia de una fuerza F se ilustra en la Figura 8.119. Si no se estira demasiado el muelle, podemos aproximar fielmente la cantidad de desplazamiento x desde la posición de equilibrio mediante el empleo de la ley de Hooke: x
F = - F = -kx s
r
(8.1/9)
donde F¡ es la fuerza de restablecimiento igual y opuesta del muelle sobre el nodo estirado. Esta relación también se mantiene en la compresión horizontal de un muelle por una cantidad .v, y tenemos relaciones similares para los desplazamientos y fuerzas en las direcciones y y z. Si los objetos son completamente flexibles, vuelven a su configuración original cuando las fuerzas cuernas desaparecen. Pero si queremos modelar masilla, o algún otro material deformable, necesitamos modificar las características de los muelles de manera que estos no vuelvan a su forma original cuando desaparecen las fuerzas externas. Otro conjunto de fuerzas aplicadas podría deformar a continuación el objeto de alguna otra manera.
528
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.120. Modelado del coinportamiento flexible de la piel de un plàtano mediante una red de muellcs. (Cortesia de David Laidlaw, John Snyder, Adam Woodbnry, and Alan Barr, Computer Graphics Lab, California Institute of Technology. €> 1992.)
(a)
FIGURA 8.121. Modelado del comportamiento ilexible de tela sobre muebles utilizando minimización de la función de energía. (Cortesía de Gene Greger and David E. Breen. Design Research Center. Rensselaer Polytechnic Institute. € 1992 .)
(b)
(c)
FIGURA 8.122. Modelado de las características del (a) algodón, (b) la lana, y (c) una mezcla de poliéster y algodón mediante la utilización de ta minimización de la función de energía. (Cortesia de Drnid E. Breen and Donald H. House, Design Research Center, Rensselaer Polytechnic Institute, (ù 1992.) En lugar de utilizar muelles, también podemos modelar las uniones entre los nodos con materiales elásticos y minimizar las funciones de energía de tensión para determinar la forma del objeto bajo la influencia de fuerzas externas. Este método proporciona un modelo mejor para la tela, y se han ideado varias funciones de energía para describir el comportamiento de tipos diferentes de materiales textiles. Para modelar un objeto no rígido, en primer lugar establecemos las fuerzas extemas que actúan sobre el objeto. Depués consideramos la propagación de las fuerzas a través de la red que representa al objeto. Esto conduce a un sistema de ecuaciones que debemos resolver para determinar el desplazamiento de los nodos de la red. La Figura 8.120 muestra la piel de un plátano modelada mediante una red de muelles y la escena de la Figura 8.121 muestra ejemplos de modelado de telas mediante la utilización de funciones de energía, con un patrón de mapeo de una textura sobre una tela. Al ajustar los parámetros de una red empleando cálculos mediante funciones de energía, se pueden modelar diferentes clases de tela. La Figura 8.122 ilustra modelos de materiales como el algodón, la lana y una mezcla de poliéster y algodón colocados sobre una mesa.
8.27 Visualizarían de conjuntos de datos
529
Los métodos de modelado basados en las características físicas también se aplican en animaciones, para proporcionar descripciones más precisas de las trayectorias del movimiento. Antaño, las animaciones se especificaban a menudo empleando trayectorias con splines y cinemática, donde los parámetros del movimiento se basan sólo en la posición y la velocidad. El modelado basado en las características físicas describe el movimiento utilizando ecuaciones dinámicas, que involucran fuerzas y aceleraciones. Las descripciones de animaciones basadas en las ecuaciones de la dinámica producen movimientos más realistas que aquellas basadas en las ecuaciones de la cinemática.
8.27 VISUALIZACIÓN DE CONJUNTOS DE DATOS El uso de métodos de gráficos por computadora como ayuda en el análisis científico y de ingenieria se denomina habitualmente visualización científica. Esta involucra la visualización de conjuntos de dalos y procesos que pueden ser difíciles o imposibles de analizar sin métodos gráficos. Por ejemplo, las técnicas de visualización se necesitan para tratar la salida de mentes de grandes volúmenes de datos como los monitores de las computadoras, escáneres de satélites y naves espaciales, telescopios de radioastronomía y escáneres médicos. Se generan con frecuencia millones de puntos de datos a partir de soluciones numéricas de simulaciones por computadora y a partir de equipos de observación, y es difícil determinar tendencias y relaciones mediante la simple exploración de los dalos sin tratar. De forma similar, las técnicas de visualización son útiles para analizar procesos que ocurren durante un largo período de tiempo o que no se pueden observar directamente, tales como fenómenos mecánico-cuánticos y efectos de la relatividad especial producidos por objetos que viajan a velocidades cercanas a la de la luz. La visualización científica emplea métodos de los gráficos por computadora, procesamiento de imágenes, visión por computadora y otras áreas para mostrar visualmente, mejorar y manipular información para permitir una mejor comprensión de los datos. Métodos similares empleados por el comercio, la industria y otras áreas no científicas se denominan a veces visualización
empresarial. Los conjuntos de datos se clasifican de acuerdo a su distribución espacial y al tipo de datos. Los conjuntos de datos bidimensionales tienen valores distribuidos sobre una superficie, y los conjuntos de datos tridimensionales tienen valores distribuidos en el interior de un cubo, una esfera o alguna otra región del espacio. Entre los tipos de datos se incluyen los valores escalares, los vectores, los tensores y los datos multivariates.
Representaciones visuales de campos escalares Una cantidad escalar es aquella que tiene un único valor. Los conjuntos de datos escalares contienen valores que se pueden distribuir en el tiempo, así como en el espacio, y los valores de los datos también pueden ser funciones de otros parámetros escalares. Algunos ejemplos de cantidades físicas escalares son la energía, la densidad, la masa, la temperatura, la presión, la carga eléctrica, la resistencia eléctrica, la reflexividad, la frecuencia y el contenido de agua. Un método habitual para visualizar un conjunto de datos escalares consiste en utilizar gráficas o diagramas que muestren la distruibución de los valores de los datos en función de otros parámetros, tales como la posición y el tiempo. Si ios datos se distribuyen sobre una superficie, podríamos dibujar los valores de los datos como barras verticales que se elevan desde la superficie, o podemos interpolar los valores de los datos de algún otro modo en los puntos seleccionados de la superficie. También se utilizan métodos de pseudocolor para distinguir los valores diferentes del conjunto de datos escalares, y las técnicas de codificación de color se pueden combinar con métodos de gráficas y diagramas. Para codificar con colores un conjunto de dalos escalares, elegimos un rango de colores y mapeamos el rango de los valores de los datos al rango de color. Por ejemplo, el color azul se podría asignar al valor escalar más bajo, y el color rojo se podría asignar al valor más elevado. La Eigura 8.123 proporciona un ejemplo de un gráfico de superficie codificado con color, aun-
530
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.123. Un grállco de superficie financiero, que mueslra un crecimiento potencial de las acciones durante la caída de la bolsa de octubre de l*>87. El color rojo indica alta rentabilidad, y el gráfico mueslra que las acciones de bajo crecimiento se comportaron mejor en la caída. (Cortesía ele Eng-Kiat Koh. Information Technology Institute. República de S'mgapur y Encentuate, Inc., Cupertino, California.) que la figura se mueslra en escala de grises. La codificación con color de un conjunto de dalos a veces requiere un trato especial, porque ciertas combinaciones de color pueden conducir a interpretaciones erróneas de los datos. Los gráficos de nivel se utilizan para visualizar curvas de nivel (líneas de valor constante) de un conjunto de datos escalares distribuido sobre una superficie. Las curvas de nivel se espacian en un intervalo conveniente para mostrar el rango y la variación de los valores de los datos sobre la región del espacio. Una aplicación típica es un gráfico de nivel de las alturas sobre un plano de tierra. Ilabitualmente, los métodos de nivel se aplican a un conjunto de valores de datos que estén distribuidos sobre una cuadrícula regular, como la de la Figura 8.124. Las cuadrículas regulares tienen las lineas equ¡espaciadas, y los valores de los datos se conocen en las intersecciones de la cuadrícula. Las soluciones numéricas de las simulaciones por computadora se establecen habitualmente para producir distribuciones de datos sobre cuadrículas regulares, mientras que los conjuntos de datos observados se espacian a menudo de forma irregular. Se han ideado métodos de nivel para varias clases de cuadríctdas no regulares, pero las distribuciones no regulares de datos se convierten a menudo en cuadriculas regulares. Un algoritmo bidimensional de nivel traza las lineas de nivel desde una celda a Otra de la cuadrícula, mediante la comprobación de las cuatro esquinas de las celdas de la cuadrícula para determinar qué aristas de la celda se cruzan con una línea de nivel concreta. Las líneas de nivel se dibujan habitualmente como secciones de línea recta a través de cada celda, como se ilustra en la Figura 8.125. A veces las líneas de nivel se dibujan mediante curvas con splines, pero el ajuste de los splines puede conducir a inconsistencias y malas interpretaciones de un conjunto de datos. Por ejemplo, dos líneas de nivel con splines se podrían cruzar, o las trayectorias de líneas de nivel curvadas podrían no ser un verdadero indicador de las tendencias de los datos, ya que los valores de los datos sólo se conocen en las esquinas de las celdas. Los paquetes de nivel pueden permitir el ajuste interactivo de las líneas de nivel al investigador para corregir cualquier inconsistencia. En la Figura 8.126 se proporciona un ejemplo con tres gráficos de nivel sobre el plano xy que se superponen y que están condificados con color y la Figura 8.127 muestra las líneas de nivel y la codificación con color de un espacio de forma irregular.
FIGURA 8.124. Una cuadrícula regular y bidimensional con los valores de los datos en las intersecciones de las lincas de la cuadrícula. 1 .as lincas x de la cuadrícula tienen un espaciado constante Av y las líneas y de la cuadrícula tienen un espaciado constante A>\ en donde el espaciado según los ejes x ey pueden no coincidir.
8.27 Visualización de conjuntos de datos
531
FIGURA 8.125. La trayectoria de una linea de nivel a través de cinco celdas de la cuadrícula.
TIHE' 7200.
XI SU* OF 0*
« l"
M
FIGURA 8.126. Gráficos de nivel codificados con color de tres conjuntos de datos dentro de la misma región del plano xv. {Cortesía de National Cenfer for Supercomputing Applications, Universidad de II fináis en 11 ébano-Champa ign.)
1
K
FIGURA 8.127. Gráficos de nivel codificados con color sobre la superficie de una región del espacio con forma de núcleo de manzana. (Cortesía de Greg Nielson. Department of Computer Science and Engineering, Universidad del Estado de Arizona.)
FIGURA 8.128. Secciones rectas de un conjunto de datos tridimensional. (Cortesía de Spvglass, Inc.)
532
CAPÍTULO 8 Representaciones de objetos tridimensionales
FIGURA 8.129. Una superficie de nivel generada a partir de un conjunto de valores de contenido de agua obtenidos de un modelo numérico de una tormenta. {Cortesía de Bob Wilhelmson, Department of Atmospheric Sciences and ¡he National Center for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.)
FIGURA 8.130. Intersecciones de superficies de nivel con las celdas de la rejilla modeladas con parches de triángulos. En campos de datos escalares tridimensionales, podemos realizar secciones rectas y visualizar las distribuciones bidimensionales de dalos sobre las secciones. Podríamos codificar con color los valores de los datos sobre la sección o podríamos visualizar curvas de nivel. Los paquetes de visualización proporcionan habitualmente una subrutina de corte que permite obtener secciones con cualquier ángulo. La Figura 8.128 muestra una visualización generada mediante un paquete comercial de obtención de secciones. En lugar de observar secciones rectas bidimensionales, podemos dibujar una o más superficies de nivel, que simplemente son gráficos tridimensionales de nivel (Figura 8.129). Cuando se visualizan dos superficies de nivel que se superponen, la superficie exterior se hace transparente a fin de que podamos ver las formas de ambas superficies. La construcción de una superficie de nivel es similar a dibujar líneas de nivel, excepto que ahora disponemos de celdas tridimensionales en la cuadrícula y necesitamos comprobar los valores de los datos en los ocho vértices de una celda, para localizar las secciones de una superficie de nivel. La Figura 8.130 muestra algunos ejemplos de intersecciones de superficies de nivel con las celdas de la cuadricula. Las superficies de nivel se modelan habitualmente mediante mallas de triángulos, después se aplican algoritmos de sombreado de superficies para visualizar la forma final. El sombreado de volúmenes, que es a menudo de alguna manera como a una imagen de rayos X, es otro método para visualizar un conjunto de datos tridimensionales. La información del interior a cerca de un conjunto de datos se proyecta sobre una pantalla de visualización empleando los métodos trazado de rayos presentados en la Sección 8.20. Fn la dirección del rayo procedente de cada píxel de pantalla (Figura 8.131), los valores de los datos interiores se examinan y codifican para su visualización. A menudo, los valores de los datos en los puntos de la cuadricula se promedian de modo que se almacena un valor para cada vóxel del espacio de datos. El modo en que los datos se codifican para su visualización depende de la aplicación. Los datos sísmicos, por ejemplo, se examinan a menudo para buscar los valores máximo y mínimo en la dirección de cada rayo. Los valores se pueden entonces codificar con color para proporcionar información sobre el ancho del intervalo y el valor mínimo. En aplicaciones para medicina, los valores de los datos son factores de opa-
8.27 Visualization de conjuntos de datos
533
píxelcs
FIGURA 8.131. Visualización de volumen de una cuadricular regular y cartesiana de datos que emplea trazado de rayos para examinar los valores de los datos interiores.
FIGURA 8.132. Visualización de un conjunto de dalos del corazón de un perro, obtenida mediante el dibujo de la distancia codificada con color al valor máximo de vóxel para cada pixel. (Cortesía de Patrick Moran y Clinton Potter, National Center for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.) cidad en el rango que varía de 0 a I para capas de tejido y hueso. Las capas de hueso son completamente opacas, mientras que el tejido es de algún modo transparente (baja opacidad). En la dirección de cada rayo, los factores de opacidad se acumulan hasta que el total es mayor o igual que 1, o hasta que el rayo salga por la parte posterior de la cuadrícula tridimensional de datos. El valor de opacidad acumulada se codifica a continuación y se visualiza como un píxel en color o en escala de grises. La Figura 8.132 muestra una visualización de un volumen de un conjunto de datos médicos, que describen la estructura del corazón de un perro. En esta visualización de volumen, se mostró un gráfico codificado con color de la distancia al valor máximo de vóxel en la dirección de cada rayo píxel.
Representaciones visuales de campos vectoriales Una cantidad vectorial V en el espacio tridimensional tiene tres valores escalares (V V , V \ uno para cada eje de coordenadas, y un vector bidimensional tiene dos componentes (V , Kj, Otro modo de describir una cantidad vectorial consiste en proporcionar su módulo |V| y su dirección como un vector unitario u. Como en el caso de los escalares, las cantidades vectoriales pueden ser función de la posición, del tiempo y de otros parámetros. Algunos ejemplos de cantidades físicas vectoriales son la velocidad, la aceleración, la fuerza, la corriente eléctrica y los campos eléctrico, magnético y gravitatorio. Un modo de visualizar un campo vectorial consiste en dibujar cada punto de datos como una pequeña Hecha que muestra la magnitud y la dirección del vector. Este método se utiliza con mayor frecuencia en seecioxí
x
y
z
534
CAPÍTULO 8
Representaciones de objetos tridimensionales
Más alio Más bajó
FIGURA 8.133. Representación mediante Hechas de un campo vectorial sobre secciones rectas. (Cortesía del National Cerner for Snpercomputing Applications, Universidad de Illinois en Urhana-Champaign.)
FIGURA 8.134. Representación mediante líneas de campo de un conjunto de datos vectorial.
nes rectas, como en la Figura 8.133, ya que puede ser complicado observar las tendencias de los datos en una región tridimensional que está desordenada con flechas superpuestas. Las magnitudes de los valores vectoriales se pueden representar como variaciones en las longitudes de las flechas, o podríamos visualizar todas las flechas del mismo tamaño pero codificadas con color. También podemos representar los valores vectoriales mediante el dibujo de líneas de campo, que también se denominan lineas de finjo. Las líneas de campo se utilizan habitualmente en campos eléctricos, magnéticos y gravitatorios. La magnitud de los valores vectoriales se indica mediante el espaciado de las líneas de campo, y la dirección del campo se representa mediante las tangentes (pendientes) a las líneas de campo, como se muestra en la Figura 8.134. En la Figura 8.135 se muestra un ejemplo de un gráfico de líneas de flujo de un campo vectorial. Las líneas de flujo se pueden visualizar como flechas anchas, particularmente cuando hay presente un efecto remolino o vórtice. Un ejemplo de esto se proporciona en la Figura 8.136, que muestra patrones de flujo de aire con turbulencias dentro de una tormenta. En animaciones de flujo de fluidos, se puede visualizar el comportamiento del campo vectorial mediante el seguimiento de partículas en la dirección del flujo. En la Figura 8.137 se muestra un ejemplo de una visualización de un campo vectorial mediante el empleo tanto de líneas de flujo como de partículas.
FIGURA 8.135. Visualización del flujo de aire alrededor de un cilindro con una tapa semiesférica, que se inclina ligeramente con respecto a la dirección del flujo de aire entrante. (Cortesía de M. Gerald-Yamasaki, J. Huiltquist y Sam Uselton, NASA Ames Research Center.)
«asas
Vff^^SSsr
8,27 Visualización de conjuntos de datos
535
FIGURA 8.136. Patrones retorcidos de flujo de aire, visualizados mediante líneas de flujo anchas dentro de un gráíleo
(Cortesía de Bob Wiíhelmson, Department of Atmospheric Sciences and the National Center for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.) transparente de nivel de una tormenta.
FIGURA 8.137. Patrones de (lujo de aire, visualizados tanto con líneas de flujo como de movimiento de partículas dentro un gráfico de una superficie transparente de nivel de una tormenta. Las partículas esféricas que se elevan presentan color
(Cortesía de Bob Wiíhelmson, Department of Atmospheric Sciences y del National Center for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.) naranja y las que caen color azul.
A veces, sólo se visualizan los módulos de las cantidades vectoriales. Esto se hace a menudo cuando hay que mostrar múltiples cantidades en un único punto, o cuando las direcciones no varían mucho en alguna región del espacio, o cuando las direcciones de los vectores son menos interesantes.
Representaciones visuales de campos de tensores Una cantidad tensorial en un espacio tridimensional tiene nueve componentes y se puede representar mediante una matriz 3 por 3. En realidad, esta representación se utiliza para un tensor de segundo orden. Los tensores de orden más elevado se utilizan en algunas aplicaciones, particularmente en estudios de relatividad general. Algunos ejemplos de tensores físicos de segundo orden son la tensión de un material sometido a fuerzas externas, la conductividad (o resistividad) de un conductor eléctrico y el tensor métrico, que proporciona las propiedades de un espacio de coordenadas particular. El tensor presión en coordenadas cartesianas, por ejemplo, se puede representar del siguiente modo:
(8.120)
cr.
536
CAPÍTULO 8 Representaciones de objetos tridimensionales
Figura 8.138. Representación de los tensores de tensión y presión mediante un disco elíptico y una flecha sobre la superficie de un material en tensión. (Cortesía de Bob Haber, the National Center jor Supereomputing Appiicatiom, Universidad de Illinois en Urbana-Champaign.) Las magnitudes tensoriales se encuentran frecuentemente en materiales anisotrópicos, que presentan propiedades diferentes en distintas direcciones. Los elementos A\ xy y xz del tensor de conductividad, por ejemplo, describen las contribuciones de las componentes del campo eléctrico en las direcciones de los ejes x y y z a la corriente en la dirección del eje x. Habitualmente, las magnitudes tensoriales físicas son simétricas, de modo que el tensor sólo tiene seis valores distintos. Por ejemplo, las componentes xy e yx del tensor de presión tienen el mismo valor. y
Las técnicas de visualización para representar las seis componentes de una magnitud lensorial simétrica de segundo orden se basan en idear las formas que tienen seis parámetros. Una representación gráfica de este tipo para un tensor se muestra en la Figura 8.138. Los tres elementos de la diagonal del tensor se utilizan para construir el módulo y la dirección de la flecha, y los tres términos situados fuera de la diagonal se utilizan para establecer la forma y el color del disco elíptico. En lugar de intentar visualizar las seis componentes de una magnitud lensorial simétrica, podemos reducir el tensor a un vector o a un escalar. Empleando una representación vectorial, podemos visualizar simplemente los valores de los elementos de la diagonal del tensor. Y aplicando operaciones de contracción de tensores, podemos obtener una representación escalar. Por ejemplo, los tensores de tensión y presión se pueden contraer, para generar una densidad escalar de energía de presión que se puede dibujar en puntos de un material sometido a fuerzas externas (Figura 8.139).
Representaciones visuales de campos de datos multivariantes En algunas aplicaciones, podemos querer representar valores de datos múltiples en cada punto de la cuadrícula sobre alguna región del espacio. Estos datos a menudo contienen una mezcla de valores escalares, vectoriales y tensoriales. Como ejemplo, los datos del flujo de un Huido incluyen la velocidad del fluido, la temperatura y los valores de la densidad en cada punto tridimensional. Por tanto, leñemos que visualizar cinco valores en cada punto, y la situación es similar a la de la visualización de un campo lensorial. Un método para visualizar campos de datos multivariantes consiste en construir objetos gráficos, que a veces se denominan glifos, con parles múltiples. Cada parte de un glifo representa una magnitud física particular. El tamaño y el color de cada parle se puede utilizar para visualizar información a cerca de las magnitudes escalares. Para proporcionar información sobre las direcciones en un campo vectorial, podemos utilizar una cuña, un cono o alguna otra forma para apuntar en la parte del glifo que representa el vector. En la Figura 8.140 se muestra un ejemplo de la visualización de un campo de datos multivariantes, que emplea una estructura de glifo en unos puntos seleccionados de una cuadrícula.
Resumen
537
FIGURA 8.139. Representación de los tensores de tensión y presión mediante un gráfico de la densidad de energía de presión, de una visualización de la propagación de grietas en la superficie de un material en tensión. (Cortesía de liob Haber, rhe National Cenier for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.)
FIGURA 8.140. Un cuadro de una visualización animada de un campo dependiente del tiempo de datos multivariablcs mediante glifos. La parte con forma de cuña del glifo, señala la dirección de una cantidad vectorial en cada punto. (Cortesía del National Center for Supercomputing Applications, Universidad de Illinois en Urbana-Champaign.)
8.28 RESUMEN Se han desarrollado muchas representaciones para modelar la amplia variedad de objetos y materiales, que podríamos querer visualizar en una escena de gráficos por computadora. En la mayoría de ios casos, una representación tridimensional de un objeto se sombrea mediante un paquete de software como un objeto gráfico estándar, cuyas superficies se muestran como una malla poligonal. Las funciones para visualizar algunas superficies cuádricas comunes, tales como las esferas y los elipsoides, se encuentran disponibles a menudo en los paquetes gráficos. Las ampliaciones de las cuádricas, llamadas supercuádricas, proporcionan parámetros adicionales para crear una variedad más amplia de formas de objetos. Para describir superficies curvadas flexibles y no rígidas podemos utilizar objetos sin forma para crear formas como combinaciones de abultamientos gaussianos. Los métodos más ampliamente utilizados en aplicaciones CAD son las representaciones con splines, que son funciones polinómicas continuas por tramos. Una curva o una superficie con splines se define mediante
538
CAPÍTULO 8
TABLA 8.1.
Representaciones de objetos tridimensionales
RESUMEN DE LAS FUNCIONES OpenGL PARA POLIEDROS.
Función
Descripción
glutWireTetrahedron
Mueslra una pirámide (tetraedro) triangular con malla de alambre.
glutSolidTetrahedron
Muestra un tetraedro con superficie sombreada.
glu.tWireCu.be
Mueslra un cubo con malla de alambre.
glutSolidCube
Muestra un cubo con superficie sombreada.
glutWireOctahedron
Muestra un octaedro con malla de alambre.
glutSolidOctahedron
Muestra un octaedro con superficie sombreada.
glutWireDodecahedron
Muestra un dodecaedro con malla de alambre.
glutSolidTJodecahedron
Muestra un dodecaedro con superficie sombreada.
glutWirelcosahedron
Muestra un icosaedro con malla de alambre.
glutSolidlcosahedron
Muestra un icosaedro con superficie sombreada.
un conjunto de puntos de control y las condiciones en los límites de las secciones del spt'me. Las lineas que conectan la secuencia de puntos de control forman el grafo de conlrol. y todos los puntos de control se encuentran dentro del armazón convexo de un objeto con splines. Las condiciones en los límites se pueden especificar empleando derivadas paramétricas o geométricas, y la mayor parte de las representaciones con splines utilizan condiciones paramétricas en los límites. Los splines de interpolación unen todos los puntos de control mientras que los splines de aproximación no unen todos los puntos de control. Una superficie con splines se puede describir mediante el producto cartesiano de dos polinomios. Los polinomios cúbicos se utilizan habitualmente para las representaciones de interpolación, entre ios que se incluyen los splines de Hemí i te. cardinales y de Kochanek-Barlels. Los splines de Bézier proporcionan un método simple y potente de aproximación para describir líneas y superficies curvadas; sin embargo, el grado del polinomio se determina mediante el número de puntos de conlrol y el control local sobre las formas de las curvas es difícil de lograr. Los splines B, entre los que se incluyen los splines de Bézier como un caso particular, son una representación de aproximación más versátil, pero requieren la especificación de un vector de nudos. Los splines beta son generalizaciones de los splines B que se especifican mediante condiciones geométricas en los límites. Los splines racionales se formulan como el cociente de dos representaciones con splines. Los splines racionales se pueden utilizar para describir cuádricas y son invariantes frente a transformaciones de perspectiva de visualización. LJn spline B racional con un vector de nudos no uniforme se denomina habitualmente NURB. Para determinar los puntos a lo largo de una curva o superficie con splines, podemos utilizar cálculos de diferencias hacia delante o métodos de subdivisión. Entre otras técnicas de diseño se incluyen las representaciones de barrido, los métodos de la geometría constructiva de sólidos, árboles ocíales y árboles BSP. Una representación de barrido se forma mediante una traslación o una rotación de una forma bidimensional a través de una región del espacio. Los métodos de la geometría constructiva de sólidos combinan dos o más formas tridimensionales empleando las operaciones de conjuntos: unión, diferencia e intersección. Los árboles ocíales y los árboles BSP utilizan métodos de subdivisión del espacio. Las representaciones de geometría fractal proporcionan métodos altamente efectivos para describir fenómenos naturales. Podemos utilizar estos métodos para modelar el t e n d i ó , los árboles, los arbustos, el agua y las nubes, y para generar patrones gráficos inusuales. Un objeto fractal se puede describir mediante un procedimiento de construcción y una dimensión fractal. Entre los procedimientos de construcción de fractales se incluyen las construcciones geométricas, los métodos de desplazamiento del punto medio, las operaciones
Hc>uimn
539
autocuaciráticas en el espacio complejo y las transformaciones de inversión. Otros métodos de procesamiento para construir representaciones de objetos que utilizan reglas de transformación son las gramáticas de formas y los grádales. Los objetos que muestran fluidez, tales como las nubes, el humo, el luego, el agua y aquello que explota o implota, se pueden modelar mediante sistemas de partículas. Empleando esta técnica de representación, describimos un objeto mediante un conjunto de partículas y las reglas que gobiernan los movimientos de las partículas. Los métodos de modelado basados en las características físicas se pueden utilizar para describir las características de un objeto flexible, tal como una cuerda, una goma, o la tela. Esta técnica representa un meterial mediante una cuadrícula de secciones semejantes a los resortes y calcula las deformaciones empleando las fuer/as que actúan sobre el objeto.
TABLA 8.2.
RESUMEN DE FUNCIONES OpenGL PARA SUPERFICIES CUÁDRICAS Y SUPERFICIES CÚBICAS.
Función
Descripción
glutWireSphere
Muestra una esfera de GLUT alámbrica.
gtutSolidSphere
Muestra una esfera de G L L T con superficie sombreada.
giutWireCone
Muestra un cono de GLUT alámbrico.
glutSolidCone
Muestra un cono de GLUT con superficie sombreada.
glutWireTorus
Muestra un loro de GLUT de sección recta circular con malla de alambre.
glutSolidTorus
Muestra un toro de GI.UT de sección recta circular con superficie sombreada.
glutWireTeapot
Muestra una telera de GLUT alámbrica.
glutSolidTeapot
Muestra una tetera de GLUT con superficie sombreada.
g iuNewQuadri c
Acúva el sombreador de cuádricas de GLU para un objeto cuyo nombre se haya definido mediante la declaración: GLUquadricObj •nameOfObject;
gluüuadricDrawStyle
Selecciona un modo de visualización de objeto de GLU con nombre predefinido.
gluSphere
Muestra una esfera de GLU.
gluCyiinder
Muestra un cono, un cilindro o un cilindro con tapas de GLU.
gluDisk
Muestra una corona circular plana o un disco de GLU.
gluPartialDisk
Muestra una sección de una corona circular plana o un disco de GLU.
gluDeleCeQuadric
Elimina un objeto de cuádrica de GLU.
gluQuadricOriencation
Define las orientaciones de dentro y fuera de un objeto de cuádrica de GLU.
gluQuadricNormals
Especifica cómo se deberían generar los vectores normales a la super-
o
ficie de un objeto de cuádrica de GLU.
gluQuadricCallback
Especifica una función de atención a errores de un objeto de cuádrica de GLU.
540
CAPÍTULO 8 Representaciones de objetos tridimensionales
TABLA 8.3.
RESUMEN DE FUNCIONES DE BÉZIER DE OpenGL
Función
Descripción
glMapl
Especifica los parámetros de visualización de curvas de Bézier, los valores de los colores, etc., y activa eslas subrutinas empleando g l E n a b l e .
glEvalCoordl
1 aleula un punió en coordenadas de una curva de Bézier.
glMapGridl
Especifica el número de subdivisiones equiespaciadas entre dos parámetros de una curva de Bézier.
glEvalMeshl
Especifica el modo de visualización y el rango entero de una visualización de una curva de Bézier.
glMap2
Especifica los parámetros de visualización de superficies de Bézier, los valores de los colores, etc., y activa estas subrulinas empleando g l E n a b l e .
glEvalCoord2
Calcula un punto en coordenadas de una superficie de Bézier.
glMapGrid2
especifica una cuadrícula bidimensíonal con subdivisiones equiespaciadas sobre una superficie de Bézier.
glEvalMesh2
Especifica el modo de visualización y el rango entero de una cuadricula bidimensional de una superficie de Bézier.
Las técnicas de visualización utilizan los métodos de los gráficos por computadora para analizar conjuntos de datos, entre los que se incluyen los valores escalares, vectoriales y tensoriales en combinaciones variadas. Las representaciones de datos se pueden realizar mediante codificación con color o mediante la visualización de formas de objetos diferentes. Las caras de la superficie poligonal de un objeto gráfico estándar se pueden especificar en OpenGL empleando las (unciones de primitivas de polígonos, triángulos y cuadriláteros. También, las subnitinas de GLUT se encuentran disponibles para mostrar los cinco poliedros regulares. Se pueden visualizar con las funciones de G L U T y GLU esferas, conos y otros objetos con superficies cuádricas, y se proporciona una subrutina de G L U T para la generación de la tetera de Utah con superficies cúbicas. La biblioteca del núcleo de OpenGL contiene funciones para producir splines de Bézier, y se proporcionan las funciones de GLU para especificar splines B y curvas de recorte de superficies con splines. Las Tablas 8.1 a 8.4 resumen las funciones para poliedros, cuádricas, cúbicas y splines estudiadas en este capítulo.
REFERENCIAS Barr (1981) contiene un estudio detallado de las supercuádricas. Para obtener más información sobre el modelado con objetos sin forma, consulte Blinn (1982). El modelo de metabolas se estudia en Nishimura (1985); el modelo de objetos suaves se estudia en Wyville, Wyville y McPheeters (1987). Entre las fuentes de información sobre represente iones con curvas y superficies paramétricas se incluyen Bézier (1972), Barsky y Beatty (1983), Barsky (1984), Kochanek y Bartels (1984). Huitric y Nahas (1985), Mortenson (1985), Farin (1988), Rogcrs y Adams (1990), y Piegl y Tiller (1997). Los algoritmos para aplicaciones con árboles octales y árboles cuaternarios se proporcionan en Doctor y Torberg (1981), Yamaguchi, Kunii, y Fujimura (1984), y Brunet y Navazo (1990). Gordon y Chen (1991) muestran los métodos de los árboles BSP. Y Requicha y Rossignac (1992) estudian los métodos de modelado de sólidos.
Referencias
541
TABLA 8.4. RESUMEN DE FUNCIONES OpenGL PARA SPLINES B. Función gi u N e w N u r b s R e n d e r e r
Descripción Activa él soiiibreador de G L U para splines B para un objeto cuyo nombre se ha definido mediante la declaración GLUnurbsObj * b a p l ineName.
g l u B e g i nCu r v e
(. omien/a l;i asignación de valores de los psfómen"DS de mu GUTVa espeeillca de una o más secciones con splines B.
gluEndCurve
Señala el fin de las especificaciones de los parámetros de una curva
con splines B. g1uNurbsCurve
Especifica los valores de los parámetros de una sección de una curva con nombre con splines I).
gluDeleteNurbsRenderer
elimina un spline B específico.
gluNurbsProperty
Especifica las opciones de sombreado de un spline B.
gluGetNurbsProperty
Determina el valor actual de una propiedad de un spline It.
gluBeginSurface
Comienza la asignación de valores de los parámetros de una superficie específica de una o más secciones con splines B.
gJuEndSurface
Señala el fin de las especificaciones de los parámetros de una superficie con splines B.
g1uNurbaS ur f a c e
Especifica los valores de los parámetros de una sección de una superficie con nombre con splines B.
gluLoadSamplingMatrices
Especifica las matrices de visionado y de transformación geométrica que se deben utilizar en las subrutinas de muestreo y selección de un
spline B. qluNurbsCallback
Especifica la función de atención a un evento para un spline B.
gluNurbsCallbackData
Especifica los valores de los datos que se deben pasar a la función de atención a un evento.
gluBeginTrim
Comienza la asignación de los valores de los parámetros de una curva de recorte de una superficie con splines B.
gluEndTrim
Señala el fin de las especificaciones de los parámetros de una curva de recorte.
gluPwlCurve
Especifica los valores de los parámetros de una curva de recorte de una superficie con splines B.
Para obtener más información sobre representaciones fractales, consulle Mandelbrot (1977 y 1982), Fournier, Fussel, y Carpenter (1982), Norton (1982), Peitgen y Riehter (1986), Peítgen y Saupe (1988), Hart, Sandin, y Kauffman (1989), Koh y Hearn (1992), y Barnslcy (1993). En Fournier y Reeves (1986) y en lovvler, Meinhardt y Prusinkiewiez (1992) se proporcionan métodos de modelado de varios fenómenos naturales. Las gramáticas de formas se muestran en Glassner (1992) y los sistemas de partículas se estudian en Reeves (1983). Los métodos basados en las características físicas se abordan en Barzel (1992). En Hearn y Baker (1991) se proporciona una introducción general a los algoritmos de visualización. Se puede encontrar información adicional sobre técnicas específicas de visualización en Sabin (1985), Lorensen
5 4 2
CAPÍTULO 8
Representaciones de objetos tridimensionales
y Cline (1987), Drebin, Carpenter y Hanrahan (1988), Sabe lia (1988), Upson y Keeler (1988), Frcnkel (1989), Nielson, Shriver y Rosenblum (1990), y Nielson (1993). En Tulle (1990, 1997, y 2001) se proporcionan líneas de actuación para representaciones visuales de información. Se pueden encontrar técnicas de programación de varias representaciones en Glassner (1990), Arvo ( I 9 9 | ) , Kirk (1992), Heckbcrt (1994), y Paeth (1995). Se pueden encontrar ejemplos de programción adicionales de spiines de Bézier, splines B y funciones para curvas de recorte con OpenGL en Woo, Neider. Davis y Shreincr (1999). Kilgard (1996) estudia las funciones de GLUT para visualizar poliedros, superficies cuádricas y la telera de Utah. Y en Shreiner (2000) se muestra un listado completo de las funciones OpcnGL de la biblioteca del núcleo y de (¡LU.
EJERCICIOS 8.1
Establezca un algoritmo para convertir una esfera en una representación mediante una malla poligonal.
8.2
Establezca un algoritmo para convertir un elipsoide en una representación mediante una malla poligonal.
8.3
Establezca un algoritmo para convertir un cilindro en una representación mediante una malla poligonal.
8.4
Establezca un algoritmo para convertir un superelipsoide en una representación mediante una malla poligonal.
8.5
Establezca un algoritmo para convertir una metabola en una representación mediante una malla poligonal.
8.6
Escriba una subrutina para visualizar una curva bidimeiisional con splines cardinales, que utilice un conjunto de puntos de control del plano xy como entrada.
8.7
Escriba una subrutina para visualizar una curva bidimensional de Kochanek-Bartels, que utilice un conjunto de punios de control del plano xy como entrada.
8.8
¿Cuáles son las funciones de combinación de las curvas de Bézier en el caso de tener tres puntos de control especificados en el plano xy'? Dibuje cada función e identifique los valores mínimo y máximo de las funciones de combinación.
8.')
¿Cuáles son las funciones de combinación de las curvas de Bézier en el caso de tener tres puntos de control especificados en el plano xy? Dibuje cada función e identifique los valores mínimo y máximo de las funciones de combinación.
8.10
Modifique el programa de ejemplo de la Sección 8.10 para visualizar una curva cúbica de Bézier, utilizando como entrada un conjunto de cuatro puntos de control del plano xy.
8.M
Modifique el ejemplo de la Sección X. 10 para visualizar un curva de Bézier de grado ;/ da un conjunto de /; puntos de control del plano xy.
I, utilizando como entra-
8.12 Complete el ejemplo de programación con OpenGL de la Sección 8.18 para visualizar cualquier curva cúbica de Bézier. utilizando como entrada un conjunto de cuatro puntos de control del plano xy. 8.13 Complete el ejemplo de programación con OpenGL de la Sección 8.18 para visualizar cualquier curva espacial cúbica de Bézier, utilizando como entrada un conjunte de cuatro puntos de control del plano xy. Utilice una proyección ortogonal para visualizar la curva y los parámetros de visualización como entrada. 8.14
Escriba una subrutina que se pueda utilizar para diseñar formas de curvas bidimensionales de Bézier que posean continuidad por tramos de primer orden. El número y la posición de los puntos de control de cada sección de la curva se deben especificar como entrada.
8.15
Escriba una subrutina que se pueda utilizar para diseñar formas de curvas bidimensionales de Bézier que posean continuidad por tramos de segundo orden. El número y la posición de los puntos de control de cada sección de la curva se deben especificar como entrada.
8.16 Modifique el programa de ejemplo de la Sección 8.10 para visualizar cualquier curva cúbica de Bézier, utilizando como entrada un conjunto de cuatro puntos de control del plano xy. Emplee el método de la subdivisión para calcular los puntos de la curva.
Ejercicios 8.17
543
Modifique el programa de ejemplo de la Sección S.I0 para visualizar cualquier curva cúbica de Bézier, utilizando como entrada un conjunto de cuatro puntos de control del plano xy. Emplee diferencias hacia adelante para calcular los puntos de la curva.
8.18
¿Cuáles son las funciones de combinación de una curva con
splines
B bidimensional, uniforme, periódica y con
splines
B bidimensional, uniforme, periódica y con
= 5?
8.19
¿Cuáles son las funciones de combinación de una curva con
d m 67 8.20
Modifique el programa de ejemplo de la Sección X. 10 para visualizar una curva con
spline
B bidimensional, uni-
forme y periódica, utilizando como entrada un conjunto de puntos de control del plano xy. Emplee diferencias hacia adelante para calcular los puntos de la curva.
8.21
Modifique el programa del ejemplo anterior para visualizar la curva con
8.22
Escriba una subrutina para visualizar cualquier cónica en el plano .vv utilizando una representación mediante un
splines
B empleando funciones Opení i L
spline racional de Bézier. 8.23
Escriba una subrutina para visualizar cualquier cónica en el plano .vv utilizando una representación mediante un
spline B racional. 8.24
Desarrolle un algoritmo para calcular el vector normal a una supcrlice de Bézier en un punto P(u, v).
8.25
Obtenga las expresiones para calcular las diferencias hacia delante para una curva cuadrática.
8.26
Obtenga las expresiones para calcular las diferencias hacia delante para una curva cúbica.
8.27
Establezca los procedimientos para generar la descripción de un objeto tridimensional a partir de la entrada de los parámetros que definen el objeto en función de un barrido de traslación de una forma bidimensional.
8.28
Establezca los procedimientos para generar la descripción de un objeto tridimensional a partir de la entrada de los parámetros que definen el objeto en función de un barrido de rotación de una forma bidimensional.
8.29
idee un algoritmo para generar objetos sólidos como combinaciones de formas primitivas tridimensionales, tules como un cubo y una esfera, empleando los métodos de la geometría constructiva de sólidos.
8.3»
Modifique el algoritmo del ejercicio anterior de manera que las formas primitivas se definan con estructuras con árboles ocíales.
8.31
Desarrolle un algoritmo para codificar una escena bidimensional como una representación mediante un árbol cuaternario.
8.32
Desarrolle un algoritmo para transformar una representación mediante árboles cuaternarios en píxeles del búfer de imagen.
8.33
Escriba una subrutina para convertir una descripción mediante una malla poligonal de un objeto tridimensional en un árbol oetal.
8.34
Empleando un método aleatorio de desplazamiento del punto medio, escriba una subrutina para crear un contorno de una montaña, comenzando por una línea horizontal del plano vv.
8.35
Escriba una subrutina para calcular las alturas sobre un plano de tierra empleando el método de desplazamiento aleatorio del punto medio, a partir de un conjunto de alturas en las esquinas del plano de tierra.
8.36
Escriba un programa para visualizar un copo fractal de nieve (curva de Koeh) para un número de iteraciones dado.
8.37
Escriba un programa para generar una curva fractal con un número de iteraciones concreto, empleando uno de los generadores de la Figura 8.73 o la Figura 8.74. ¿Cuál es la dimensión fractal de la curva?
8.38
Escriba un programa para generar curvas fractales empleando la función autocuadráüea/"(z) = r + X, donde la constante X se especifica como entrada.
8.39 8.40
Escriba un programa que genere curvas fractales usando la función autocuadrálica/U) = / ( r + 1). donde i = yf-i. Modifique el ejemplo de programación de la Sección 8.23 para utilizar niveles de color adicionales en la visualización de los límites de las regiones alrededor del conjunto de Mandelbrot.
544
CAPÍTULO 8 Representaciones de objetos tridimensionales
8.41
Modifique el programa del ejercicio anterior para permitir que los colores y el número de niveles de color se proporcionen como entradas.
8.42
Modifique el programa del ejercicio anterior para seleccionar y visualizar cualquier región frontera rectangular (el área de ampliación) alrededor del conjunto de Mandelbrot.
8.43
F.scriba una subrutina para implementar la inversión de puntos, Ecuación 8.118, para un círculo y un conjunto de puntos específicos.
8.44
Idee un conjunto de reglas de sustitución geométricas para alterar la forma de un triángulo equilátero.
8.45
Escriba un programa para el ejercicio anterior que muestre las etapas de la conversión del triángulo.
8.46
Escriba un programa para modelar y visualizar una esfera del plano AT que explota, utilizando un sistema de partículas.
8.47
Modifique el programa del ejercicio anterior para explotar un petardo (cilindro).
8.48
Idee una subrutina para modelar un trozo pequeño rectangular de tela como una cuadrícula de muelles idénticos.
8.49
Escriba una subrutina para visualizar un conjunto bidimensional de datos escalares empleando una representación mediante pseudocolor.
8.50
Escriba una subrutina para visualizar un conjunto bidimensional de datos empleando lineas de nivel.
8.51
Escriba una subrutina para visualizar un conjunto bidimensional de datos vectoriales, empleando una representación con Hechas para los valores vectoriales. Utilice una flecha de tamaño fijo con diferentes codificaciones de color.
Métodos de detección de superficies visibles
(Cortesía ele Thomson Digital Image, /ne)
Clasificación de los algoritmos de detección de superficies visibles
9.9
Métodos de árboles ocíales
9.10
Método de proyección de rayos
9.2
Detección de caras posteriores
9.11
9.3
Método del búfer de profundidad
Comparación de los métodos de delección de visibilidad
9.4
Método del búfer A
9.12
Superficies curvas
9.5
Método de la línea de exploración
9.6
Método de ordenación de la profundidad
9 . 1 3 Métodos de visibilidad para imágenes alámbricas
9.7
Método del árbol BSP
9.14
9.8
Método de la subdivisión de áreas
Funciones OpenGL de detección de visibilidad
9.15
Resumen
9.1
Uno de los problemas principales en la generación de imágenes gráficas realistas consiste en determinar qué cosas son visibles dentro de una escena desde una posición de visualización seleccionada. Son diversas las técnicas que podemos utilizar para llevar a cabo esta larca y se han desarrollado numerosos algoritmos para la eficiente identificación y visualización de objetos visibles en distintos tipos de aplicaciones. Algunos métodos requieren más memoria, otros consumen un mayor tiempo de procesamiento y algunos sólo pueden aplicarse a tipos especiales de objeto. Qué método elijamos para una aplicación concreta puede depender de tactores tales como la complejidad de la escena, el tipo de los objetos que haya que mostrar, el equipo gráfico disponible y si se necesitan generar imágenes estáticas o animadas. Estos diversos algoritmos se denominan métodos de detección de superficies visibles. En ocasiones, también se llamaba métodos de eliminación de superficies ocultas, aunque puede que existan sutiles diferencias entre la identificación de superficies visibles y la eliminación de superficies ocultas. Con una imagen alámbrica, por ejemplo, puede que no queramos eliminar las superficies ocultas, sino sólo mostrarlas con contornos punteados o con algún otro tipo de identificación, con el fin de retener la información acerca de la forma del objeto.
9.1 CLASIFICACIÓN DE LOS ALGORITMOS DE DETECCIÓN DE SUPERFICIES VISIBLES Podemos clasificar los algoritmos de detección de superficies visibles en sentido amplio dependiendo de si tratan con las definiciones de los objetos o con sus imágenes proyectadas. Estas dos técnicas se denominan métodos del espacio de objetos y métodos del espacio de imagen, respectivamente. Un método del espacio de objetos compara los objetos y las partes de los objetos entre sí, dentro de la definición de la escena, para determinar qué superficies debemos etiquetar como visibles en su conjunto. En un algoritmo del espacio de imagen, la visibilidad se decide punto a punto en cada posición de pixel del plano de proyección. La mayoría de los algoritmos para detección de superficies visibles utilizan métodos del espacio de imagen, aunque los métodos del espacio de objetos pueden usarse de manera efectiva para localizar las superficies visibles en algunos casos. Por ejemplo. los algoritmos de visualización de lineas utilizan generalmente métodos del espacio de objetos para identificar las lineas visibles en las imágenes alámbricas, pero muchos algoritmos de detección de superficies visibles en el espacio de imágenes pueden adaptarse fácilmente para la detección de líneas visibles.
548
CAPÍTULO 9 Métodos de detección de superficies visibles
Aunque existen importantes diferentes en los enfoques básicos adoptados por los diversos algoritmos de detección de superficies visibles, la mayoría de ellos utilizan técnicas de ordenación y coherencia para mejorar la velocidad. La ordenación se usa para facilitar las comparaciones de profundidad, ordenando las superficies individuales de una escena de acuerdo con su distancia con respecto al plano de visualización. Los métodos de coherencia se emplean para aprovechar las regularidades de una escena. Cabe esperar que una línea de barrido individual contenga intervalos (recorridos) con intensidades de píxel constantes, y los patrones de las líneas de barrido a menudo cambian muy poco de una línea a la siguiente. Las imágenes de las secuencias de animación sólo contienen cambios en la vecindad de los objetos en movimiento. Asimismo, a menudo pueden establecerse relaciones constantes entre los objetos de una escena.
9.2 DETECCIÓN DE CARAS POSTERIORES Un método rápido y simple en el espacio de objetos para localizar las caras posteriores de un poliedro se basa en los tests frontal-posterior que hemos presentado en la Sección 3.15. Un punto y\ z) está detrás de una superficie poligonal si Av
+
fly
+
O:
+
/;<0
g /
< )
donde A, B C y D son los parámetros del plano correspondiente al polígono. Cuando este punto se encuentre a lo largo de la línea de visión que da a la superficie, tenemos que estar mirando a la parte posterior del polígono. Por tanto, podemos utilizar la posición de visualización para detectar las caras posteriores. Podemos simplificar el test de caras posteriores considerando la dirección del vector normal N para una superficie poligonal. Si V es un vector en la dirección de visualización procedente de nuestra posición de cámara, como se muestra en la Figura 9- I. un polígono será una cara posterior si, %
V I C W
V „,-N>O
m
V
Además, si las descripciones de los objetos han sido convertidas a coordenadas de proyección y nuestra dirección de visualización es paralela al eje z , sólo será necesario tener en cuenta la componente z del vector normal N. v
En un sistema de visualización que cumpla con la regla de la mano derecha y que tenga la dirección de visualización definida según el eje z negativo (Figura 9.2), un polígono será una cara posterior si la componente z, C de su vector normal N satisface la condición C < 0. Asimismo, no podremos ver ninguna cara cuya normal tenga componente z de valor C ~ 0, ya que nuestra dirección de visualización será tangente a dicho polígono. Asi, en general, podemos etiquetar cualquier polígono como una cara posterior si su vector normal tiene una componente z cuyo valor satisfaga la desigualdad: v
(9.2)
C<()
Pueden utilizarse métodos similares en los paquetes que empleen un sistema de visualización que cumpla con la regla de la mano izquierda. En estos paquetes, los parámetros del plano A, 5, C y D pueden calcularse a partir de las coordenadas de los vértices del polígono especificados en sentido de las agujas del reloj (en lugar de en el sentido contrario a las agujas del reloj que se emplea en los sistemas que cumplen con la regla de la mano derecha). La desigualdad °. I continuará entonces siendo válida para los puntos situados detrás del
N=
FIGURA 9.1. Un vector normal de superficie N y el vector de dirección de visualización V . view
9.3 Método del búfer de profundidad
549
FIGURA 9.2. Una superficie poligonal con parámetro del plano C < 0 en un sistema de coordenadas de visualización que cumpla con la regla de la mano derecha será una cara posterior cuando la dirección de visualización esté definida según el eje z negativo. v
FIGURA 9.3. Vista de un poliedro cóncavo con una cara parcialmente oculta por otras caras del objeto. polígono. Asimismo, las caras posteriores tendrán vectores normales que se alejan de la posición de visualización y que pueden identificarse mediante la desigualdad C > 0 cuando la dirección de visualización se define según el eje z positivo. Examinando el parámetro Cpara las diferentes superficies planas que describen un objeto, podemos identificar inmediatamente todas las caras posteriores. Para un único poliedro convexo, como la pirámide de la Figura 9.2, este test identifica todas las superficies ocultas de la escena, ya que cada superficie será completamente visible 0 completamente oculta. Asimismo, si una escena sólo contiene poliedros convexos no solapados, de nuevo todas las superficies ocultas podrán ser identificadas con el método de la cara posterior. Para otros objetos, como el poliedro cóncavo de la Figura 9.3, es necesario efectuar más comprobaciones para determinar si hay caras adicionales que están parcial o totalmente oscurecidas por otras caras. Una escena general cualquiera contendrá objetos solapados a lo largo de la línea de visión, por lo que necesitaremos determinar si los objetos tapados están parcial o completamente ocultos por otros objetos. En general, la eliminación de caras posteriores permite eliminar aproximadamente la mitad de las superficies poligonales de una escena, con lo que nos ahorramos tener que aplicar tests adicionales de visibilidad. v
9.3 MÉTODO DEL BÚFER DE PROFUNDIDAD Una técnica del espacio de imagen comúnmente utilizada para la detección de superficies visibles es el método del búfer de profundidad, que compara los valores de profundidad de las superficies en una escena para cada posición de píxel sobre el plano de proyección. Cada superficie de la escena se procesa por separado, procesando una posición de pixel de la superficie cada vez. El algoritmo se suele aplicar únicamente a aquellas escenas que sólo contienen superficies poligonales, porque los valores de profundidad pueden calcularse muy rápidamente y el método resulta fácil ele implementar. Pero también podríamos aplicar los mismos procedimientos a superficies no planas. Esta técnica de detección de visibilidad también se denomina frecuentemente como método del búfer z. ya que la profundidad del objeto se suele medir a lo largo del eje z de un sistema de visualización. La Figura 9.4 muestra tres superficies situadas a distancias diferentes según la línea de proyección ortográfica que va del punto (v, y) al plano de visualización. Estas superficies pueden procesarse en cualquier orden. A medida que se procesa cada superficie, su profundidad con respecto al plano de visualización se compara con las superficies previamente procesadas. Si una superficie está más próxima que todas las anteriormente procesadas, se calcula y almacena su color de superficie, junto con su profundidad. Las superficies visibles de una escena estarán representadas por el conjunto de colores de superficie que estén almacenados
550
CAPÍTULO 9 Métodos de detección de superficies visibles
después de haber completado el procesamiento de todas las superficies. La implementación del algoritmo del búfer de profundidad se suele realizar en coordenadas normalizadas, de modo que los valores de profundidad van desde 0 en el plano de recorte próximo (el plano de visualización) a 1.0 en el plano de recorte lejano. ("orno el nombre de este método indica, se requieren dos zonas de búfer. Se utiliza un búfer de profundidad Píira almacenar los valores de profundidad de cada posición (.v, y) a medida que se procesan las superficies, y en el búfer de imagen se almacenan los valores de color de las superficies para cada posición de píxel. Inicialmenle. todas las posiciones en el búfer de profundidad tienen asignado el valor 1.0 (profundidad máxima) y el búfer de imagen (búfer de refresco) se inicializa con el color de fondo. A continuación se procesa cada una de las superficies enumeradas en las tablas de polígonos, de linea en linea, calculando el valor de profundidad en cada posición de píxel (\\y). Esta profundidad calculada se compara con el valor previamente almacenado en el búfer de profundidad para dicha posición de píxel. Si la profundidad calculada es menor que el valor almacenado en el búfer de profundidad, se almacena el nuevo valor de profundidad y el color de superficie para dicha posición se calcula y se almacena en la correspondiente dirección de píxel dentro del búfer de imagen. Los pasos de procesamiento para el método del búfer de profundidad se resumen en el siguiente algoritmo, suponiendo que los valores de profundidad estén normalizados en el rango que va de 0.0 a 1.0, con el plano de visualización a profundidad = 0. También podemos aplicar este algoritmo para cualquier otro rango de profundidades, y algunos paquetes gráficos permiten al usuario especificar el rango de profundidades sobre el que hay que aplicar el algoritmo del búfer de profundidad.
Algoritmo del búfer de profundidad 1. Inicializar el búfer de profundidad y el búfer de imagen de modo que para todas las posiciones de búfer (x, y), depthBuff (x, y) = 1 . 0 , frameBuff (x, y) = backgndColor 2. Procesar cada polígono de una escena consecutivamente. •
Para cada posición de píxel (.v,y) proyectada de un polígono, calcular la profundidad z (si no se conoce ya).
•
Si z < d e p t h B u f f
depthBuff (x, y)
(x,
y ) , calcular el color de superficie para dicha posición y hacer
= z, frameBuff (x, y) - surfColor (x, y)
Después de que todas las superficies hayan sido procesadas, el búfer de profundidad contendrá ios valores de profundidad de las superficies visibles y el búfer de imagen contendrá los correspondientes valores de color de dicha superficie.
Dados los valores de profundidad para los vértices de cualquier polígono en una escena, podemos calcular la profundidad en cualquier otro punto del plano que contiene al polígono, fin la posición de superficie ( A , y), la profundidad se calcula a partir de la ecuación del plano:
Para cualquier línea de barrido (figura °.5) las posiciones x horizontales adyacentes para línea difieren en ±1 y los valores verticales y en líneas de barrido adyacentes dilieren en ± 1 . Si la profundidad de la posición (v, y) es z. entonces la profundidad z' de la siguiente posición (.v * I. y) de la línea de barrido se obtendrá a partir de la Ecuación °.4 como:
Método del búfer de profundidad
551
FIGURA 9.4. líes superficies que se solapan para la posición de píxel (A\y) del plano de visualización. La superficie visible tiene el menor de los valores de profundidad.
,
-A(X + \)-BY-D =
—
j
3
-
—
m >
(9.6) El cocícnic -A/C es constante para cada superficie, por lo que los sucesivos valores de profundidad en una línea de barrido se obtienen a partir de los valores anteriores mediante una única suma. Procesando las posiciones de píxel de izquierda a derecha en cada línea de barrido, comenzamos calculando la profundidad en una arista del polígono situada a la izquierda que intersecte dicha línea de barrido (Figura 9.6). Para cada posición sucesiva a lo largo de la línea de barrido, calculamos entonces el valor de profundidad utilizando la Ecuación 9.6. x' =
x-± m
donde m es la pendiente de la arista (Figura 9.7). Los valores de profundidad a medida que se desciende por esta arista se pueden obtener recursivamente mediante.
i
i
x x + I.
Figura 9.5. A partir de la posición (A, y) en una linca de barrido, la siguiente posición de la línea tiene las coordenadas (x + I, y) y la posición situada inmediatamente debajo en la siguiente línea de barrido tiene coordenadas (x, y - I).
552
CAPÍTULO 9 Métodos de detección de superficies visibles línea de barrido superior línea de barrido y
intersección con arista izquierda
línea de barrido inferior FIGURA 9.6.
Líneas de barrido que interscctan una cara poligonal.
línea de barrriüo y línea de barrido y - 1
FIGURA 9.7. Posiciones de intersección en lincas de barrido sucesivas a lo largo de una arista izquierda de un polígono.
Alm + B z
-
z
(9.7)
+ —
m
Si el procesamiento se efectúa descendiendo por una arista vertical, la pendiente es infinita y los cálculos recursivos se reducen a:
c Una técnica alternativa consiste en utilizar un método del punto medio o un algoritmo de tipo Bresenham para determinar los valores x iniciales a lo largo de las aristas, para cada línea de barrido. Asimismo, este método puede aplicarse a superficies curvas determinando los valores de profundidad y de color en cada punto de proyección de la superficie. Para las superficies poligonales, el método del búfcr de profundidad es muy fácil de implementar y no requiere ninguna ordenación de las superficies de la escena, aunque lo que sí hace falta es disponer de un segundo búfer, además del búfer de refresco. Un sistema con una resolución de 1280 por 1024, por ejemplo, requeriría más de 1.3 millones de posiciones en el búfer de profundidad, debiendo cada posición contener los bits suficientes como para representar el número de incrementos de profundidad necesarios. Una forma de reducir los requisitos de almacenamiento consiste en procesar una sección de la escena cada vez, utilizando un búfer de profundidad menor. Después de procesada cada sección de visualización, el búfer se reutiliza para la siguiente sección. Además, el algoritmo básico del búfer de profundidad realiza a menudo cálculos innecesarios. Los objetos se procesan en orden arbitrario, de modo que puede calcularse un color para un punto de la superficie que luego será sustituido por el de otra superficie más próxima. Para aliviar parcialmente este problema, algunos paquetes gráficos proporcionan opciones que permiten al usuario ajustar el rango de profundidades para comprobación de superficies. Esto permite, por ejemplo, excluir los objetos distantes de las comprobaciones de profundidad. Utilizando esta opción, podríamos incluso excluir objetos que se encuentren muy próximos al plano de proyección. Normalmente, los sistemas infográficos sofisticados incluyen implementaciones hardware del algoritmo de búfer de profundidad.
9.4 Método del búfer A
553
9.4 MÉTODO DEL BÚFER A Una extensión de ios conceptos del búfer de profundidad es el algoritmo de búfer A (letra situada en el otro extremo del alfabeto con respecto al «búfer r», donde 2 representa la profundidad). Esta extensión del búfer de profundidad es un método de detección de visibilidad, promediado de área y antialiasing desarrollado en Lucasfilm Studios para su inclusión en el sistema de representación de superficies denominado REYES (un acrónimo de «Renders Everything You Ever Saw», que podría traducirse por «capaz de representar cualquier cosa que hayas visto»). La región de búfer para este algoritmo se denomina búfer de acumulación, porque se utiliza para almacenar diversos datos de la superficie, además de los valores de profundidad. Una desventaja del método del búfer de profundidad es que identifica únicamente una superficie visible en cada posición de píxel. En otras palabras, sólo es capaz de manejar superficies opacas y no puede acumular valores de color para más de una superficie, tal como hace falta si se quieren representar superficies transparentes (Figura 9.8). El método del búfer A extiende el algoritmo del búfer de profundidad para que cada posición del búfer pueda hacer referencia a una lista enlazada de superficies. Esto permite calcular un color de píxel como combinación de diferentes colores de superficie, para aplicar efectos de transparencia o de antialiasing. •
Cada posición del búfer A tiene dos campos:
•
Campo de profundidad: almacena un número real (positivo, negativo o cero).
•
Campo de datos de la superficie: almacena datos de la superficie o un puntero.
Si el campo de profundidad es no negativo, el número almacenado en dicha posición es la profundidad de una superficie que se solapa con la correspondiente área de píxel. Entonces, el campo de datos de superficie almacena diversa información sobre la superficie, como el color existente en dicha posición y el porcentaje de recubrimiento del píxel, como se ilustra en la Figura 9.9(a). Si el campo de profundidad para una posición del búfer A es negativo, esto indica múltiples contribuciones de superficies al color del píxel. El campo de color almacena entonces un puntero a una lista enlazada de datos de superficie, como en la Figura 9.9(b). La información de superficie que se almacena en el búfer A incluye, superficie opaca de fondo
FIGURA 9.8. La visualización de una superficie opaca a través de una superficie transparente requiere múltiples entradas de color y la aplicación de operaciones de mezcla de color.
profundidad ^ 0
RGB y otra información
(a)
profundidad < 0
info Superf l
info Superf2
FIGURA 9.9. Dos posibles organizaciones para la información de superficie en la representación de una posición de píxel en el búfer A. Cuando sólo hay una única superficie solapada en el pixel, la profundidad de la superficie, su color y otras informaciones se almacenan como en (a). Cuando hay más de una superficie solapada, se almacena una lista enlazada de datos de superficie, como en (b).
554
CAPÍTULO 9 Método* de detección de superficies visibles
•
componenlcs de intensidad RGB
•
parámetro de opacidad (porcentaje de transparencia)
•
profundidad
•
porcentaje de recubrimiento del área
•
identificador de la superficie
•
otros parámetros de representación de la superficie
El esquema de detección de visibilidad mediante búfer A puede implemcntarse utilizando métodos similares a los del algoritmo del búfer de profundidad. Las líneas de barrido se procesan para determinar cuánta parte de cada superficie cubre cada posición de píxel en las líneas de barrido individuales. Las superficies se subdividen en mallas poligonales y se recortan de acuerdo con ios contornos del píxel. Utilizando los factores de opacidad y el porcentaje de recubrimiento de la superficie, los algoritmos de representación calculan el color de cada píxel como una media de las contribuciones de todas las superficies solapadas.
9.5 MÉTODO DE LA LÍNEA DE BARRIDO Este método del espacio de imagen para la identificación de superficies visibles calcula y compara los valores de profundidad a lo largo de las diversas líneas de barrido de una escena. A medida que se procesa cada línea de barrido, se examinan todas las proyecciones de superficies poligonales que intersectan dicha linca para determinar cuáles son visibles. A lo largo de cada línea de barrido, se realizan cálculos de profundidad para determinar qué superficie está más próxima al plano de visualización en cada posición de píxel. Una vez determinada la superficie visible para un píxel, se introduce el color de superficie correspondiente a dicha posición en el búfer de imagen. Las superficies se procesan utilizando la información almacenada en la tabla de polígonos (Sección 3.15). La tabla de aristas contiene las coordenadas de los extremos de cada línea en la escena, la inversa de la pendiente de cada línea y punteros a la tabla de caras de la superficie con el fin de identificar las superficies delimitadas por cada linca. La tabla de caras de la superficie contiene los coeficientes del plano, las propiedades del material de la superficie, otros dalos de la superficie y posiblemente punteros a la tabla de aristas. Para facilitar la búsqueda de las superficies que cruzan una determinada línea de barrido, se forma una lista de aristas activas para cada línea de barrido a medida que ésta es procesada. La lista de aristas activas contiene únicamente aquellas aristas que cruzan la línea de barrido actual, ordenadas en sentido ascendente según la coordenada .v. Además, se define un indicador para cada superficie que se configura como «on» u «off» para indicar si una posición de una línea de barrido está dentro o fuera de la superficie. Las posiciones de píxel de cada línea de barrido se procesan de izquierda a derecha. En la intersección de la izquierda con la proyección de un polígono convexo, se pone a «on» el indicador de la superficie, poniéndose luego a «off» en el punto de intersección derecho a lo largo de la línea de barrido. Para un polígono cóncavo, las intersecciones de la línea de barrido pueden ordenarse de derecha a izquierda, poniendo el indicador de superficie a «on» entre cada par de intersecciones. La Figura 9.10 ilustra el método de la línea de barrido para la localización de las partes visibles de las superficies para cada posición de píxel de una linca de barrido. La lista activa para la línea de barrido 1 contiene información extraída de la tabla de aristas y correspondiente a las aristas AB, BC, EH y FG Para las posiciones a lo largo de esta línea de barrido entre las aristas AB y BC, sólo estará activado el indicador de la superficie $L Por tanto, no hacen falta cálculos de profundidad y los valores de color se determinan a partir de las propiedades y de las condiciones de iluminación de la superficie S De forma similar, entre las aristas EH y EG sólo está activado el indicador de la superficie $ . No hay ninguna otra posición de píxel a lo largo de la línea de barrido I que inlersccle ninguna superficie, por lo que el color de dichos píxeles será el color de fondo, que puede cargarse en el búfer de imagen como parle de la rutina de inicialización. v
2
9.5 Método de la línea de barrido
555
Para las líneas de barrido 2 y 3 de la Figura 9.10, la lista de aristas activas contiene las aristas AD, EH, BC y FG. A lo largo de la línea de barrido 2, entre las aristas AD y EH sólo está activado el indicador de la superficie S pero entre las aristas EH y BC, están activados los indicadores de ambas superficies. Por tanto, es necesario realizar un cálculo de profundidad cuando nos encontremos la vista EH, utilizando los coeficientes de los respectivos planos de las dos superficies. Para este ejemplo, asumimos que la profundidad de la superficie & es menor que la de Sp por lo que se asignarán los valores de color de la superficie S¡ a todos los píxelcs de la línea de barrido hasta encontrar la arista BC. Entonces, el indicador de superficie de S, se desactiva, almacenándose los colores correspondientes a la superficie S hasta alcanzar la arista FG. Ya no hacen falta más cálculos de profundidad, porque asumimos que la superficie S permanece detrás de S una vez que hemos establecido la relación de profundidades en la arista EH. Podemos aprovechar la coherencia entre líneas de barrido al pasar de una línea de barrido a la siguiente. En la Figura 9.10, la línea de barrido 3 tiene la misma línea de listas activas que la línea de barrido 2. Puesto que no se han producido cambios en las intersecciones de las líneas, vuelve a ser innecesario realizar cálculos de profundidad entre las aristas EH y BC. Las dos superficies deben estar en la misma orientación que se ha determinado en la línea de barrido 2, por lo que pueden introducirse los colores de la superficie S sin necesidad de cálculos adicionales de profundidad. r
2
2
}
}
Línea de barrillo 1 .4
i
s
>
/ ¿
s
/
2
J.
Línea de barrido 2 Línea de barrido 3
FIGURA 9.10. Líneas de barrido que cruzan la proyección de dos superficies 5, y S sobre el plano de visualización. Las líneas punteadas indican los contornos de secciones ocultas de una superficie. 2
Línea subdivisora
Línea subdivisora
Línea subdivisora
\
FIGURA 9.11. Superficies solapadas que se inlersectan o que se superponen de forma cíclica y que se ocultan alternativamente unas a otras.
556
CAPÍTULO 9
Métodos de detección de superficies visibles
Con este método de la línea de barrido puede procesarse cualquier número de superficies poligonales solapadas. Los indicadores correspondientes a las superficies se activan «on» para indicar si una posición está dentro o fuera y sólo se realizan cálculos de profundidad en las aristas de las superficies solapadas. Este procedimiento funciona correctamente sólo si las superficies no se cortan y si no se solapan cíclicamente de alguna forma (Figura 9 . 1 1 ) . Si en una escena se produce algún tipo de solapamiento cíclico, podemos dividir la superficie para eliminar dichos solapamientos. Las líneas punteadas de la figura indican dónde podrían subdividirse los planos para formar dos superficies diferentes, con el fin de eliminar los solapamientos cíclicos.
9.6
MÉTODO DE ORDENACIÓN DE LA PROFUNDIDAD
Utilizando operaciones tanto en el espacio de imagen como en el espacio de objetos, el método de ordenación de la profundidad lleva a cabo las siguientes funciones básicas: (1)
Se ordenan las superficies en orden decreciente de profundidades.
(2)
Se digitalizan las superficies por orden, comenzando por la superficie de mayor profundidad.
Las operaciones de ordenación se llevan a cabo tanto en el espacio de imagen como en el espacio de objetos, y la digitalización de las superficies de los polígonos se realiza en el espacio de imagen. Este método de detección de visibilidad se denomina a menudo algoritmo del pintor. Al dibujar una acuarela o un óleo, el artista pinta primero los colores de fondo. A continuación, añade los objetos más distantes y luego los más próximos. En el paso final, se pinta el primer plano sobre el fondo y sobre los objetos más distantes. Cada capa de color cubre la capa anterior. Utilizando una técnica similar, primero ordenamos las superficies de acuerdo con su distancia respecto al plano de visualización. Los valores de color de la superficie más lejana pueden entonces introducirse en el búfer de refresco. Si procesamos cada superficie sucesiva por turno (en orden de profundidad decreciente), estaremos «pintando» la superficie en el búfer de imagen sobre los colores de las superficies previamente procesadas. El almacenamiento de ios colores de las superficies de los polígonos en el búfer de imagen de acuerdo con la profundidad se lleva a cabo en varios pasos. Suponiendo que estemos visualizando la escena según la dirección las superficies se ordenan en la primera pasada de acuerdo con el valor de z más pequeño de cada superficie. La superficie .S' situada al final de la lista (es decir, la superficie con mayor profundidad) se compara entonces con las otras superficies de la lista para ver si hay solapamientos de profundidad. Si no es así, S e s la superficie más distante y se procede a digitalizarla. La Figura 9 . 1 2 muestra dos superficies que se solapan en el plano xv, pero que no tienen solapamiento de profundidad. Este proceso se repite a continuación para la siguiente superficie de la lista. Mientras que no haya solapamientos, se va procesando cada superficie por orden de profundidad hasta que se hayan digitalizado todas. Si se detecta un solapamiento de superficie en cualquier punto de la lista, será necesario efectuar algunas comparaciones adicionales para determinar si hay que reordenar alguna de las superficies. Habrá que realizar los siguientes tests para cada superficie que tenga un solapamiento de profundidad con 5. Si alguno de estos tests se cumple, no será necesario reordenar S y la superficie que esté siendo comprobada. Los tests se enumeran en orden de dificultad creciente: (1)
Los rectángulos de contorno (extensiones de coordenadas) en las direcciones xy de las dos superficies no se solapan.
(2)
La superficie S está completamente detrás de la superficie solapada, en relación con la posición de visualización. La superficie solapada está completamente delante de S en relación con la posición de visualización. Las proyecciones de las aristas de contorno de las dos superficies sobre el plano de visualización no se solapan.
Estos test se realizan en el orden indicado y se salla a la siguiente superficie solapada en cuanto se delecte que alguno de los tests es cierto. Si todas las superficies solapadas pasan al menos uno de estos tests, S será
9.6 Método de ordenación de ¡a profundidad
557
•"lili»
••tnin -
FIGURA 9.12. Dos superficies sin solapamiento de profundidad.
m x . mm
max
Vi
FIGURA 9.13. Dos superficies con solapamiento de profundidad pero que no se solapan en la dirección x.
FIGURA 9.14. La superficie S está completamente detrás de la superficie solapada 5'.
la superficie más distante, no siendo necesario efectuar ninguna reordenación y pudiendo por tanto digitali-
zar& El test l se realiza en dos partes. Primero se comprueba el solapamiento en la dirección x y luego en la dirección y. Si no hay solapamiento de las superficies en ninguna de estas direcciones, los dos planos no pueden ocultarse el uno al otro. En la Figura 9.13 se muestra un ejemplo de dos superficies que se solapan en la dirección z pero no en la dirección x. Podemos realizar los tests 2 y 3 utilizando los tests de polígonos posterior-frontal. En otras palabras, podemos sustituir las coordenadas de todos los vértices de S en la ecuación del plano de la superficie solapada y verificar el signo del resultado. Si las ecuaciones del plano están especificadas de modo que la parte frontal de la superficie apunte hacia la posición de visualización, entonces S estará detrás de S' si todos los vértices de .$' están en la parle posterior de $' (Figura 9.14). De forma similar, .S" estará completamente delante de S si todos los vértices de S' se encuentran delante de S. La Figura 9.15 muestra una superficie solapada .S" que está completamente delante de S, aunque la superficie 5 no está completamente detrás de S'(e\ test 2 no da un resultado verdadero). Si fallaran los tests 1 a 3, realizaremos el test 4 para determinar si se solapan las proyecciones de las dos superficies. Como se ilustra en la Figura 9.16, dos superficies pueden o no intersectarse aún cuando sus extensiones de coordenadas se solapen. Si los cuatro tests fallan para una superficie solapada S\ intercambiaremos las superficies Sy S* en la lista ordenada. En la Figura 9.17 se proporciona un ejemplo de dos superficies que serían reordenadas según este procedimiento. En este punto, todavía no sabemos a ciencia cierta si hemos encontrado la superficie más
558
CAPÍTULO 9 Métodos de detección de superficies visibles
m FIGURA 9.15. La superficie solapada S' está completamente delante de la superficie S, pero ésta no está completamente detrás de S'.
FIGURA 9.16. Dos superficies poligonales con rectángulos de contorno solapados en el plano xy.
FIGURA 9.17. La superficie S llega hasta una profundidad mayor, pero tapa completamente a la superficie S'.
FIGURA 9.18. Tres superficies que han sido introducidas en la lista ordenada de superficies con el orden S, S\ S" y que deben reordenarsc como 5'. S'\ S.
alejada del plano de visualizaeión. La Figura 9.18 ilustra una situación en la que primero intercambiaríamos Sy S". Pero como 5" oculta parle de .S", será necesario intercambiar S" y S' para que las tres superficies queden en el orden correcto de profundidad. Por tanto, necesitamos repetir el proceso de comprobaciones para cada superficie que se reordene en la lista. Resulta perfectamente posible que el algoritmo que acabamos de esbozar entre en un bucle infinito si hay dos o más superficies que se ocultan alternativamente la una a la otra, como en la Figura 9.11. En dicho caso, el algoritmo se dedicaría a reordenar continuamente las superficies solapadas. Para evitar tales bucles, podemos marcar toda superficie que haya sido reordenada a una posición de profundidad mayor, de modo que dicha superficie no pueda volver a ser desplazada. Si se hace un intento de reordenar la superficie una segunda vez, la dividiremos en dos parles para eliminar los solapamientos cíclicos. La superficie original se sustituye entonces por las dos nuevas superficies y el procesamiento continúa como antes.
9.7 MÉTODO DEL ÁRBOL BSP Un árbol de particionamiento del espacio binario (BSP. binary space-partitioning) es un método eficiente para determinar la visibilidad de los objetos pintando las superficies en el búfer de imagen desde atrás hacia adelante, como en el algoritmo del pintor. El árbol BSP resulla particularmente útil cuando el punto de referencia de visualizaeión cambia pero los objetos de la escena se encuentran en posiciones fijas. Aplicar un árbol BSP a las comprobaciones de visibilidad implica identificar las superficies que se encuentren detrás o delante del plano de particionamiento en cada paso de subdivisión del espacio, con respecto a la
9.8 Método de ¡a subdivisión de áreas
559
FIGURA 9.19. Una región del espacio (a) se particiona con dos planos P y P para formar la representación en árbol BSP que se muestra en (b). (
2
dirección de visualización. La Figura 9.19 ilustra el concepto básico de este algoritmo. Con el plano P , , primero particionamos el espacio en dos conjuntos de objetos. Uno de los conjuntos de objetos se encuentra detrás del plano P en relación con la dirección de visualización, mientras que el otro conjunto se encuentra delante de P . Puesto que hay un objeto intersectado por el plano P dividimos dicho objeto en dos objetos separados, etiquetados como A y B. Los objetos A y C están delante de P , , mientras que los objetos B y D se encuentran detrás de P , . A continuación, particionamos de nuevo el espacio en el plano P y construimos la representación en árbol binario que se muestra en la Figura 9.19(b). En este árbol, los objetos se representan como nodos terminales, ocupando los objetos frontales las ramas izquierdas y los objetos posteriores las ramas derechas. Para los objetos descritos mediante caras poligonales, podemos hacer que los planos de particionamicnto coincidan con planos de las superficies poligonales. Entonces se utilizan las ecuaciones de los polígonos para identillcar los polígonos frontales y posteriores y el árbol se construye utilizando el plano de particionamicnto para cada cara poligonal. Todo polígono intersectado por un plano de particionamiento será dividido en dos parles. Cuando el árbol BSP se complete, procesaremos el árbol seleccionando primero los nodos de la derecha y luego los nodos de la izquierda. Así, las superficies se procesan para su visualización comenzando pollas frontales y siguiendo por las posteriores, por lo que los objetos de primer plano se pintan sobre los objetos de fondo. En algunos sistemas se utilizan implcmcntaciones rápidas en hardware para construir y procesar árboles BSP. }
{
v
2
9.8
M É T O D O DE LA SUBDIVISIÓN DE Á R E A S
Esta técnica de eliminación de caras ocultas es esencialmente un método en el espacio de imagen, pero pueden utilizarse operaciones del espacio de objetos para realizar una ordenación de las superficies según su pro-
560
CAPÍTULO 9 Métodos de detección de superficies
fundidad. El método de la subdivisión de áreas aprovecha la coherencia de las áreas de una escena, localizando las áreas de proyección que representan parte de una misma superficie. Aplicamos este método dividiendo sucesivamente el área total del plano de visualización en rectángulos de tamaño más pequeño, hasta que cada área rectangular: (1 ) sólo contenga la proyección de una parte de una única superficie visible, (2) no contenga proyecciones de ninguna superficie o (3) el área se haya reducido al tamaño de un pixel. Para implementar este método, tenemos que definir tests que permitan identificar rápidamente el área como parte de una misma superficie o que nos digan que el área es demasiado compleja como para analizarla fácilmente. Comenzando con el área total, aplicamos los tests para determinar si debemos subdividir dicha área en rectángulos más pequeños. Si los tests indican que la vista es lo suficientemente compleja, la subdividimos. A continuación, aplicamos los tests a cada una de las áreas más pequeñas, subdividiéndolas si los tests indican que la condición de visibilidad de una única superficie sigue siendo incierta. Continuamos con este proceso hasta que se pueda analizar fácilmente las subdivisiones como pertenecientes a una única superficie o hasta que hayamos alcanzado el límite de resolución. Una forma fácil de hacer esto consiste en dividir sucesivamente el área en cuatro partes iguales en cada caso, como se muestra en la Figura 9.20. Esta técnica es similar a la que se emplea para construir un árbol cuádrico. Un área de visualización con una resolución en píxeles de 1024 por 1024 podría subdividirse diez veces de esta forma antes de que una subárea se redujera al tamaño de un único pixel. Hay cuatro posibles relaciones que una superficie puede tener con una de las áreas del plano de visualización subdividido. Podemos describir estas posiciones relativas de la superficie utilizando las siguientes clasificaciones (Figura 9.21 ). Superfìcie circundante: una superficie que encierra completamente el área. Superfìcie solapada: una superficie que está parcialmente dentro y parcialmente fuera del área. Superficie interior: una superficie que está completamente dentro del área. Superficie exterior: una superficie que está completamente fuera del área. Las pruebas para determinar la visibilidad de superficies dentro de un área rectangular pueden enunciarse en términos de las cuatro clasificaciones de superficies ilustradas en la Figura 9.21. No será necesaria realizar ninguna subdivisión adicional de un área especificada si se cumple alguna de las siguientes condiciones. Condición 1:
un área no tiene superficies interiores, solapadas o circundantes (todas las superficies están fuera del área).
Condición 2:
un área sólo tiene una superficie interior, solapada o circundante.
Condición 3:
un área tiene una superficie circundante que oculta todas las demás superficies que caen dentro de los límites del área.
Inicialmente, podemos comparar las extensiones de coordenadas de cada superficie con el contorno del área. Esto nos permitirá identificar las superficies interiores y circundantes, pero las superficies solapadas y exteriores requieren usualmente tests de intersección. Si un único rectángulo de contorno intersecta el área de alguna forma, se utilizan comprobaciones adicionales para determinar si la superficie es circundante, solapa-
FIGURA 9.20. División de un área cuadrada en cuadrantes del mismo lamaño en cada paso.
9.8 Mètodo de la subdivisión de áreas
561
¥ Superfìcie circúndame
Superficie solapada
Superficie interior
Superficie
exterior
FIGURA 9.21. Posibles relaciones entre las superficies poligonales y una sección rectangular del plano de visuali/ación.
(Superficie circúndame)
FIGURA 9.22. Dentro de un área especificada, una superficie circundante con una profundidad máxima z oculta todas las demás superficies que tienen una profundidad mínima mayor que z . nmx
da o exterior. Una vez identificada una única superficie interior, solapada o circundante. Se almacenan los valores de color de la superficie en el búfer de imagen. Un método para comprobar la condición 3 consiste en ordenar las superficies de acuerdo con su profundidad mínima con respecto al plano de visuali/ación. Para cada superficie circundante, calculamos entonces la profundidad máxima dentro del área que estamos considerando. Si la profundidad máxima de una de estas superficies circundantes está más cerca del plano de visuali/ación que la profundidad mínima de todas las otras superficies dentro del área, la condición 3 se satisfará. La Figura 9.22 ilustra esta situación. Otro método para comprobar la condición 3 que no requiere una ordenación según las profundidades consiste en utilizar las ecuaciones de los planos para calcular los valores de profundidad en los cuatro vértices del área para todas las superficies circundantes, solapadas c interiores. SÍ los cuatro valores de profundidad para una de las superficies circundantes son menores que las profundidades calculadas para las otras superficies, se satisfará la condición 3. Entonces, puede mostrarse ese área con los colores correspondientes a dicha superficie circundante. En algunas situaciones, los dos métodos anteriores de comprobación pueden no identificar correctamente una superficie circundante que oculte a todas las otras superficies. Pueden llevarse a cabo comprobaciones adicionales para identificar esa única superficie que cubre el área, pero resulta más rápido subdividir el área que continuar realizando comprobaciones más complejas. Una vez. identificada una superficie como exterior o circundante para un área, seguirá siendo exterior o circundante para todas las subdivisiones de dicha área. Además, podemos esperar que se eliminen algunas superficies interiores y solapadas a medida que continúa el proceso de subdivisión, por lo que las áreas serán más fáciles de analizar. En el caso límite, cuando se produce una subdivisión del tamaño de un pixcl, simplemente se calcula la profundidad de cada superficie relevante en dicho punto y se le asigna al píxel el color de la superficie más próxima. t o m o variación del proceso de subdivisión básico, podríamos subdividir las áreas según los contomos de la superficie, en lugar de dividirlas por la mitad. Si se han ordenado las superficies de acuerdo con su profundidad mínima, podemos utilizar la superficie con valor de profundidad más pequeño para subdividir un área determinada. La Figura 9.23 ilustra este método de subdivisión de áreas. Se utiliza la proyección del contorno de la superficie S para particionar el área original en las subdivisiones A y A . Entonces, la superficie .S' será una superficie circundante para A. y pueden comprobarse las condiciones de visibilidad 2 y 3 para deter{
2
562
CAPÍTULO 9 Métodos de detección de superficies visibles
minar si es necesario efectuar subdivisiones adicionales. En general, se necesitan menos subdivisiones utilizando esta técnica, pero hace falta una mayor cantidad de procesamiento para subdividir las áreas y para analizar la relación de las superficies con los contornos de subdivisión.
9.9 MÉTODOS DE ÁRBOLES OCTALES Cuando se utiliza una representación en árbol octal para el volumen de visualización, la identificación de las superficies visibles se lleva a cabo explorando los nodos del árbol octal en orden de parte frontal a parte trasera. En la Figura 9.24, el primer plano de una escena está contenido en los ociantes 0, I, 2 y 3. Las superficies en la pane frontal de estos ociantes son visibles para el observador. Las superficies situadas en la pane posterior de los ociantes frontales o en los ociantes posteriores (4, 5,6 y 7) pueden estar ocultas por las superficies frontales. Podemos procesar los nodos del árbol octal de la Figura 9.24 en el orden 0, 1 , 2 , 3 , 4 , 5, 6, 7. Esto da como resultado un recorrido del árbol octal que se realiza primero según el orden de profundidad, visitándose los nodos de los cuatro suboctantes frontales del octante 0 antes que los nodos de los cuatro suboctantes posteriores, El recorrido del árbol octal continúa en este orden para cada subdivisión de los octantes.
Octantes numerados FIGURA9.24. Los objetos de los octantes 0, I. 2 y 3 ocultan a los objetos de los ociantes posteriores (4, 5, 6. 7) cuando la dirección de visualización es como se muestra.
de una región Dirección de visuali/ación
9.10 Método de proyección de rayos
1
1
•
2
1
Ociantes en el espacio
563
Cuadramos para el plano de visualización
FIGURA 9.25. División en ociantes para una región del espacio y el correspondiente plano de cuadrantes. Cuando se encuentra un valor de color en un nodo de árbol octal, dicho color se guarda en el árbol cuádrico únicamente si no se ha almacenado previamente ningún valor para la misma área. De esta forma, sólo se almacenarán los colores frontales. Los nodos que tienen el valor "void" se ignoran. Cualquier nodo que esté completamente oculto se eliminará de los ulteriores procesamientos, de modo que no se accederá a sus subárboles. La Figura 9.25 muestra los ociantes en una región del espacio y los correspondientes cuadrantes en el plano de visuali/aeión. Las contribuciones al cuadrante 0 vienen de los cuadrantes 0 y 4. Los valores de color del cuadrante I se obtienen a partir de las superficies de los ociantes I y 5 y los valores de cada uno de los oíros dos cuadrantes se generan a partir de las parejas de octantes alineadas con dichos cuadrantes. Las comprobaciones de visibilidad mediante árbol octal se llevan a cabo mediante procesamiento recursivo de los nodos del árbol y mediante la creación de una representación en árbol cuádrico para las superficies visibles. Para la mayoría de los casos, es necesario tener en cuenta tanto el octante frontal como el posterior a la hora de determinar los valores de color correctos para un cuadrante. Pero si el octante frontal está homogéneamente relleno con un cierto color, no es necesario procesar el octante posterior. Para regiones heterogéneas, se invoca a un procedimiento recursivo, pasándole como nuevos argumentos el hijo del ociante heterogéneo y un nuevo nodo del árbol cuádrico recién creado. Si el frontal está vacío, sólo será necesario procesar el hijo del octante posterior. En caso contrario, se realizan dos llamadas recursivas, una para el ociante posterior y otra para el octante frontal. Puede obtenerse diferentes vistas de objetos representados como árboles ocíales aplicando transformaciones a la representación en árbol que hagan que se reoriente el objeto de acuerdo con la vista seleccionada. Los ociantes pueden entonces renumerarse de modo que la representación en árbol octal esté siempre organizada con los octantes 0, 1, 2 y 3 en la cara frontal.
9.10 MÉTODO DE PROYECCIÓN DE RAYOS Si consideramos la línea de visión que atraviesa una escena partiendo de una posición de píxel en el plano de visualización, como en la Figura 9.26, podemos determinar qué objetos de una esceña intersectan dicha línea (si es que hay alguna). Después de calcular todas las intersecciones entre el rayo y las superficies, identificaremos la superficie visible como aquella cuyo punto de intersección esté más próximo al píxel. Este esquema de detección de visibilidad utiliza procedimientos de proyección cíe rayos que ya hemos presentado en la Sección 8.20. La proyección de rayos, como herramienta de detección de visibilidad, está basada en métodos de óptica geométrica que trazan los trayectos de los rayos luminosos. Puesto que hay un número infinito de rayos luminosos en una escena y sólo nos interesan aquellos que pasan a través de las posiciones de los píxe-
1 564
CAPÍTULO 9
Métodos de detección de superfi1c tes visibles
pixel
FIGURA 9.26. Un rayo trazado a lo largo de la línea de visión que atraviesa una escena partiendo de una posición de píx'el. les, podemos trazar los trayectos de los rayos luminosos hacia atrás a partir de los píxeles, atravesando la escena. La técnica del proyección de rayos es un método eficiente de detección de visibilidad para escenas que tengan superficies curvadas, particularmente esferas. Podemos pensar en la proyección de rayos como en una variante del método del búfer de profundidad (Sección 9.3). En el algoritmo del búfer de profundidad, procesamos las superficies de una en una y calculamos los valores de profundidad para todos los puntos de proyección de la superficie. Las profundidades de superficie calculadas se comparan entonces con las profundidades previamente almacenadas para determinar qué superficie es visible en cada píxel. En el trazado de rayos, procesamos los píxeles de uno en uno y calculamos las profundidades para todas las superficies a lo largo del trayecto de proyección que va hasta dicho píxel. La proyección de rayos es un caso especial de los algoritmos de trazado de rayos (Sección 10.11) que trazan múltiples trayectos de rayos para recopilar las contribuciones de refracción y reflexión globales debidas a múltiples objetos de la escena. Con la proyección de rayos, lo único que hacemos es seguir un rayo desde cada píxel hasta el objeto más cercano. Se han desarrollado técnicas muy eficientes de cálculo de intersecciones entre rayos y superficies para objetos comunes, particularmente esferas, y hablaremos en detalle de estos métodos de cálculo de intersecciones en la Sección 10.11.
9.11 COMPARACIÓN DE LOS MÉTODOS DE DETECCIÓN DE VISIBILIDAD La efectividad de un método de delección de superficies visibles depende de las características de cada aplicación concreta. Si las superficies de una escena están ampliamente distribuidas a lo largo de la dirección de visualización, por lo que hay muy poco solapamiento en profundidad, lo más eíicicnle suele ser utilizar un algoritmo de ordenación de profundidad o de árbol BSP. Cuando hay pocos solapamientos de las proyecciones de las superficies sobre el plano de visualización, los algoritmos de lincas de barrido o de subdivisión de áreas constituyen una forma rápida de localizar las superficies visibles. Como regla general, el algoritmo de ordenación de profundidades o el método del árbol BSP constituyen técnicas altamente efectivas para aquellas escenas que sólo tengan unas pocas superficies. Esto se debe a que dichas escenas suelen tener pocas superficies que se solapen en profundidad. El método de la línea de barrido también funciona bien cuando una escena contiene un pequeño número de superficies. Podemos utilizar los métodos de la línea de barrido, de ordenación de profundidades o del árbol BSP para identificar las superficies visibles de manera efectiva en escenas que tengan hasta unos pocos miles de superficies poligonales. Con escenas que contengan un número mayor de superficies, los métodos más adecuados son el del búfer de
9.12 Superficies curvas
565
profundidad o el del árbol oclal. El método del búfer de profundidad tiene un tiempo de procesamiento prácticamente constante e independiente del número de superficies de una escena. Esto se debe a que el tamaño de las áreas tic superficie decrece a medida que el número de superficies de la escena se incrementa. Por tanto, el método del búfer de profundidad tiene un rendimiento relativamente bajo para escenas simples y relativamente alto para escenas complejas. Los árboles BSP son útiles cuando hay que generar múltiples vistas utilizando diferentes puntos de referencia de visuaiizaeión. Si una escena contiene superficies curvas, podemos utilizar los métodos del árbol octal o de proyección de rayos para identificar las parles visibles de la escena. Cuando se utilizan representaciones en árbol octal en un sistema, el proceso de detección de visibilidad es rápido y simple. Sólo se utilizan sumas y restas enteras en el proceso y no hay necesidad de realizar ordenaciones ni cálculos de intersecciones. Otra ventaja de los árboles ocíales es que almacenan más información que simplemente la geometría de la superficie. Tenemos disponible toda la región sólida de un objeto para la visuaiizaeión, lo que hace que la representación de un árbol octal sea útil para obtener secciones transversales de objetos tridimensionales. Resulta posible combinar e implementar los diferentes métodos de detección de superficies visibles en diversas formas. Además, los algoritmos de detección de visibilidad se suelen implementar en hardware, utilizándose sistemas especiales con procesamiento paralelo para incrementar la eficiencia de estos métodos. Los sistemas hardware especiales se utilizan cuando la velocidad de procesamiento es una consideración de especial importancia, como en el caso de la generación de imágenes animadas para simuladores de vuelo.
9.12 SUPERFICIES CURVAS Los métodos más eficientes para determinar la visibilidad de objetos con superficies curvas son la proyección de rayos y los métodos basados en árbol octal. Con la proyección de rayos, calculamos las intersecciones entre los rayos y las superficies y localizamos la distancia de intersección más pequeña a lo largo del trayecto del rayo. Con los árboles octales, simplemente exploramos los nodos de adelante hacia atrás para localizar los valores de color de superficie. Una vez definida una representación en un árbol octal a partir de las definiciones de entrada de los objetos, todas las superficies visibles se identifican con el mismo tipo de procesamiento. No es necesario realizar ningún tipo especial de consideración para diferentes tipos de superficies, ya sean curvas o de cualquier otra clase. Una superficie curva también puede aproximarse mediante una malla poligonal, y entonces podemos utilizar algunos de los métodos de identificación de superficies visibles previamente expuestos. Pero para algunos objetos, como las esferas, puede que sea más eficiente, además de más preciso utilizar el método de proyección de rayos y las ecuaciones que describen la superficie curva.
Representación de superficies curvas Podemos representar una superficie como una ecuación implícita de la forma/(.v, v, z) 0 o con una representación paramétrica (Apéndice A). Las superficies de tipo spl'me, por ejemplo, se suelen describir mediante ecuaciones paramélricas. En algunos casos, resulta útil obtener una ecuación explícita de la superficie, como por ejemplo una ecuación que nos de la altura con respecto a un plano de tierra xy: z
=f(x,y)
Muchos objetos de interés, como las esferas, elipsoides, cilindros y conos tienen representaciones mediante ecuaciones cuadráticas. Estas superficies se suelen utilizar comúnmente para modelar estructuras moleculares, cojinetes, anillos y ejes. Los algoritmos de línea de barrido y de proyección de rayos requieren a menudo técnicas de aproximación numérica para resolver la ecuación de la superficie en el punto de intersección con una línea de barrido o con un rayo de un píxel. Se han desarrollado diversas técnicas, incluyendo cálculos en paralelo e implemenlaciones hardware de gran velocidad, para resolver las ecuaciones de intersección con superficies curvas para los objetos más comúnmente utilizados.
566 CAPÍTULO 9
Métodos de detección de superficies visibles
Diagramas de contorno de superficies Para muchas aplicaciones en Matemáticas, Física, Ingeniería y otros campos, resulta útil mostrar una función de superficie mediante un conjunto de líneas de contorno que muestren la forma de la superficie. La superficie puede describirse mediante una ecuación o mediante tablas de dalos, como por ejemplo datos topográficos sobre las elevaciones del terreno o dalos de densidad de población. Con una representación funcional explícita, podemos dibujar las líneas de contorno de las superficies visibles y eliminar aquellas secciones de contorno que están ocultas por las parles visibles de la superficie. Para obtener un diagrama xy de una superficie de una función, podemos escribir la representación de la superficie en la forma: .V = / ( * . - ' )
(9.8)
Entonces, podemos dibujar una curva en el plano xy para los valores de z que caigan dentro del rango seleccionado, utilizando un intervalo especificado Az. Comenzando con el valor mayor de z, dibujamos las curvas desde «atrás» hacia «adelante» y eliminarnos las secciones ocultas. Las secciones curvas se dibujan en pantalla mapeando un rango xy de la función sobre un rango de píxeles xy de la pantalla. Entonces, lomamos incrementos unitarios en x y determinamos el correspondiente valor y para cada valor de x aplicando la Ecuación 9.8 para un valor dado de z. Una forma de identificar las secciones de curvas visibles de las superficies consiste en mantener una lista de valores_y y > ' previamente calculados para las coordenadas x de la pantalla. Al pasar de una posición de píxel x a la siguiente, comparamos el valor y calculado con el rango almacenado_y y ,v para el siguiente píxel. Si y
m a x
min
mm
lliax
m a x
x
y
9.13 MÉTODOS DE VISIBILIDAD PARA IMÁGENES ALÁMBRICAS Las escenas no suelen contener secciones de línea aisladas, a menos que estemos mostrando un grafo, un diagrama o un esquema de una red. Pero a menudo surge la necesidad de ver una escena tridimensional en esbozo, con el fin de hacerse una idea rápida de las características de los objetos. La forma más rápida de generar una vista alámbrica de una escena consiste en mostrar los bordes de todos los objetos. Sin embargo, puede resultar difícil determinar la posición frontal o posterior de los objetos en ese tipo de imagen. Una solución a este problema consiste en aplicar técnicas de regulación de la intensidad del color según la profundidad, de modo que la intensidad mostrada de una línea esté en función de la distancia con respecto al observador. Alternativamente, podemos aplicar tests de visibilidad, de modo que las secciones de línea oculta se eliminen o se mueslren con unas propiedades distintas de las de las aristas visibles. Los procedimientos para determinar la visibilidad de las aristas de los objetos se denominan métodos de visibilidad alámbrica. También se llaman métodos de detección de líneas visibles o métodos de detección de lineas ocultas. Además también pueden usarse algunos de los métodos de determinación de superficies visibles analizados en la sección anterior para comprobar la visibilidad de las aristas.
9» 13 Métodos de visibilidad para imágenes alámbricas 567
FIGURA 9,27. Una gráfica de contorno de superficie con codificación de colores. {Cortesía ele Los Alamos National Laboratoty.)
Algoritmos de visibilidad de superficies para representaciones alámbricas Una técnica directa para identificar las secciones de línea visibles consiste en comparar las posiciones de las aristas con las posiciones de las superficies en una escena. Este proceso implica la utilización de los mismos métodos que se usan en los algoritmos de recorte de líneas. lis decir, comprobamos la posición de los extremos de la línea con respecto ai contorno de un área especificada pero en el caso de la comprobación de visibilidad también necesitamos comparar los valores de profundidad de la arista y de la superficie. Cuando ambos extremos proyectados de un segmento de línea caen dentro del área proyectada de una superficie, comparamos la profundidad de los extremos con la de la superficie en dichas posiciones (.v, v). Si ambos extremos están detrás de la superficie, se trata de una arista oculta. Si ambos extremos están delante de la superficie, la arista será visible con respecto a esa superficie. En caso contrario, debemos calcular los puntos de intersección y determinar los valores de profundidad en dichos puntos de intersección. Si la arista tiene una mayor facilidad que la superficie en las intersecciones correspondientes al perímetro, parte de la arista estará oculta por la superficie, como en la figura 9.28(a). Otra posibilidad es que una arista tenga una mayor profundidad en la intersección con una de las líneas de contorno y una menor profundidad que la superficie en la intersección con otra línea de contorno (suponiendo que las superficies sean convexas). En dicho caso, tendremos que determinar si la arista penetra por el interior de la superficie, como en la Figura 9.28(b). Una vez identificada una sección oculta de una arista, podemos eliminarla, mostrarla en forma de línea punteada o utilizar alguna otra característica para distinguirla de las secciones visibles. Algunos de los métodos de detección de superficies visibles pueden adaptarse fácilmente a las pruebas de visibilidad para visualización alámbrica de las aristas de los objetos. Utilizando un método de la cara posterior, podríamos identificar todas las superficies traseras de un objeto y mostrar únicamente los contomos de las superficies visibles. Con la ordenación de profundidad, podemos pintar las superficies en el búfer de refresco de modo que los interiores de las superficies estén en el color de fondo mientras que el contorno se dibuja en el color de primer plano. Procesando las superficies desde atrás hacia adelante, las lineas ocultas serán borradas por las superficies más próximas. Un método de subdivisión de áreas puede adaptarse para la eliminación de líneas ocultas mostrando únicamente los contornos de las superficies visibles. Finalmente, los métodos de líneas de barrido pueden utilizarse para mostrar las posiciones de intersección de las líneas de barrido con los contomos de las superficies visibles.
Algoritmo de variación de intensidad con la profundidad para representaciones alámbricas Otro método para mostrar la información de visibilidad consiste en variar el brillo de los objetos de una escena en función de su distancia con respecto a la posición de visualización. Este método de variación de la intensidad eon la profundidad se suele aplicar utilizando la función lineal:
568
CAPÍTULO 9
Métodos de detección de superficies visibles
donde el es la distancia de un punto con respecto a la posición de visualización. Los valores de profundidad mínima y máxima, ¿ / y ¿ / , pueden especificarse con los valores que sean convenientes para cada especificación concreta. O bien, las profundidades mínima y máxima pueden ajustarse al rango de profundidad normalizado: ¿ / = 0.0 y í / = LO. A medida que se procesa cada posición de píxel, su color se multiplica por &tá^' Así, ios puntos más próximos se mostrarán con intensidades mayores y los puntos de profundidad máxima tendrán una intensidad igual a cero. min
min
n m
m a x
La función de variación de la intensidad puede implementarse con varias opciones. En algunas bibliotecas gráficas, hay disponible una función general de atmósfera (Sección 10.3) que puede combinar la variación de intensidad con otros efectos atmosféricos con el fin de simular humo o niebla, por ejemplo. Así, el color de un objeto podría verse modificado por la función de variación de intensidad con la distancia y luego combinarse con el color atmosférico.
9.14 FUNCIONES OpenGL DE DETECCIÓN DE VISIBILIDAD Podemos aplicar a nuestras escenas tanto el método de eliminación de caras ocultas como las pruebas de visibilidad basadas en búfer z utilizando íunciones incluidas en la biblioteca básica de OpenGL. Además, podemos utilizar funciones OpenGL para construir una imagen alámbrica de una escena en la que se hayan eliminado las líneas ocultas, o bien podemos mostrar las escenas con mecanismos de variación de la intensidad en función de la profundidad.
9 . 1 4 Funciones OpenGL de detección de visibilidad
569
Funciones OpenGL de eliminación de polígonos La eliminación de caras posteriores se lleva a cabo mediante las funciones, glEnable glCullFace
(GL_CULL_FACE); (mode);
donde al parámetro mode se le asigna el valor G L _ B A C K . De hecho, podemos utilizar esta función para eliminar en su lugar las caras frontales, o podríamos incluso eliminar tanto las caras frontales como las posteriores. Por ejemplo, si nuestra posición de visualización se encuentra dentro de un edificio, entonces lo que queremos es ver las caras posteriores (el interior de las habitaciones). En este caso, podríamos asignar al parámetro mode el valor G L _ F R O N T o podríamos cambiar la definición de qué cara de los polígonos es la frontal utilizando la función g l F r o n t F a c e que se explica en la Sección 4.14. Entonces, si la posición de visualización se desplaza al exterior del edificio, podemos eliminar las caras posteriores de la imagen. Asimismo, en algunas aplicaciones, puede que sólo queramos ver otras primitivas dentro de la escena, como los conjuntos de puntos y los segmentos de líneas individuales. En este caso, para eliminar todas las superficies poligonales de una escena, asignaríamos al parámetro mode la constante simbólica OpenGL G L _ F R O N T _ A N D _ B A C K . De manera predeterminada, el parámetro mode en la función g l C u l l F a c e tiene el valor G L B A C K . Por tanto, si activamos la eliminación de caras posteriores mediante la función g l E n a b l e sin invocar explícitamente la función g l C u l l F a c e , se eliminarán las caras posteriores de la escena. La rutina de eliminación se desactiva mediante, glDisable
;
Funciones OpenGL de gestión del búfer de profundidad Para usar las rutinas OpenGL de detección de visibilidad mediante búfer de profundidad, primero necesitamos modificar la función de inicialización G L U T para que el modo de visualización incluya una solicitud de configuración del búfer de profundidad, además de la del búfer de refresco. Podemos hacer esto, por ejemplo, con la instrucción, glutlnitDisplayMode
(GLUT_SINGLE
|
GLUT_RGB
|
GLUT_DEPTH);
Los valores del búfer de profundidad pueden entonces inicial izarse mediante, giciear
;
Normalmente, el búfer de profundidad se inicializa con la misma instrucción que inicializa el búfer de refresco al color de fondo. Pero es necesario borrar el búfer de profundidad cada vez que queramos mostrar una nueva imagen. En OpenGL, los valores de profundidad están normalizados en el rango que va de 0 a 1.0. por lo que la inicialización indicada asignaría a todos los valores del búfer de profundidad el valor máximo LO de manera predeterminada. Las rutinas OpenGL de detección de visibilidad basada en búfer de profundidad se activan mediante la siguiente función: glEnable
(GL_DEPTH_TEST);
y se desactivan mediante, glDisable
(GL_DEPTH_TEST);
También podemos aplicar las comprobaciones de visibilidad basadas en búfer de profundidad utilizando algún otro valor inicial para la profundidad máxima, y este valor inicial se selecciona mediante la función OpenGL, glClearDepth
(maxDepth);
570
CAPÍTULO 9 Métodos de detección de superficies visibles
AI parámetro maxDepth se le puede asignar cualquier valor entre 0 y 1.0. Para cargar este valor de inicialización en el búfer de profundidad, debemos a continuación invocar la función g l c i e a r ( G L _ D E P T H _ B U F F E R B I T ) . En caso contrario, el búfer de profundidad se inicial izará con el valor predeterminado (1.0). Puesto que los cálculos de color de superficie y otros tipos de procesamiento no se llevan a cabo para los objetos que se encuentren más allá de la profundidad máxima especificada, esta función puede usarse para acelerar las rutinas de búfer de profundidad cuando una escena contenga muchos objetos distantes que estén por detrás de los objetos de primer plano. Las coordenadas de proyección en OpenGL están normalizadas en el rango que va de - 1 . 0 a 1.0, y los valores de profundidad entre los planos de recorte próximo y lejano se normalizan al rango 0.0 a 1.0. El valor 0.0 se corresponde con el plano de recorte próximo (el plano de proyección), mientras que el valor 1.0 se corresponde con el plano de recorte lejano. Como opción, podemos ajusfar estos valores de normalización con, glDepthRange {nearNormDepth,
farNormTJepch) ;
De manera predeterminada nearNormDepth = 0 . 0 y farNormDepth = í . o , pero con la función g l D e p t h R a n g e podemos asignar a estos dos parámetros los valores que deseemos dentro del rango que va de 0.0 a 1.0, incluyendo valores para los que nearNormDepth > farNormDepth. Utilizando la función g l D e p t h R a n g e , podemos restringir las comprobaciones de búfer en profundidad a cualquier región del volumen de visuaiizaeión, e incluso podemos invertir las posiciones de los planos próximo y lejano. Otra opción disponible en OpenGL es la condición de prueba que hay que utilizar para las rutinas del búfer de profundidad. Especificamos una condición de prueba mediante la siguiente función: glDepthFunc
(testCondition);
Podemos asignar al parámetro t e s t C o n d i t i o n cualquiera de las siguientes ocho constantes simbólicas: GL_LESS, GLjSREATER, GL_EQUAL, GL_NOTEQUAL, GL_LEQUAL, GL_GEQUAL, G L _ N E V E R (no se procesa ningún punto), G L _ A L W A Y S (se procesan todos los puntos). Estas diferentes pruebas pueden ser útiles en diversas aplicaciones, para reducir los cálculos en el procesamiento relacionado con el búfer de profundidad. El valor predeterminado para el parámetro t e s t C o n d i t i o n es G L _ L E S S , por lo que un valor de profundidad se procesará si tiene un valor que sea inferior al que esté actualmente almacenado en el búfer de profundidad para dicha posición de pixel. También podemos establecer el estado del búfer de profundidad, configurándolo como de sólo lectura o de lectura-escritura. Esto se realiza mediante la función: glDepchMask
(writeStatus);
Cuando w r i t e S t a t u s = GL_TRUE (el valor predeterminado), podemos tanto leer como escribir en el búfer de profundidad. Con w r i t e S t a t u s = GL_FALSE, el modo de escritura en el búfer de profundidad estará desactivado y sólo podremos extraer valores para compararlos durante los tests de profundidad. Esta característica resulta útil cuando queremos utilizar el mismo fondo complicado para mostrar imágenes de diferentes objetos de primer plano. Después de almacenar el fondo en el búfer de profundidad, desactivamos el modo de escritura y procesamos los objetos de primer plano. Esto nos permite generar una serie de imágenes con diferentes objetos de primer plano o con un objeto en diferentes posiciones para una secuencia de animación. Así, sólo se guardan los valores de profundidad correspondientes al fondo. Otra aplicación de la función glDepthMask es para mostrar efectos de transparencia (Sección 10.20). En este caso, sólo queremos guardar las profundidades de los objetos opacos para las pruebas de visibilidad, y no las profundidades de las posiciones correspondientes a superficies transparentes. De modo que se desactivaría la escritura para el búfer de profundidad cada vez que se procesara una superficie transparente. Hay disponibles comandos similares para configurar el estado de escritura para otros búferes (color, índice y patrón de contorno).
Métodos OpenGL para visibilidad de superficies en representaciones alámbricas En OpenGL, podemos obtener una visuaiizaeión alámbrica de un objeto gráfico estándar solicitando que sólo se generen sus aristas. Podemos hacer esto utilizando la función de modo poligonal (Sección 4.14), por ejemplo:
9.15 Resumen gXPolygonMode
(GL_FRONT_AND_BACK,
571
GL_LINE>;
pero eslo haría que se mostraran tanto las aristas visibles como las ocultas. Para eliminar las líneas ocultas en una imagen alámbrica, podemos emplear el método de desplazamiento de profundidad descrito en la Sección 4.I4. Es decir, primero especificamos la versión alámbrica del objeto utilizando el color de primer plano y luego especificamos una versión de relleno interior utilizando un desplazamiento de profundidad y el color de fondo para el relleno interior. El desplazamiento de profundidad garantiza que el relleno de color de fondo no interfiera con la visualización de las aristas visibles. Como ejemplo, el siguiente segmento de código genera una imagen alámbrica de un objeto utilizando un color blanco en primer plano y un color negro de fondo.
glEnable
(GL_DEPTH_TEST);
glPolygonMode glColor3f \*
(1.0,
Invocar
la
glPolygonMode glEnable
1.0,
1.0);
rutina
de
descripción del
(GL_FRONT__AND_BACK,
objeto.
*/
0L_FIU.) ;
(GL_POLYGON_OFFS E T _ F I L L ) ;
glPolygonOffset
(1.0,
glColor3f
0.0,
\*
QL_LINE);
(0.0,
0.0);
Invocar de nuevo
glDisable
1.0)¡
la
rutina
de
descripción del
objeto.
*/
(GL__P0LYGON_OFFSET_FILL) ;
Función OpenGL para variación de la intensidad con la profundidad Podemos variar el brillo de un objeto en función de su distancia a la posición de visualización mediante, glEnable glFogi
(GL_FOG);
{GL_FOG_MODE,
GL_
LINEAR);
listo aplica la función de profundidad lineal de la Ecuación 9.9 a los colores de los objetos utilizando ^min ~ ^ y 4na.\ ^ podemos establecer diferentes valores para í/ y d mediante las siguientes llamadas a función: =
e r o
[nill
glFogf
(GL_FOG_START,
glFogf
(GLFOGEND,
tnHX
minDepth);
maxDepth);
En estas dos funciones, a los parámetros m i n D e p t h y maxDepth se les asignan valores en coma flotante, aunque también pueden emplearse valores enteros si cambiamos el sufijo de la función a i. Además, podemos utilizar la función g l F o g para establecer un color atmosférico que se combine con el color de un objeto después de aplicar la función lineal de variación de la intensidad con la profundidad. También se pueden modelar otros efectos atmosféricos, y hablaremos de dichas funciones en la Sección 10.20.
9.15 RESUMEN El test más simple de visibilidad es el algoritmo de detección de caras posteriores, que es rápido y efectivo como mecanismo inicial de filtro para eliminar muchos polígonos de los posteriores tests de visibilidad. Para un único poliedro convexo, la delección de caras posteriores elimina todas las superficies ocultas, pero en general la detección de caras posteriores no puede identificar todas las superficies ocultas completamente.
572
CAPÍTULO 9
Métodos de detección de superficies visibles
Un método comúnmente utilizado para identificar todas las superficies visibles de una escena es el algoritmo de búfer de profundidad. Cuando se aplica a objetos gráficos estándar, este procedimiento es altamente eficiente, aunque requiere disponer del suficiente espacio de almacenamiento extra. Hacen falta dos búferes: uno para almacenar los colores de los píxcles y otro para almacenar los valores de profundidad correspondientes a las posiciones de los píxeles. Se utilizan métodos de línea de barrido rápidos y de carácter incremental para procesar cada polígono de una escena con el fin de calcular las profundidades de la superficie. A medida que se procesa cada superficie, se actualizan los dos búferes. Una extensión de la técnica de búfer de profundidad es el método de búfer A, que proporciona información adicional para mostrar superficies transparentes y a las que se les pueden aplicar técnicas de antialiasing. Se han desarrollado varios otros métodos de detección de visibilidad. El método de líneas de barrido procesa todas las superficies de una vez para cada linca de barrido. Con el método de ordenación de profundidad (el algoritmo del pintor), los objetos se "pintan" en el búfer de refresco de acuerdo con sus distancias con respecto a la posición de visualización. Entre los esquemas de subdivisión para la identificación de las partes visibles de una escena podemos citar el método del árbol BSP, la subdivisión de áreas y las representaciones basadas en árboles octal es. Las superficies visibles también pueden delectarse utilizando métodos de proyección de rayos, que producen líneas desde el plano de los píxeles hacia la escena para determinar las posiciones de intersección con los objetos a lo largo de estas lineas proyectadas. Los métodos de proyección de rayos son un caso particular de los algoritmos de trazado de rayos, que permiten mostrar los sistemas con eléclos globales de iluminación. Los métodos de delección de visibilidad también se utilizan para mostrar diagramas lineales tridimensionales. Con las superficies curvas, podemos mostrar gráficas de contorno. Para la visualización alámbrica de poliedros, lo que hacemos es buscar las diversas secciones de aristas de las superficies de una escena que son visibles desde la posición de visualización. TABLA 9.1.
RESUMEN DE FUNCIONES OpenGL DE DETECCIÓN DE VISIBILIDAD.
Función
Descripción
glCullFace
Especifica los planos frontal o posterior de los polígonos para las operaciones de eliminación de caras, cuando se activa este mecanismo mediante glEnable
gluclnitDisplayMode
(GL_CULL_FACE).
Especifica las operaciones de búfer de profundidad utilizando el argumento GLUT_DEPTH.
glClear
(GL_DEPTH_BUFFER_BIT)
Inicializa los valores del búfer de profundidad con el valor predeterminado (l .0) p con un valor especificado por la función g l C l e a r D e p t h .
glClearDepth
Especifica un valor inicial del búfer de profundidad.
glEnable
Activa las operaciones de comprobación de profundidad.
(GL_DEPTH_TESTÏ
glDepthRange
Especifica un rango para la normalización de los valores de profundidad.
glDepthFunc
Especifica una condición de comprobación de profundidad.
glDepthMask
Establece el estado de escritura del búfer de profundidad.
glPolygonOfEset
Especifica un desplazamiento para eliminar lincas ocultas en una imagen alámbrica cuando se aplica un color de fondo de relleno.
glFog
Especifica las operaciones lineales de variación de la intensidad con la profundidad y los valores de profundidad mínima y máxima que hay que utilizar en dichos cálculos.
Ejercicios
573
Podemos implemeniar cualquier esquema deseado de detección de visibilidad en un programa de aplicación creando nuestras propias rutinas, pero las bibliotecas gráficas suelen proporcionar (unciones únicamente para la eliminación de caras posteriores y para la incrementación del método del búfer de profundidad. En los sistemas infográficos de alta gama, las rutinas de búfer de profundidad están implementadas en hardware. En la biblioteca básica de OpenGL hay disponibles funciones para eliminación de polígonos posteriores y para determinación de visibilidad basada en búfer de profundidad. Con las rutinas de eliminación de polígonos posteriores, podemos eliminar las caras posteriores de objetos grádeos estándar, sus caras frontales o ambas. Con las rutinas de búfer de profundidad, podemos establecer el rango para las comprobaciones de profundidad y el tipo de comprobación de profundidad que haya que realizar. Las imágenes alámbricas se obtienen utilizando las operaciones OpenGL de modo poligonal de desplazamiento de polígonos. Y también pueden generarse escenas OpenGL utilizando efectos de variación de la intensidad de acuerdo con la profundidad. En la Tabla 9.1 se resumen las funciones OpenGL de comprobación de visibilidad. La función de modo poligonal y otras operaciones relacionadas se resumen al final del Capítulo 4.
REFERENCIAS Entre las fuentes adicionales de información sobre algoritmos de visibilidad podemos citar Elber y Cohén (1990), Franklin y Kankanhalli (1990). Segal (1990) y Naylor, Amanatides y Thibaull (1990). Los métodos de búfer A se presentan en Cook. Carpcnlcr y Catmull (1987), llaeberli y Akcley (1990) y Shilling y Strasser (1993). Puede encontrar un resumen de los métodos de dibujo de contornos en Eanishaw (1985). Si quiere aprender más sobre técnicas de programación para pruebas de visibilidad puede consultar Glassner (1990), Arvo (1991), Kirk (1992), Neckbert (1994) y Paeth (1995). Woo, Neider, Davis y Shreiner (1999) proporcionan explicaciones adicionales sobre las funciones OpenGL de detección de visibilidad y puede encontrar un listado completo de las funciones OpenGL disponibles en la biblioteca básica y en GLU en Shreiner (2000).
EJERCICIOS l
>. 1
Defina un procedimiento de detección de caras posteriores que permita idenlificar todas las earas visibles de eualquier poliedro convexo de entrada que tenga superficies con diferenles colores. El poliedro debe definirse en un sistema de visualización que cumpla la regla de la mano derecha y la dirección de visuali/ación es uno de los parámetros de entrada que debe especificar el usuario.
9.2
linplemente el procedimiento del ejercicio anterior utilizando una proyección paralela ortográfica para ver las superficies visibles del poliedro convexo proporcionado como entrada. Suponga que todas las partes del objeto se encuentran delante del plano de visualización.
9.3
Implemente el procedimiento del Ejercicio 9. I utilizando una proyección de perspectiva para ver las earas visibles del poliedro convexo proporcionado como entrada. Suponga que lodas las partes del objeto se encuentran delante del plano de visualización
9.4
Escriba un programa para generar una animación de un poliedro convexo. Hay que rotar increinentalmente el objeto alrededor de un eje que pase por el objeto y sea paralelo al plano de visualización. Suponga que el objeto cae completamente delante del plano de v isuahzaeión. Utilice una proyección ortográfica paralela para inapear las vistas sucesivamente sobre el plano de visualización.
9.5
Escriba una rutina para implememar el método del búfer de profundidad para la visuali/ación de las earas visibles de cualquier poliedro que suministre como entrada. La matriz para el búfer de profundidad puede tener cualquier tamaño que sea conveniente para su sistema, como por ejemplo 500 por 500. ¿Cómo pueden determinarse los requisitos de almacenamiento para el búfer de profundidad a partir de las definiciones de los objetos que hay que mostrar?
574
CAPÍTULO 9 Métodos de detección de superficies visibles
9.6
Modifique el procedimiento del ejercicio anterior para mostrar las caras visibles de una escena que contenga cualquier número de poliedros. Defina métodos eficientes para almacenar y procesar los diversos objetos de la escena,
9.7
Modifique el procedimiento del ejercicio anterior para implementar el algoritmo del búfer A para la visualización de una escena que contenga tanto superficies opacas como transparentes.
9.8
Amplíe el procedimiento desarrollado en el ejercicio anterior para incluir técnicas de antialiasing.
9.9
Desarrolle un programa para implementar el algoritmo de línea de barrido para la visualización de las superficies visibles de un poliedro dado. Utilice las tablas de polígonos para almacenar la definición del objeto y emplee técnicas de coherencia para evaluar los puntos a lo largo de una línea de barrido y entre unas líneas de barrido y otras.
9.10
Escriba un programa para implementar el algoritmo de linea de barrido para una escena que contenga diversos poliedros. Utilice tablas de polígonos para almacenar la definición de los objetos y emplee técnicas de coherencia para evaluar los puntos a lo largo de una línea de barrido y entre una línea de barrido y la siguiente.
9.11
Diseñe un programa para mostrar las superficies visibles de un poliedro convexo utilizando el algoritmo del pintor, es decir, ordene las superficies según su profundidad y píntelas comenzando desde atrás.
9.12
Escriba un programa que utilice el método de ordenación de profundidad para mostrar las superficies visibles de cualquier objeto dado definido mediante una serie de caras planas.
9.13
Diseñe un programa de ordenación de profundidad para mostrar las superficies visibles en una escena que contenga varios poliedros.
9.14
Escriba un programa para mostrar las superficies visibles de un poliedro convexo utilizando el método del árbol BSP.
9.15
Proporcione ejemplos de situaciones en las que los dos métodos expuestos para la condición 3 del algoritmo de subdivisión de áreas no permitan identificar correctamente una superficie circundante que oculte todas las demás superficies.
9.16
Desarrolle un algoritmo que compruebe si una superficie plana dada es circundante, solapada, interior o exterior con respecto a una determinada área rectangular.
9.17
Diseñe un algoritmo para generar una representación en árbol cuádrico para las superficies visibles de un objeto, aplicando los tests de subdivisión de área para determinar los valores de los elementos del árbol cuádrico.
9.18
Diseñe un algoritmo para almacenar una representación en árbol cuádrico de un objeto dentro de un búfer de imagen.
9.19
Defina un procedimiento para mostrar las superficies visibles de un objeto descrito mediante una representación en árbol octal.
9.20
Diseñe un algoritmo para visualizar una única esfera utilizando el método de proyección de rayos.
9.21
Explique cómo pueden incorporarse los métodos de antialiasing en los diversos algoritmos de eliminación de superficies ocultas. Escriba una rutina para generar un diagrama de contorno de una superficie, dada la función de superficie/f*,^).
9.23
Desarrolle un algoritmo para delectar las secciones de línea visible en una escena comparando cada linea de la escena con cada faceta poligonal de una superficie.
9.24
Explique cómo pueden generarse imágenes alámbricas con los diversos métodos de detección de superficies visibles expuestos en este capítulo.
9.25
Diseñe un procedimiento para generar una imagen alámbrica de un poliedro en la que se muestren las aristas ocultas del objeto como lineas punteadas.
9.26
Escriba un programa para mostrar un poliedro en el que se eliminen determinadas caras seleccionadas, utilizando las funciones de eliminación de polígonos de OpenGL. A cada cara del polígono hay que asignarle un color diferente y es el usuario quien puede seleccionar una cara para su eliminación. Asimismo, el usuario debe proporcionar también como valores de entrada la posición de visualizacíón y los demás parámetros de visualización.
Ejercicios
575
9.27
Modifique el programa del ejercicio anterior para poder ver el poliedro desde cualquier posición, utilizando rutinas de búfer de profundidad en lugar de rutinas de eliminación de polígonos.
9.28
Modifique el programa del ejercicio anterior para poder especificar también como entrada el rango de profundidades y la condición de test de profundidad,
9.29
Genere una imagen alámbrica de un poliedro utilizando las funciones expuestas en la Sección 9.14.
9.30
Modifique el programa del ejercicio anterior para mostrar el poliedro utilizando la función de la intensidad con la profundidad.
9.31
Modifique el programa del ejercicio anterior para mostrar varios poliedros que estén distribuidos a diversas profundidades. El rango de variación de la intensidad con la profundidad debe configurarse según los datos de entrada proporcionados por el usuario.
glPolygonMode y glPolygonOtfset
glFogi
de variación
CAPÍTULO
10
Modelos de iluminación y métodos de representación superficial
Una escena de la película de animación por computadora Final Faniasy: The Spirits IVithin, donde se muestran los efectos de iluminación utilizados para simular la explosión de un espíritu. {Cortesía de Square Pietures, Inc & 2001 FFFP Todos ios derechos reservados.)
1II. 1 Fuentes luminosas
1 0 . 1 2 Modelo de iluminación de radiosidad
10.2 Efectos de iluminación superficial
1 0 . 1 3 Mapeado de entorno
10.3 Modelos básicos de iluminación
1 0 . 1 4 Mapeado de fotones
10.4 Superficies transparentes
1 0 . 1 5 Adición de detalles a las superficies
1 0 . 5 Efectos atmosféricos 1 0 . 6 Sombras
1 0 . 1 6 Modelado de los detalles superficiales mediante polígonos
1 0 . 7 Parámetros de la cámara
1 0 . 1 7 Mapeado de texturas
1 0 . 8 Visuali/ación de la intensidad de la luz
1 0 . 1 8 Mapeado de relieve
1 0 . 9 Patrones de semitono y técnicas de alealori/ación
1 0 . 1 9 Mapeado del sistema de referencia
1 0 . 1 0 Métodos de representación de polígonos
1 0 . 2 0 funciones OpenGL de iluminación y representación de superficies
1 0 . 1 1 Métodos de trazado de rayos
1 0 . 2 1 Funciones de texturas OpenGL 10.22
Resumen
Pueden obtenerse imágenes realistas de una escena generando proyecciones en perspectiva de los objetos y aplicando electos de iluminación naturales a las superficies visibles. Se utiliza un modelo de iluminación, también denominado modelo de sombreado, para calcular el color de cada posición iluminada en la superficie de un objeto. Un método de representación superficial utiliza los cálculos de color del modelo de iluminación para determinar los colores de los píxeles para todas las posiciones proyectadas de una escena. El modelo de iluminación puede aplicarse a cada posición de proyección, o bien puede llevarse a cabo la representación de la superficie interpolando los colores de las superficies a partir de un pequeño conjunto de cálculos relativos al modelo de iluminación. Los algoritmos del espacio de imagen basados en las líneas de barrido utilizan normalmente esquemas de interpolación, mientras que los algoritmos de trazado de rayos pueden invocar el modelo de iluminación para cada posición de píxel. Algunas veces, se denomina procedimientos de representación de superficie a los métodos de sombreado que calculan los colores de las superficies utilizando el modelo de sombreado, pero esto puede llevar a cierta confusión entre ambos términos. Para evitar posibles malas interpretaciones debido al uso de tenninología similar, denominaremos modelo de iluminación al modelo utilizado para calcular la intensidad luminosa en cada punto de una superficie, y emplearemos el ténnino representación superficial para referirnos a un procedimiento mediante el cual se aplica un modelo de iluminación cotí el fin de obtener los colores de píxel para todas las posiciones proyectadas de la superficie. Entre otras cosas, el fotorrealismo en los gráficos por computadora requiere dos elementos: representaciones precisas de las propiedades de las superficies y una buena descripción física de los efectos de iluminación en la escena. Estos efectos de iluminación de las superficies incluyen la reflexión de la luz, la transparencia, las texturas de las superficies y las sombras. En general, el modelado de los efectos de iluminación que podemos observar sobre un objeto es un proceso muy complejo, en el que intervienen principios tanto de la física como de la psicología. Fundamentalmente, los efectos de iluminación se describen mediante modelos que tienen en cuenta la interacción de la energía electromagnética con las superficies de los objetos de la escena. Una vez que los rayos luminosos alcanzan nuestros ojos, se ponen en marcha determinados procesos de percepción que son los que dictan lo que realmente «vemos». Los modelos físicos de iluminación tienen en cuenta una serie de factores, como las propiedades de los materiales, las posiciones de los objetos en relación con las fuentes de ilumina-
578
CAPÍTULO 10 Modelos de iluminarían y métodos de representación superficial
eión y con otros objetos y las características de las fuentes luminosas. Los objetos pueden estar compuestos de materiales opacos, o bien pueden ser más o menos transparentes. Además, pueden tener superficies brillan!cs o mates, y exhibir diversos patrones de textura superficial. Pueden utilizarse fuentes luminosas, de formas, colores y posiciones variables para iluminar una escena. Dados los parámetros de las propiedades ópticas de las superficies, dadas las posiciones relativas de las superficies dentro de una escena, dados el color y las posiciones de las fuentes luminosas, dadas las características de dichas fuentes y dadas la posición y la orientación del plano de visualización, se utilizan los modelos de iluminación para calcular la intensidad de la luz proyectada desde una posición concreta de la superficie en una dirección de visualización especificada. Los modelos de iluminación en infografia son a menudo aproximaciones de la leyes físicas que describen los efectos de iluminación de una superficie. Para reducir los cálculos, la mayoría de los paquetes utilizan modelos empíricos basados en cálculos de fotometría simplificados. Otros modelos más precisos, como el algoritmo de radiosidad, calculan las intensidades luminosas considerando la propagación de la energía radiante entre las fuentes luminosas y las diversas superficies de una escena. En las siguientes secciones, vamos primero a echar un vistazo a los modelos de iluminación básicos que más a menudo se utilizan en los sistemas infográlicos, para pasar después a analizar otros métodos más precisos, pero más complejos, de determinación de la apariencia de las superficies iluminadas. Exploraremos también los diversos algoritmos de representación superficial que pueden utilizarse para aplicar los modelos de iluminación, con el fin de obtener imágenes de calidad de escenas naturales.
10.1 FUENTES LUMINOSAS Cualquier objeto que emita energía radiante es una f u e n t e l u m i n o s a que contribuye a los efectos de iluminación que afectan a otros objetos de la escena. Podemos modelar fuentes luminosas con diversas formas y características, y la mayoría de los emisores sirven únicamente como fuente de iluminación de una escena. Sin embargo, en algunas aplicaciones, puede que nos interese crear un objeto que sea a la vez una fuente luminosa y un refiector de luz. Por ejemplo, un globo de plástico que rodee a una bombilla emite luz, pero también los rayos luminosos procedentes de otras fuentes se reflejan en la superficie del globo. También podríamos modelar el globo como una superficie semitransparente dispuesta en torno a una fuente luminosa, pero para algunos objetos, como por ejemplo un panel fluorescente de gran tamaño, puede que sea más conveniente describir la superficie simplemente como una combinación de un emisor y un refiector. Las fuentes luminosas pueden definirse con diversas propiedades. Podemos definir su posición, el color de la luz emitida, la dirección de emisión y la forma de la fuente. Si la fuente es también una superficie reflectora de la luz, necesitaremos indicar sus propiedades de rellectividad. Además, podemos definir una fuente luminosa que emita diferentes colores en diferentes direcciones. Por ejemplo, se podría especificar una fuente que emitiera luz roja por uno de sus lados y luz verde por el otro. En la mayoría de las aplicaciones, y particularmente en los gráficos en tiempo real, se utiliza un modelo simple de fuentes luminosas para evitar complicar demasiado los cálculos. Las propiedades de emisión de luz se definen utilizando un único valor para cada uno de los componentes de color RGB, que se corresponde con la «intensidad» de dicha componente de color. Los parámetros de color y los modelos de fuentes de iluminación se analizan con más detalle en el Capítulo 12.
Fuentes luminosas puntuales El modelo más simple para un objeto que emite energía radiante es la fuente luminosa p u n t u a l de un único color, el cual se especifica mediante las tres componentes RGB. Podemos definir una fuente puntual para una escena indicando su posición y el color de la luz emitida. Como se muestra en la figura 10.1, los rayos luminosos se generan según una serie de trayectorias radialmente divergentes a partir de esa única fuente puntual monocromática. Este modelo de fuente luminosa constituye una aproximación razonable para aquellas fuentes cuyas dimensiones sean pequeñas comparadas con el tamaño de los objetos de la escena. También pode-
10.1 Fuentes luminosas
579
FIGURA 10.1. Trayectorias divergentes de los rayos a partir de una fuente luminosa puntual. mos simular fuentes de mayor tamaño mediante emisores puntuales si dichas fuentes no están demasiado próximas a la escena. Utilizamos la posición de una fuente puntual dentro de un modelo de imagen para determinar qué objetos de la escena se ven iluminados por dicha fuente y para calcular la dirección de los rayos luminosos cuando éstos inciden sobre una posición seleccionada de la superficie del objeto.
Fuentes luminosas infinitamente distantes Una fuente luminosa de gran tamaño, como por ejemplo el Sol, pero que esté muy lejos de una escena puede también aproximarse como un emisor puntual, aunque en este caso la variación que existe en sus efectos direccionales es muy pequeña. Por contrasté con una fuente luminosa situada en mitad de una escena, que ilumina los objetos situados en todas las direcciones con respecto a la fuente, las cuentas remotas iluminan la escena desde una única dirección, El trayecto del rayo luminoso que va desde una fuente distante hasta cualquier posición de la escena es prácticamente constante, como se ilustra en la Figura 10.2. Podemos simular una fuente luminosa infinitamente distante asignándola un valor de color y una dirección fija para los rayos luminosos que emanan de la fuente. En los cálculos de iluminación sólo hace falta conocer el color de la fuente luminosa y el vector correspondiente a la dirección de emisión, siendo completamente irrelevanle cuál sea la posición de la fuente.
Atenuación radial de la intensidad A medida que la energía radiante de una fuente luminosa viaja a través del espacio, su amplitud a cualquier distancia c/¡ de la fuente se atenúa según el factor l/¿/, . Esto significa que una superficie próxima a la fuente luminosa recibe una intensidad de luz incidente mayor que otra superficie más distante. Por tanto, para producir efectos de iluminación realistas, tenemos que tener en cuenta esta atenuación de la intensidad. En caso contrario, todas las superficies serían iluminadas con la misma intensidad por las fuentes luminosas y podrían obtenerse, como resultado efectos deseables en las imágenes. Por ejemplo, si dos superficies con los mismos :
FIGURA 10.2. Los rayos luminosos procedentes de una fuente infinitamente distante iluminan a los objetos según una serie de trayectos prácticamente paralelos.
580
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
parámetros ópticos se proyectan sobre posiciones que se solapen, serían indistinguibles la una de la otra. Como consecuencia, independientemente de sus distancias relativas con respecto a la fuente luminosa, las dos superficies parecerían ser una sola. En la práctica, sin embargo, utilizar un factor de atenuación de \/d¡ con una fuente puntual no siempre produce imágenes realistas. El factor \ld¡ tiende a producir una variación excesiva de la intensidad para objetos que se encuentren próximos a la fuente luminosa, y muy poca variación cuando d¡ es grande. Esto se debe a que las fuentes luminosas reales no son puntos infinitesimales, e iluminar una escena con emisores puntales es sólo una aproximación simple de los verdaderos efectos de iluminación. Para generar imágenes más realistas utilizando fuentes puntuales, podemos atenuar las intensidades luminosas con una función cuadrática inversa de d¡ que incluya un témiino lineal:
'£im* Ü) = —
! ,
(¡0.1)
j2
Los valores numéricos de los coelicienles a , &j y a pueden entonces ajustarse para producir unos efectos de atenuación óptimos. Por ejemplo, podemos asignar un gran valor a a cuando A es muy pequeña con el fin de prevenir q t i e / ^ ( ¿ / ) se haga demasiado grande. Como opción adicional, a menudo disponible en muchos paquetes de gráficos, puede asignarse un conjunto diferente de valores a los coeficientes de atenuación de cada fuente luminosa puntual de la escena. 0
2
0
d;)I|cn
/
No podemos aplicar la Ecuación 10.1 de cálculo de la atenuación de la intensidad a una fuente puntual que esté situada en el «infinito», porque la distancia a la fuente luminosa es indeterminada. Asimismo, todos los puntos de la escena están a una distancia prácticamente igual de las fuentes muy lejanas. Con el fin de tener en cuenta tanto las fuentes luminosas remotas como las locales, podemos expresar la función de atenuación de la intensidad como: LO,
si la fuente está en el infinito
/),rail Hilen !
a +a d, íi
i
si la fuente es local
+a d¡ 7
Fuentes de luz direccionales y efectos de foco Una fuente luminosa local puede modificarse fácilmente para que actúe como un foco, generando un ha/ luminoso direccional. Si un objeto está fuera de los límites direccionales de la fuente luminosa, lo excluiremos de los cálculos de iluminación correspondientes a dicha fuente. Una forma de definir una fuente direccional luminosa consiste en asignarla un vector de dirección y un límite angular 0, medido con respecto a dicho vector de dirección, además de definir la posición en color de la fuente. Esto especifica una región cónica del espacio en la que el vector de la fuente luminosa está dirigido según el eje del cono (Figura 10.3). De esta forma, podríamos modelar una fuente luminosa puntual multicolor utilizando múltiples vectores de dirección y un color de emisión diferente para cada una de esas direcciones. Si denominamos V , ¡ al vector unitario que define la dirección de la fuente luminosa y V j al vector unitario que apunta desde la posición de la fuente hasta la posición de un objeto, tendremos que: gh(
oh
donde el ángulo a es la distancia angular del objeto con respecto al vector que indica la dirección de la fuente. Si restringimos la extensión angular de cualquier cono luminoso de modo que 0° < 0¡ < 90°, entonces el objeto estará dentro del rango de iluminación del foco si eos a > eos 0,, como se muestra en la Figura 10.4. Por el contrario, si V • V,¡ . < eos 0,, el objeto estará fuera del cono de luz. o h j
10.1 Fuentes luminosas
581
Fuente luminosa FIGURA 10.4. Un objeto iluminado por una fuente luminosa puntual dircccional.
Atenuación angular de la intensidad Para una fuente luminosa dircccional, podemos atenuar angularmcnte la intensidad de la luz de la fuente, además de atenuarla radialmentc con respecto a la posición de la fuente puntual. Esto nos permite simular un cono de luz que sea más intenso a lo largo del eje del cono, decreciendo la intensidad a medida que nos alejamos de dicho eje. Una función comúnmente utilizada para la atenuación angular de la intensidad de una fuente luminosa direccional es: U W=c o ^ ,
O»<0<0
(
,
,
U
)
582
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.5. Un objeto iluminado por una fuente luminosa de gran tamaño situada muy cerca.
FIGURA 10.6. Efectos de iluminación de estudio producidos con el modelo de Warn, utilizando cinco fuentes luminosas complejas con el fin de iluminar un Chevrolet Cámaro. (Cortesía de DavidR. Warn, General Motors Research Laboratories,)
i
donde ni exponente de atenuación a¡ se le asigna algún valor positivo y el ángulo <¡> se mide con respecto al eje del cono. A lo largo del eje del cono, 0 = 0 y_4 (0) 1.0. Cuanto mayor sea el valor del exponente de atenuación a más pequeño será el valor de la función de atenuación angular de la intensidad para un cierto valor del ángulo
ngimen
Jt
U g h !
ob
1.0,
si la fuente no es un foco
0.0,
si V . . • V = c o s « < eos A (el objeto está fuera del cono del foco) h
CVay • % P > m
en caso contrario
Fuentes luminosas complejas y el modelo de Warn Cuando necesitemos incluir una fuente luminosa de gran tamaño en una posición próxima a los objetos de una escena, como por ejemplo la gran lámpara de neón de la Figura 10.5. Podemos aproximarla mediante una superficie emisora de luz. Una forma de hacer esto consiste en modelar la superficie luminosa como una cua-
10.2 Efectos de iluminación superficial
583
tlrícula de emisores puntuales direccionales. Podemos definir la dirección de las fuentes puntuales de modo que los objetos situados detrás de la superficie emisora de luz no sean iluminados. Y también podemos incluir otros controles para restringir la dirección de la luz emitida en las proximidades de los bordes de la fuente. El modelo de Warn proporciona un método para producir efectos de iluminación de estudio utilizando conjuntos de emisores puntuales con diversos parámetros que pretenden simular las pantallas, controles de foco y demás aparatos utilizados por los fotógrafos profesionales. Los efectos de foco se consiguen mediante los conos de iluminación que antes hemos presentado, mientras que las pantallas proporcionan controles direccionales adicionales. Por ejemplo, pueden especificarse dos pantallas para cada una de las direcciones A, y y z con el fin de restringir aún más el trayecto de los rayos luminosos emitidos. Esta simulación de ftientes luminosas está implementada en algunos paquetes gráficos, y la figura 10.6 ilustra los efectos de iluminación que pueden conseguirse mediante el modelo de Warn.
10.2 EFECTOS DE ILUMINACIÓN SUPERFICIAL Un modelo de iluminación calcula los efectos luminosos sobre una superficie utilizando las distintas propiedades ópticas que se hayan asignado a dicha superficie. Esas propiedades incluyen el grado de transparencia, los coeficientes de reflexión del color y diversos parámetros relativos a la textura de la superficie. Cuando la luz incide sobre una superficie opaca, parte de la misma se refleja y parle se absorbe. La cantidad de luz incidente reflejada por la superficie dependerá del tipo de material. Los materiales brillantes reflejan un mayor porcentaje de la luz incidente, mientras que las superficies mates absorben más la luz. Para una superficie transparente, parte de la luz incidente también se transmite a través del material. Las superficies rugosas o granulosas tienden a dispersar la luz reflejada en todas las direcciones. Esta luz dispersada se denomina reflexión difusa. Una superficie mate muy rugosa produce principalmente reflexiones difusas, de modo que la superficie parece igualmente brillante desde cualquier ángulo. La figura 10.7 ilustra la dispersión difusa de la luz en una superficie. Lo que denominamos el color de un objeto es el color de la reflexión difusa cuando el objeto se ilumina con luz blanca, que está compuesta de una combinación de todos los colores. LJn objeto azul, refleja la componente azul de la luz blanca y absorbe todas las demás componentes de color. Si el objeto azul se contempla bajo una luz roja, parecerá negro, ya que toda la luz incidente será absorbida. Además de la dispersión difusa de la luz, parte de la luz reflejada se concentra en lo que se denomina un resalte, llamándose a este fenómeno reflexión especular. Este efecto de resalte es más pronunciado en las superficies brillantes que en las mates. Podemos ver la reflexión especular cuando observamos una superficie brillante iluminada, como por ejemplo un trozo de metal pulido, una manzana o la frente de una persona, pero sólo podemos percibir esa reflexión especular cuando contemplamos la superficie desde una dirección concreta. En la figura 10.8 se muestra una representación del fenómeno de la reflexión especular.
\W/ FIGURA 10.7. Reflexiones difusas en una superficie.
FIGURA 10.8. Reflexión especular superpuesta sobre los vectores de reflexión difusa.
584
CAPÍTULO 10
Modelos de Humillación y métodos de representación superficial
FIGURA 10.9. Los decios de iluminación superficial se producen mediante una combinación de la iluminación procedente de fuentes luminosas y de las reflexiones producidas en otras superficies. Otro factor que hay que considerar en los modelos de iluminación es la luz de fondo o luz ambiental de la escena. Una superficie que no esté directamente expuesta a una fuente luminosa puede seguir siendo visible debido a la luz reflejada en los objetos cercanos que sí están iluminados. Así, la luz ambiente de una escena es el efecto de iluminación producido por la luz reflejada en las diversas superficies de la escena. La Figura 10.9 ilustra este efecto de iluminación de fondo. La luz total reflejada por una superficie es la suma de las contribuciones de las fuentes luminosas y de la luz rellejada por otros objetos iluminados.
10.3 MODELOS BÁSICOS DE ILUMINACIÓN Los modelos más precisos de iluminación superficial calculan los resultados de las interacciones entre la energía radiante incidente y la composición material de un objeto. Para simplificar los cálculos de iluminación superficial, podemos utilizar representaciones aproximadas de los procesos físicos que producen los efectos de iluminación expuestos en la sección anterior. El modelo empírico descrito en esta sección produce unos resultados razonablemente buenos y es el que se implementa en la mayoría de los sistemas gráficos. Los objetos emisores de luz en un modelo básico de iluminación suelen estar limitados, generalmente,^ fuentes puntuales. Sin embargo, muchos paquetes gráficos proporcionan funciones adicionales para incluir fuentes direccionales (focos) y fuentes luminosas complejas.
Luz ambiente En nuestro modelo básico de iluminación, podemos incorporar la luz de fondo definiendo un nivel de brillo general para la escena. Esto produce una iluminación ambiente unifonne que es igual para todos los objetos y que aproxima las reflexiones difusas globales correspondientes a las diversas superficies iluminadas. Suponiendo que estemos describiendo únicamente efectos de iluminación monocromáticos, como por ejemplo escalas de grises, designaríamos el nivel de la luz ambiente en una escena mediante un parámetro de intensidad I . Cada superficie de la escena se verá entonces iluminada por esta luz de fondo. Las reflexiones producidas por la iluminación mediante la luz ambiente son sólo una forma de reflexión difusa, y son independientes de la dirección de visualización y de la orientación espacial de las superficies. Sin embargo, la cantidad de luz ambiente incidente que se refleje dependerá de las propiedades ópticas de las superficies, que determinan qué parte de la energía incidente se refleja y qué parte se absorbe. a
Reflexión difusa Podemos modelar la^j£ilexk»nesjjifusas de una superficie asumierujo^uejajuz^ÁncMeiüe^e__di spej^_c^ igual intensidad en todas las direcciones, independientemente de la posición de visualización. Tales superliJ
10.3 Modelos básicos de iluminación
585
cies se denominan reflectores difusos ideales. Tambiénse les denomina reflectores lambertianos, porque la energía luminosa radiante reflejada por cualquier punto de la superficie se calcula mediante la ley del coseno de LambertTEsta leyestábjece que la cantidad dè^enèrgia radiante procedente de cualquier pequeña área"3e s u p e r f i c i e ^ en una dirección > relativa a la normal a la "superficie es proporcional a eos <¡>^ (Figura 10.10). La^inSnsjdàd de ta luz en esta dirección puede calcularse dividiendo la magnitud de la energía radiante por unidad de tiempo entre la proyección de ese área superficial en la dirección de radiación: Y
e n e r
Intensidad -
a
o r
S ' P i a n t e P unidad d e tiempo área proyectada {10,6)
dA cos0,
v
= constarne Así, para la reflexión lambertiana, la intensidad de la luz es la misma en todas las direcciones de visualizaron. Suponiendo que haya que tratar a todas las superficies como un reflector difuso ideal_(lambertiano), podemos definir un parámetro Ampara cada superficie que determine la fracción de la luz incidente que hay que dispersar en forma de reflexiones difusas. Este parámetro se denomina coeficiente de reflexión difusa o reflectividad difusa. La reflexión difusa en todas las direcciones se da entonces una constante cuyo valor es igual a la intensidad de la luz incidente multiplicada por el coeficiente de reflexión difusa. Para una fuente luminosa monocromática, al parámetro k se le asigna un valor constante en el intervalo 0.0 a 1.0, de acuerdo con las propiedades de reflexión que queramos que la superficie tenga^ Para una superficie altamente reflectante, asignaremos a k un valor próximo a 1.0. Esto produce una superficie más brillante, en la que la intensidad de la luz reflejada estará más próxima a la de la luz incidente. Si queremos simular una superficie que absorba la mayor parte de la luz incidente, asignaremos a la reflectividad un valor próximo a 0.0. d
d
Para los efectos de iluminación de fondo, podemos asumir que todas las superficies están completamente iluminadas por la luz ambiente ¡ que hayamos asignado a la escena. Por tanto, la contribución de la luz ambiente a la reflexión difusa en cualquier punto de una superficie es simplemente: M
La luz ambiente sola, sin embargo, produce un sombreado plano y poco interesante de las supefflcies (Figura 10.23(b)), por lo que raramente se representan las escenas utilizando únicamente luz ambiente. Al menos se suele incluir una fuente luminosa en la escena, a menudo definida como fuente puntual situada en la posición de visualización. Cuando se ilumina una superficie mediante una fuente luminosa de intensidad la cantidad de luz incidente dependerá de la orientación de la superficie en relación con la dirección de la fuente luminosa. Una superficie que esté orientada en perpendicular a la dirección de iluminación recibirá más luz de la fuente que otra superficie que forme un ángulo oblicuo con la dirección de la luz incidente. Este efecto de iluminación puede observarse sobre una hoja de papel blanco que se coloque en paralelo a una ventana iluminada por el
Dirección de la energía radiante
FIGURA 10.10. La energía radiante de un elemenio de área superficial dA en la dirección 0 relativa a la normal a la superficie es proporcional a eos V
586
CAPÍTU LO
10
y
Modelos de iluminación
métodos de representación superficial
FIGURA 10.11. Una superficie perpendicular a la dirección de la luz incidente (a) estará más iluminada que una superficie de igual (amaño que forme un ángulo oblicuo (b) con la dirección de la luz. Sol. Al girar lentamente la hoja de papel con respecto a la dirección de la ventana, el brillo de la superficie disminuye. La Figura I0.11 ilustra este efecto, mostrando un haz de rayos luminosos que inciden sobre dos superficies planas de igual área que tienen diferente orientación espacial en relación con la dirección de iluminación de una fuente distante (rayos entrantes paralelos). En la Figura 10.11 podemos ver que el número de rayos luminosos que intersectan un elemento de superficie es proporcional al área de la proyección de la superficie en perpendicular a la dirección de la luz incidente. Si denominamos 9 al ángulo de incidencia entre los rayos luminosos y la normal de la superficie (Figura 10.12), entonces el área proyectada de un elemento de superficie en perpendicular a la dirección de la luz será proporcional a eos 9. Por tanto, podemos modelar la cantidad de luz incidente sobre una superficie para una fuente de intensidad l¡ mediante la fórmula:
Utilizando la Ecuación 10.8, podemos modelar las reflexiones difusas para una fuente luminosa con intensidad // utilizando la fórmula:, '/,
=
Kl
'/.inciden!
= ^/,cos0
(10.9)
Cuando la luz que incide desde la fuente es perpendicular a la superficie en un punto concreto, 6 — 90° y '/ditr $ roed ida que se incrementa el ángulo de incidencia, decrece la iluminación debida a esa fuente luminosa. Además, una superficie se verá iluminada por una fuente puntual únicamente si el ángulo de incidencia está comprendido entre 0 y 90° (es decir, si eos 0 e s t á en el intervalo que va de 0.0 a 1.0). Cuando eos 9 < 0.0, la fuente luminosa estará situada detrás de la superficie. En cualquier posición de la superficie, podemos designar al vector unitario normal como N y al vector unitario en la dirección de una fuente puntual como L, como en la Figura 10.13. Entonces, eos 9 = N • L y la ecuación de reflexión difusa para iluminación mediante una única fuente puntual en una determinada posición de la superficie puede expresarse en la forma: =
o
/^(N'L),
siN-L>0
0,0,
siNL<0
El vector unitario L en dirección a una fuente luminosa puntual cercana se calcula utilizando las coordenadas del punto de la superficie y de la fuente luminosa: P L
=
P
sourcc- surf
p - P | " MHirce * surf
N
FIGURA 10.12. Un área iluminada A proyectada en perpendicular al trayecto de los rayos de luz incidentes. Esta proyección perpendicular tiene un área igual a A eos 6.
10.3 Modelos básicos de iluminación
587
A la fuente luminosa
FIGURA 10.13. Ángulo de incidencia 0 entre el vector unitario L en dirección de la fuente luminosa y el vector unitario N normal a la superficie en una determinada posición. Sin embargo, una fuente iuminosa situada en el «infinito» no tiene posición asignada, sino únicamente una dirección de propagación. En dicho caso, utilizaremos como vector de dirección L el negado del vector que define la dirección de emisión de la fuente luminosa. La Figura 10.14 ilustra la aplicación de la Ecuación 10.10 a una serie de posiciones sobre la superficie de una esfera, utilizando valores seleccionados del parámetro k comprendidos entre 0 y 1. Para k = 0, no se refleja nada de luz y la superficie del objeto parece negra. Los valores crecientes de k incrementan la intensidad de las reflexiones difusas, produciendo todos de gris cada vez más claros. A cada posición de píxel proyectada de la superficie se le asigna un valor de intensidad que se calcula mediante la ecuación de reflexión difusa. Las representaciones superficiales de esta figura ilustran la iluminación mediante una única fuente puntual, sin ningún efecto de iluminación adicional. Esto es lo que cabría esperar ver si apuntáramos con una linterna muy pequeña hacia un objeto en una habitación completamente oscura. En las escenas generales, sin embargo, existirán reflexiones superficiales debidas a luz ambiente, además de los efectos de iluminación producidos por la fuente luminosa. Podemos combinar los cálculos de intensidad debidos a la luz ambiente y a las fuentes puntuales con el fin de obtener una expresión para la reflexión difusa total en cada posición de una superficie. Además, muchos paquetes gráficos incluyen un coeficiente de reflexión ambiente k que puede asignarse a cada superficie para modificar la intensidad l de la luz ambiente. Esto simplemente nos proporciona un parámetro adicional para ajustar los efectos de iluminación de nuestro modelo empírico. Utilizando el modelo k , podemos escribir la ecuación total de reflexión difusa para una única fuente puntual en la forma d
d
á
a
a
a
donde k y k dependen de las propiedades de los materiales de la superficie y tienen valores comprendidos en el rango que va de 0 a 1.0 para efectos de iluminación monocromáticos. La Figura 10.15 muestra una t¡
(¡
kd,
0.0
0.2
0.4
con
ka
*
0.0
0.6
0.8
1.0
FIGURA 10.14. Reflexiones difusas en una superficie esférica iluminada mediante una fuente luminosa puntual de color blanco, con valores del coeficiente de reflectividad difusa en el intervalo 0 < k < I. d
588
CAPÍTULO 10
Modelo* de iluminación y métodos de representación superficial
FIGURA 10.15. Reflexiones difusas en una superficie esférica iluminada con una luz ambiente de color gris oscuro y una fuente puntual de color blanco, utilizando cinco valores para k y ¿¿comprendidos entre 0.0 y LO. (l
esfera con intensidades superficiales calculadas según la Ecuación 10.12, para valores de los parámetros k y k comprendidos cnlre 0 y 1.0. Q
á
Reflexión especular y modelo de Phong El resalte o reflexión especular que podemos ver en las superficies brillantes es el resultado de una reflexión total, o casi total, de la luz incidente en una región concentrada alrededor del ángulo de reflexión especular. La Figura 10.16 muestra la dirección de reflexión especular para una determinada posición de una superficie iluminada. El ángulo de reflexión especular es igual al ángulo de la luz incidente, midiendo ambos ángulos en lados opuestos del vector unitario N_ normal ajajujperficie. En esta figura, R representa el vector unitario en la dirección de la reflexión especular ideal, L es el vector unitario dirigido hacia la fuente luminosa puntual y V es el vector unitario que apunta hacia el observador desde la posición seleccionada de la superficie. El ángulo <¡> es el ángulo de visualización relativo a la dirección de reflexión especular R. Para un reflector ideal (un espejo perfecto), la luz incidente se refleja sólo en la dirección de reflexión especular, y sólo podríamos ver la luz reflejada cuando los vectores V y R coincidieran (<¡> = 0). Todos los objetos que no sean reflectores ideales exhiben reflexiones especulares en un rango finito de posiciones de visualización en t o m o al vector R. Las superficies brillantes tienen un rango de reflexión especular estrecho, mientras que las superficies males tienen un rango de reflexión más amplio. Un modelo empírico para el cálculo de reflexión especular, desarrollado por Phong Bui Tuong y denominado modelo de reflexión especular de Phong o simplemente modelo de Phong. define las intensidad de la reflexión especular como proporcionales a cos^v 0. Al ángulo (j> pueden asignársele valores en el rango de 0 a 90°, de modo que eos (f> varía de 0 a 1.0. El valor asignado al expolíente de reflexión especular n estará determinado por el tipo de superficie que queramos mostrar. Una superficie muy brillante se modelará con un valor de n muy o
s
s
10.3 Modelos básicos de iluminación
589
FIGURA 10.16. El ángulo de reflexión especular es igual al ángulo de incidencia 6.
Superfìcie brillarne («..grande)
FIGURA 10.17. Modelado de las reflexiones especulares (área sombreada) mediante el parámetro n .
Superfìcie mate («,pequeña)
grande (por ejemplo, 100 o más), mientras que los valores más pequeños (hasta como mínimo 1) se utilizan para las superficies más males. Para un reflector perfecto, 'f$i es infinita. Para una superficie rugosa, a /? se le asigna un valor próximo a 1. Las Figuras LO. 17 y 10.18 muestran el efecto de n sobre el rango angular para el cual podemos esperar ver reflexiones especulares. La intensidad de la reflexión especular depende de las propiedades de los materiales de la superficie y del ángulo de incidencia, así como de otros factores tales como la polarización y el color de la luz incidente. Podemos modelar aproximadamente las variaciones de intensidad especular monocromática utilizando un coeficiente de reflexión especular, W(0), para cada superficie. La Figura 10.19 muestra la variación general de W(B) en el rango que va de 0 = 0° a 0 = 90° para unos cuantos materiales. En general, ¡V(6) tiende a incrementarse a medida que aumenta el ángulo de incidencia. Para 6 = 90°, toda la luz incidente se refleja (W(&) = I). La variación de la intensidad especular con respecto al ángulo de incidencia se describe mediante las leyes de Fresnel de la reflexión. Utilizando la función de reflexión espectral W(6), podemos escribir el modelo de reflexión especular de Phong de la forma siguiente; v
s
^^W»p#f
{ / ( U 3 )
donde //-es la intensidad de la fuente luminosa y 0 es el ángulo de visualización relativo a la dirección de reflexión especular R. Como puede verse en la Figura 10.19, los materiales transparentes, como el cristal, exhiben reflexiones especulares apreciables únicamente cuando 6 se aproxima a 90". Para 0 = 0 , sólo se refleja aproximadamente el 4 por ciento de la luz que incide sobre una superficie de cristal, y para casi todo el rango de valores de 0, la intensidad reflejada es inferior al 10 por ciento de la intensidad incidente. Pero para muchos materiales opacos, la reflexión especular es prácticamente constante para todos los ángulos de incidencia. En este caso, podemos modelar razonablemente los efectos especulares sustituyendo W(6) por un coeficiente constante de reflexión especular k . Entonces, simplemente asignamos a k algún valor en el rango de 0 a LO para cada superficie. s
s
Puesto que V y R son vectores unitarios en las direcciones de visualización y de reflexión especular, podemos calcular el valor de eos 0 mediante el producto escalar V • R. Además, no se generará ningún efecto especular para una superficie si V y L se encuentran en el mismo lado del vector normal N, o si la fuente luminosa está situada detrás de la superficie. Así, asumiendo que el coeficiente de reflexión especular es constante para cada material, podemos detenninar la intensidad de la reflexión especular debida a una fuente de iluminación puntual sobre una posición de la superficie mediante la fórmula:
590
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
ees <> t
FIGURA 10.18. Gráficas de cos^v
\kJ,(\R)'\
siV-R>0
y
N-LX)
=
i 10.14) 0.0,
siVR<ü
o
N-LSO
La dirección de R, el vector de refiexión, puede calcularse a partir de las direcciones de los vectores L y N. Como puede verse en la Figura 10.20, la proyección L sobre la dirección del vector normal tiene una magnitud igual al producto escalar N • L¿ que también es igual a la magnitud de la proyección del vector unitario R sobre la dirección de N.
Por tamo, a partir de este diagrama, vemos que: R + L = (2N - L)N y el vector de refiexión especular puede calcularse como: R = (2N-L)N-L
(10.15)
La Figura 10.21 ilustra el fenómeno de la refiexión especular para diversos valores de k y « en una esfera iluminada mediante una única fuente puntual. s
0
10.3 Modelos básicos de iluminación
591
FIGURA 10.19. Variación aproximada del coeficiente de reflexión especular para diferentes materiales, en función del ángulo de incidencia.
FIGURA 10.20. I a proyección de L o R sobre la dirección del vector normal N tiene una magnitud igual a N • L.
O
30
0.30
0.10
lo
Sí
H
120
«xpcriniiC
FIGURA 10.21. Reflexiones especulares en una superficie esférica para diversos valores de los parámetros especulares, utilizando una única fuente luminosa. Para calcular V, utilizamos la posición de la superficie y la posición de visualización, de la misma forma que obteníamos el vector unitario L (Ecuación 10.11). Pero si se va a utilizar una dirección de visualización lija para todas las posiciones de una escena, podemos hacer V — (0.0, 0.0, 1.0), que es un vector unitario en la dirección z positiva. Los cálculos especulares requieren menos tiempo utilizando un valor de V constante, aunque las imágenes no son tan realistas. Puede obtenerse un modelo de Phong algo más simple utilizando el vector medio H entre L y V para calcular el rango de reflexiones especulares. Si sustituimos V • R en el modelo de Phong por el producto escalar N • H, esto simplemente sustituye el cálculo empírico eos <¡> por el cálculo empírico eos a (Figura 10.22). El vector medio se obtiene como;
592
CAPÍTULO 10
Modelos de iluminación y melados de representación superficial
FIGURA 10.22. Vcclor medio II según la bisectriz del ángulo formado por L y V.
H =
m m
¡ITV1
Para superficies no planas, N • H requiere menos cálculos que V • R, porque el cálculo de R en cada punto de la superficie implica al vector variable N. Asimismo, si tanto el observador como la fuente luminosa están lo suficientemente lejos de la superficie, los vectores V y L son constantes, por lo que también H será constante para todos los puntos de la superficie. Si el ángulo H y N es superior a 90°, N • H será negativo y asignaremos el valor 0.0 a la contribución correspondiente a la reflexión especular. El vector H representa la dirección que produciría una reflexión especular máxima de la superficie en la dirección de visualización, para una posición dada de una fuente luminosa puntual. Por esta razón, H se denomina en ocasiones dirección de orientación de la superficie para máximo resalte. Asimismo, si el vector V es coplanar con los vectores L y R (y por tanto con N), el ángulo a tiene el valor ^ 2 . Cuando V, L y N no son coplanares, a > 0/2, dependiendo de la relación espacial de los tres vectores.
Reflexiones difusa y especular combinadas Para una única fuente luminosa puntual, podemos modelar las reflexiones difusa y especular combinadas para una posición de una superficie iluminada mediante la fórmula:
= ^/ +^/ (N.L)+ ( í
/
V;(N-Hr
La superficie sólo estará iluminada por la luz ambiente cuando la fuente luminosa esté detrás de la superficie, y no habrá efectos especulares si V y L se encuentran en el mismo lado del vector normal N. La Figura 10.23 ilustra los efectos de iluminación superficial producidos por los diversos términos de la Ecuación 10.17.
Reflexiones especular y difusa para múltiples fuentes luminosas Podemos colocar cualquier número de fuentes luminosas que deseemos en una escena. Para múltiples fuentes puntuales, calculamos las reflexiones difusa y especular como la suma de las contribuciones debidas a las diversas fuentes: n
N
1
= K'„ + % ', IK < • L) + *,(N •H)" 1
(¡0.18)
Emisión de luz superficial _ Algunas superficies en una escena pueden emitir luz, además de reflejar la luz procedente de otras faenjg^. Por ejemplo, una escena de una habitación puede contener lámparas, mientras que una escena nocturna de
(d)
(c) \
FIGURA 10.23. Una escena alámbrica (a) se muestra en (b) utilizando únicamente luz ambiente, con un color distinto para cada objeto. Las reflexiones difusas resultantes de la iluminación con luz ambiente y una única fuente puntual se ilustran en (c). Para esta imagen, k = 0 para todas las superficies. En (d) se muestran reflexiones tanto difusas c o m o especulares para la iluminación con una única fuente puntual y con luz ambiente. s
exteriores podría incluir farolas, anuncios luminosos y focos de coches. Podemos modelar empíricamente las emisiones de luz superficial incluyendo simplemente un término de emisión ^ f ¡ j en el modelo de iluminación, de la misma forma que simulábamos la luz de fondo utilizando un nivel de luz ambiente. Esta emisión superficial se suma entonces a las reflexiones superficiales resultantes de las fuentes luminosas y de la luz de fondo. Para iluminar otros objetos a partir de una superficie emisora de luz, podemos posicionar una fuente de luz direccional detrás de la superficie con el fin de producir un cono luminoso que atraviese la superficie. O bien podemos simular la emisión mediante un conjunto de fuentes luminosas puntuales distribuidas por toda la superficie. En general, sin embargo, las superficies de emisión no suelen utilizarse en el modelo básico de iluminación con el fin de iluminar otras superficies, debido al tiempo de cálculo adicional requerido. En lugar de eso, las emisiones superficiales se utilizan como forma simple de aproximar la apariencia de la superficie de una fuente luminosa compleja. Esto produce un efecto de resplandor para dicha superficie. En la Sección 10.12 hablaremos del modelo de radiosidad, que es un método más realista de modelar las emisiones de luz superficiales. u r
t í m
y s
o n
594
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
Modelo básico de iluminación con focos y con atenuación de la intensidad Podemos formular un modelo general de iluminación monocromática para las reflexiones superfieialesjjue incluya múltiples fuentes luminosas puntuales, factores de atenuación, efectos de luz direccipnal (focos), fuentes situadas en el infinito y emisiones superficiales mediante la fórmula:
La función radial de a t e n u a c i ó n , / se evalúa mediante la Ecuación 10.2 y la función angular de atenuación mediante la Ecuación 10.5. Para cada fuente luminosa, calculamos la reflexión difusa en un punto de la superficie mediante la formula: /radaUün
<
2 U > =
0,0,
si N • L, < 0.0 (fuente luminosa detrás del objeto)
A ,/,(N-L,),
en caso contrario
(
Y el término de reflexión especular debido a la iluminación mediante una fuente puntual se calcula con expresiones similares: 0
siN-L,<0.0 (fuente luminosa detrás del objeto)
0
K
É / , m a x { 0 . 0 , ( N - H , )" },
(10 21)
en caso contrario
Para garantizar que la intensidad de cada píxel no exceda el valor máximo admisible, podemos aplicar algún tipo de procedimiento de normalización. Un enfoque simple consiste en definir una magnitud máxima para cada término de la ecuación de intensidad. Si alguno de los términos calculados excede del máximo, simplemente le asignamos el valor máximo. Otra forma de evitar los desbordamientos del valor de la intensidad consiste en normalizar los términos individuales, dividiendo cada uno de ellos por la magnitud del ténnino más grande. Un procedimiento más complicado consiste en calcular todas las intensidades de píxel de la escena y luego cambiar la escala de este conjunto de intensidades al rango de intensidades que va de 0.0 a 1.0. Asimismo, los valores de los coeficientes de la función radial de atenuación y los parámetros ópticos de las superficies de una escena pueden ajustarse para evitar que las intensidades calculadas excedan del valor máximo admisible. Este es un método muy efectivo para limitar los valores de intensidad cuando toda la escena está iluminada por una única fuente luminosa. En general, sin embargo, a las intensidades calculadas nunca se les permite exceder del valor 1.0 y los valores de intensidad negativos se ajustan al valor 0.0.
Consideraciones relativas al color RGB Para un modelo de color RGB, cada especificación de intensidad en el modelo de iluminación es un vector de tres elementos que indica las componentes roja, verde y azul de dicha intensidad. Así, para cada fuente luminosa, ¡i = (l , / , ¡ ). De modo similar, los coeficientes de reflexión también se especifican mediante componentes RGB: k' = (k > k , k \ k = (k g y g k ) y k = (A , * k ). Cada componente de color de la superficie se calcula entonces mediante una fórmula separada. Por ejemplo, la componente azul de las reflexiones difusa y especular para una fuente puntual se calcula a partir de las Ecuaciones 10.20 y 10.21 modificadas, de la forma siguiente: ¡H
/(;
¡B
a
aR
(¡(J
aB
d
dRt
dB
s
y/?
? ( ?
sB
y %$e¡
m a x ( 0.0,(N-H,)"' }
(10.23)
10.3 ¡Modelos básicos de iluminación
595
Lo más común es que las superficies se iluminen con fuentes de color blanco, pero para efectos especiales o para iluminación de interiores, podemos utilizar otros colores para las fuentes luminosas. A conlinuación, definimos los coeficientes de reflexión para modelar cada color de superficie concreto. Por ejemplo, si queremos que un objeto tenga una superficie azul, seleccionaremos un valor distinto de cero en el rango de 0.0 a 1.0 para la componente de reflectividad azul, k , mientras que a las componentes de reflectividad roja y verde les asignaremos el valor cero (k = / r ¿ = 0.0). Todas las componentes rojas y verdes distintas de cero en la luz incidente serán absorbidas y sólo se reflejará la componente azul. En su modelo de reflexión especular original, Phong asignaba el parámetro & a un valor constante, independiente del color de la superficie. Esto produce reflexiones especulares que tienen el mismo color que la luz incidente (usualmente blanco), lo que da a la superficie una apariencia plástica. Para que el material no tenga aspecto plástico, el color de la reflexión especular debe definirse en función de las propiedades de la superficie y puede ser diferente tanto del color de la luz incidente como del color de las reflexiones difusas. Podemos aproximar los efectos especulares en tales superficies haciendo que el coeficiente de reflexión especular dependa del color, como en la Ecuación 10.23. La Figura 10.24 ilustra las reflexiones de color en una superficie mate, mientras que las Figuras 10.25 y 10.26 muestran las reflexiones de coloren superficies metálicas. En la Figura 10.27 se muestran reflexiones de luz en las superficies de los objetos debidas a múltiples mentes de luz coloreada. Otro método para establecer el color de la superficie consiste en especificar las componentes de los vectores de color difuso y especular para cada superficie, pero conservando los coeficientes de reflexión como constantes de un único valor. Para un modelo de color RGB, por ejemplo, las componentes de estos dos vectores de color de superficie podrían designarse (S S , S ) y (S , S S ). La componente azul de la reflexión difusa (Ecuación 10.22) se calcularía entonces como; tm
(¡R
c
(¡Ry
IlUìJf
ijG
ilB
sR
xC¡t
slJ
(10.24)
Esta técnica proporciona una flexibilidad algo mayor, ya que pueden configurarse independientemente los parámetros de color de la superficie y los valores de reflectividad. En algunos paquetes gráficos, se incluyen parámetros de iluminación adicionales que permiten asignar múltiples colores a una fuente luminosa, contribuyendo cada color a uno de los efectos de iluminación superficial. Por ejemplo, puede utilizarse uno de los colores como contribución a la iluminación general de fondo de la escena. De forma similar, otro color de la fuente luminosa puede usarse como intensidad luminosa para
FIGURA 10.24. Reflexiones luminosas en la superficie de un cojín negro de nylon, modelado mediante patrones de tela tejida y representado utilizando métodos de Monte-Carlo para trazado de rayos. {Cortesia de Stephen H. Westin, Program of Computer Graphics, Cornell University. )
FIGURA 10.25. Rellexiones luminosas en una tetera cuyos parámetros de reflexión se han especificado para simular superficies de aluminio bruñido y que ha sido representada utilizando métodos de Monte-Cario para trazado de rayos. (Cortesía de Stephen H. Westin. Program of Computer Graphics, Cornell University.)
596
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.26. Reflexiones luminosas en trómpelas cuyos parámetros de reflexión se han definido para simular superficies brillantes de cobre. {Cortesía de SOFT/MAGE, Inc.)
FIGURA 10.27. Reflexiones luminosas debidas a múltiples fuentes de luz de varios colores. (Cortesía de Sun Microsystems.)
los cálculos de reflexión difusa, mientras que un tercer color de la fuente podría emplearse en los cálculos de la reflexión especular.
Otras representaciones del color Podemos describir los colores utilizando otros modelos distintos de la representación RGB. Por ejemplo, un color puede representarse utilizando las componentes cyan, magenta y amarillo, o bien describirlo en términos de un tono concreto y los niveles percibidos de brillo y de saturación del color. Podemos incorporar cualquiera de estas representaciones, incluyendo especificaciones de color con más de tres componentes, en nuestro modelo de iluminación. Como ejemplo, la Ecuación 10.24 puede expresarse en términos de cualquier color espectral de longitud de onda X como: W ^ ^ A ^ N - L , )
(10.25)
En el Capítulo 12 se explican con mayor detalle las diversas representaciones del color que resultan útiles en aplicaciones de infografía.
Luminancia Otra característica del color es l a l u i m n a u c i a , que en ocasiones se denomina también energía luminosa. La luminancia proporciona información acerca del nivel de claridad u oscuridad de un color, y es una medióla psicológica de nuestra percepción del brillo que, varía con la cantidad de iluminación que observemps. Físicamente, el color se describe en términos del rango de frecuencias de la energía radiante visible (luz) y l^iuniinancja se calcula como una suma ponderada de las componentes de intensidad dentro de un entorno de iluminación concreto. Puesto que cualquier tipo de iluminación contiene un rango continuo de frecuencias, el valor de luminancia se calcula como: r
(10.26)
luminancia = />>/(./W _ ... iLtóibk/— , — El parámetro / ( / ) de este cálculo representa la intensidad de la componente luminosa de frecueucja/que_ está radiando en una dirección concreta. El parámetro p(f) es una función de proporcionalidad experimen-
10.4 Superficies transparentes
597
talmente determinada que varía tanto con la frecuencia como con el nivel de iluminación. La integral se rea''1Íz3~paTa~t63as las intensidades a lo largo del rango de frecuencias contenido en la luz. Para imágenes en escala de grises y monocromáticas, nos basta con los valores de luminancia para describir la iluminación de un objeto. Y de hecho, algunos paquetes gráficos permiten expresar los parámetros de iluminación en términos de la luminancia. Las componentes de color verde de una fuente luminosa son las que más contribuyen a la luminancia, mientras que las componentes de color azul son las que contribuyen menos. Por tanto, la luminancia de una fuente de color RGB se suele calcular mediante la fórmula: luminancia M Q299R + 0.587G + 0.1 14B
(10.27)
En ocasiones, pueden conseguirse mejores efectos de iluminación incrementando la contribución de la componente verde de cada color RGB. Una recomendación empírica para este cálculo es la fórmula 0.2125/V -I- 0.7154G + 0.07215. El parámetro de luminancia suele representarse mediante el símbolo que se corresponde con la componente Y d e l modelo de color XYZ (Sección 12.3).
10.4 SUPERFICIES TRANSPARENTES Podemos describir un objeto, como el cristal de una ventana, como transparente si podemos ver las cosas que están situadas detrás del objeto. De forma similar, si no podemos ver las cosas que están detrás del objeto, diremos que el objeto es opaco. Además, algunos objetos transparentes, como el cristal esmerilado y ciertos materiales plásticos, son translúcidos, de modo que la luz transmitida se difunde en todas direcciones. Los objetos visualizados a través de materiales translúcidos parecen borrosos y a menudo no se les puede identificar claramente. Una superficie transparente, en general, produce luz tanto reflejada como transmitida. La luz transmitida a través de la superficie es el resultado de emisiones y reflexiones de los objetos y de las fuentes situadas detrás del objeto transparente. La Figura 10.28 ilustra las contribuciones de intensidad a la iluminación superficial para un objeto transparente que se encuentre delante de un objeto opaco. La Figura 10.29, por su parte, muestra los efectos de transparencia que pueden conseguirse en una escena generada por computadora.
Materiales translúcidos En la superficie de un objeto transparente puede producirse tanto transmisión difusa como especular. Los efectos difusos tienen gran importancia cuando haya que modelar materiales translúcidos. La luz que pasa a través de un material translúcido se dispersa, de modo que los objetos situados en segundo plano se ven como imágenes borrosas. Podemos simular la transmisión difusa distribuyendo las contribuciones de intensidad de los objetos de segundo plano a lo largo de un área finita, o bien utilizar métodos de trazado de rayos para simular los objetos translúcidos. Estas manipulaciones requieren mucho tiempo de procesamiento, por lo que los modelos básicos de iluminación sólo suelen calcular los efectos de transparencia especular.
tm
FIGURA 10.28. La emisión de luz de una superficie transparente es, en general, una combinación de luz reflejada y transmitida.
598
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.29. Una vista de una escena obtenida mediante trazado de rayos, donde se muestra un vaso transparente. Se pueden apreciar tanto transmisiones de luz procedentes de los objetos situados detrás de! vaso como reflexiones luminosas producidas en la superficie del vaso. (Cortesía Je Eric llaines, Autodesk, Inc.)
Refracción de la luz Pueden obtenerse imágenes realistas de un material transparente modelando el trayecto de refracción de un rayo de luz a través del material. Cuando un haz luminoso incide sobre una superficie transparente, parte del mismo se refleja y parte se transmite a través del material, en forma de luz refractada, como se muestra en la Figura 10.30. Puesto que la velocidad de la luz es diferente para los distintos materiales, el trayecto de la lltí refractada será distinto del de la luz incidente. La dirección de la luz refractada, especificada por el ángulo de refracción con respecto al vector normal a la superficie, está en función del índice de refracción del material y de la dirección de la luz incidente. El índice de refracción se define como el cociente entre la velocidad de la luz en el vacío y la velocidad de la luz en el material. Él ángulo de refracción 0 se calcula aplicando la r
ley de Sncll: sin0, = ^ - s i n 0 ,
(10.28)
donde 6 es el ángulo de incidencia, t] es el índice de refracción del material a través del que viajaba la luz y t] es el índice de refracción del material a través del que la luz se refracta. De hecho, el índice de refracción también depende de otros factores, como la temperatura del material y la longitud de onda de la luz incidente. Así, las diversas componentes de color de la luz incidente blanca, por ejemplo, se refractan con ángulos distintos que varían con la temperatura. Además, dentro de los materiales anisótropos como el cuarzo cristalino, la velocidad de la luz depende de la dirección, y algunos materiales transparentes exhiben una doble reflacció/u que hace que se generen dos rayos luminosos refractados. Para la mayoría de las aplicaciones, sin embargo, podemos utilizar un único índice de refracción promedio para cada material, tal como se numera en la Tabla 10.1. Utilizando el índice de refracción del aire (aproximadamente 1.0) que rodea a un panel de cristal (índice de refracción - 1.61) en la Ecuación 10.28, con un ángulo de incidencia de 30°, obtenemos un ángulo de refracción de unos 18° para la luz que pasa a través del cristal. j
r
¡
10,4 Superficies transparentes A la rúenle luminosa
599
Luz iiickleni^A're
L ireeeión de reflexión Dirección de refracción
T
FIGURA 10.30. Dirección de reflexión R y dirección de refracción (transmisión) T para un rayo de luz que incide sobre una superllcie con un índice de refracción n .
TABLA 1 0 . 1 . ÍNDICE PROMEDIO DE R
FIGURA 10.31. Refracción de la luz a través de un panel de cristal. El rayo refractado emergente describe una trayectoria que es paralela a la del rayo luminoso incidente (línea punteada).
PARA ALGUNOS MATERIALES COMUNES.
Material
Indice de refracción
Vacío (aire u otro gas)
1.00
Cristal común
I.52
Cristal pesado
I.6I
Cristal de sílex común
l.ól
Cristal de sílex pesado
L92
Sal cristalina
I.55
Cuarzo
1.54
Agua
1.33
Hielo
1.31
La Figura 10.31 ilustra las modificaciones del trayecto debidas a la refracción para un rayo de luz que atraviesa una lina lámina de cristal. El efecto global de la refracción consiste en desplazar la luz incidente hasta una trayectoria paralela cuando el rayo emerge del material. Puesto que los cálculos relacionados con las funciones trigonométricas de la Ecuación 10.28 requieren mucho esfuerzo de procesamiento, estos efectos de refracción pueden aproximarse simplemente desplazando la trayectoria de la luz incidente según una cantidad apropiada, que dependerá de cada material. A partir de la ley de Snell y del diagrama de la Figura 10.30, podemos obtener el vector unitario de transmisión T en la dirección de refracción Q mediante la fórmula:
T = | ^ c o s 0 , -cos0
f
1,
donde N es el vector unitario normal a la superficie y L es el vector unitario en la dirección que va desde el punto de la superficie hasta la fuente luminosa. El vector de transmisión T puede utilizarse para localizar las intersecciones del trayecto de refracción con los objetos situados detrás de la superficie transparente. Incluir los objetos de refracción en una escena puede producir imágenes muy realistas, pero la determinación de los trayectos de refracción y las intersecciones con los objetos requiere una cantidad de proceso considerable. La mayoría de los métodos del espacio de imagen basados en líneas de barrido modelan la transmisión de la luz mediante aproximaciones que reducen el tiempo de procesamiento. Los efectos de refracción precisos sólo se suelen mostrar utilizando algoritmos de trazado de rayos (Sección 10.11).
600
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Modelo básico de transparencia Un procedimiento más simple para modelar los objetos transparentes consiste en ignorar los desplazamientos de los trayectos debidos a la refracción. En la práctica, este enfocjue equivale a suponer que no hay ningún cambio en el índice de refracción de un material a otro, de modo que el ángulo de refracción es siempre igual al ángulo de incidencia. Este método acelera los cálculos de las intensidades y puede producir efectos de transparencia razonables para superficies poligonales linas. Podemos combinar la intensidad transmitida / a través de una superficie transparente desde un objeto situado en segundo plano con la intensidad reflejada / . por la propia superficie (figura 10.32) utilizando un coeficiente de transparencia k Al parámetro k se le asigna un valor entre 0.0 y 1.0 para especificar qué porcentaje de la luz procedente de los objetos situados en segundo plano hay que transmitir. La intensidad total en la superficie se calcula entonces como: | | ¡ i n s
R
r
n
f
+
'=0
" *,)'«.! Vwn.
00.30)
El término (I - k ) es el factor de opacidad. Por ejemplo, si el factor de transparencia tiene un valor de 0.3, entonces el 30 por ciento de la luz de los objetos de segundo plano se combinará con un 70 por ciento de la luz reflejada por la superficie. Este procedimiento puede usarse para combinar los efectos de iluminación de cualquier número de objetos transparentes y opacos, siempre y cuando procesemos las superficies según su orden de profundidad (desde atrás hacia delante). Por ejemplo, mirando a través del cristal de la Figura 10.29, podemos ver los objetos opacos que están situados detrás de dos superficies transparentes. De forma similar, cuando miramos a través del parabrisas de un automóvil, podemos ver los objetos situados dentro del vehículo, así como cualquier objeto que esté situado detrás del parabrisas trasero. Para objetos muy transparentes, asignaremos a k un valor próximo a 1.0. Los objetos casi opacos transmiten muy poca luz procedente de los objetos situados en segundo plano, así que podemos asignar a k un valor próximo a 0.0 para estos materiales. También se puede hacer que k sea función de la posición concreta de la superficie, de tal forma que las diferentes parles de un objeto transmitan más o menos luz procedente de las superficies situadas en segundo plano. Podemos modificar los algoritmos de visibilidad basados en la ordenación de la profundidad con el fin de tener en cuenta la transparencia, para lo cual ordenaremos primero las superficies según su profundidad y luego determinaremos si cualquiera de las superficies visibles es transparente. Si lo es, la intensidad reflejada en la superficie se combinará con la intensidad superficial de los objetos situados detrás suyo, con el fin de obtener la intensidad de pixel en cada punto proyectado de la superficie. Los efectos de transparencia también pueden implementarse utilizando una técnica de búfer de profundidad modificada. Podemos dividir las superficies de una escena en dos grupos, de modo que se procesen primero todas las superficies opacas. Terminado este proceso, el búfer de imagen contendrá las intensidades de las superficies visibles y el búfer de profundidad contendrá sus profundidades. A continuación, se compara la profundidad de los objetos transparentes con los valores previamente almacenados en el búfer de profundidad. Si alguna de las superficies transparentes es visibles, su intensidad reflejada se calculará y combinará con la intensidad de la superficie opaca previamente almacenada en el búfer de imagen. Este método puede modificarse para producir imágenes más precisas, utilizando espacio de almacenamiento adicional para la profundidad y para otros parámetros de las superficies transparentes, listo permite comparar los valores de profundidad de las superficies transparentes entre sí, además de compararlos con la profundidad de las superficies opacas. Entonces, las superficies transparentes visibles se representarán combinando sus intensidades superficiales con aquellas de las superficies visibles y opacas que estén situadas detrás. Otra posible técnica es el método basado en búfer A. Para cada posición de pixel del búfer A, los parches de superficie de todas las superficies solapadas se guardan y almacenan según su orden de profundidad. Entonces, las intensidades de los parches de superficie transparentes y opacos que se solapan en profundidad se combinan en el orden de visibilidad adecuado con el fin de producir la intensidad final promedio para el pixel. t
t
t
f
10.6 Sombras
601
Objeto de segundo plano Objeto UOJC sparente
: Plano de proyección
FIGURA 10.32. La intensidad de un objeto situado en segundo plano en el punto P puede combinarse con la intensidad reflejada por la superficie de un objeto transparente a lo largo de una línea de proyección perpendicular (punteada).
10.5 EFECTOS ATMOSFÉRICOS Otro factor que a veces se incluye en los modelos de iluminación es el efecto de la atmósfera sobre el color de un objeto. Una atmósfera neblinosa hace que los colores se difuminen y que los objetos parezcan más tenues. Por tanto, podríamos especificar una función que modi Acara los colores de las superficies de acuerdo con la cantidad de polvo, humo o niebla que queramos simular en la atmósfera. El efecto de atmósfera neblinosa se suele simular mediante una función exponencial de atenuación tal como: v
.';»tiix> " '
r
O
I
ü~#^
{
"
> J 2 )
El valor asignado a c/es la distancia hasta el objeto desde la posición de visualización. El parámetro p en estas funciones exponenciales se utiliza para definir un valor de densidad positivo para la atmósfera. Los valores mayores de p producen una atmósfera más densa y hacen que se atenúen más los colores de las superficies. Después de calculado el color de la superficie de un objeto, multiplicaremos dicho color por una de las funciones atmosféricas con el fin de reducir su intensidad según una cantidad que dependerá del valor de densidad que hayamos asignado a la atmósfera. En lugar de la función exponencial, podríamos simplificar los cálculos de la atenuación atmosférica utilizando la función lineal 9.9 de variación de la intensidad según la profundidad. Esto hace que se reduzca la intensidad de los colores de la superficie de los objetos distantes, aunque si hacemos esto no tendremos posibilidad de variar la densidad de la atmósfera. Algunas veces puede ser necesario también simular un color atmosférico. Por ejemplo, el aire en una habitación llena de humo podría modelarse con un cieno tono gris o, quizás, con un azul pálido. Podría emplearse el siguiente cálculo para combinar el color de la atmósfera con el color de un objeto:
donde ./á
lnl0
es una función exponencial o lineal de atenuación atmosférica.
10.6 SOMBRAS Pueden utilizarse métodos de delección de la visibilidad para localizar regiones que no estén iluminadas por las fuentes de luz. Con la posición de visualización situada en la ubicación de una fuente luminosa, podemos determinar qué secciones de las superficies de una escena no son visibles. Estas serán las áreas de sombra. Una vez determinadas las áreas de sombra para todas las fuentes luminosas, las sombras pueden tratarse como patrones superficiales y almacenarse en matrices de memoria de patrones. La Figura 10.33 ilustra una serie de regiones de sombra sobre la cara de un carácter animado. En esta imagen, las regiones de sombra son secciones de la superficie que no son visibles desde la posición de la fuente luminosa que está situada encima de
602
C APÍTULO
10
Modelos
de
iluminación
y métodos
de
representación
superficial
Patrones de sombra mapeados sobre la cara de Aki Ross, un carácter animado de la película Final Fantasy: The Spirits Within. (Cortesía de Sanare Pictures. Inc. O 2001 FFFP Todos los derechos reservados.) FIGURA 10.33.
la figura. Así, la mano y el brazo levantados son iluminados, pero las secciones de la cara situadas detrás del brazo, según la línea de visión que proviene de la fuente luminosa, estarán en sombras. La escena de la Figura 10.29 muestra los efectos de las sombras producidas por múltiples fuentes luminosas. Los patrones de sombra generados mediante un método de detección de superficies visibles son válidos para cualquier posición de visualización seleccionada, mientras no se varíen las posiciones de las fuentes luminosas. Las superficies que sean visibles desde la posición de visualización se sombrean de acuerdo con el modelo de iluminación, que puede combinarse con patrones de texturas. Podemos mostrar las áreas de sombras únicamente con la intensidad de la luz ambiente, o podemos combinar la luz ambiente con una serie de texturas de superficie especificadas.
10.7 PARÁMETROS DE LA CÁMARA Los procedimientos de visualización c iluminación que hemos considerado hasta ahora producen imágenes nítidas, que son equivalentes a fotografiar una escena con una cámara tradicional. Sin embargo, cuando fotografiamos una escena real, podemos ajustar la cámara de modo que sólo algunos de los objetos estén enfocados. Los demás objetos estarán más o menos desenfocados, dependiendo de la distribución en profundidad de los objetos de la escena. Podemos simular la apariencia de los objetos desenfocados en un programa infográfico proyectando cada posición de esos objetos sobre un área que cubra múltiples posiciones de píxel, mezclando los colores del objeto con los de otros objetos con el fin de producir un patrón de proyección borroso. Este procedimiento es similar a los métodos utilizados en antia/iasing, y podemos incorporar estos efectos de la cámara tanto en los algoritmos de línea de proyección como en los de trazado de rayos. Las escenas generadas por computadora parecen más realistas cuando se incluyen los efectos de enfoque, pero estos cálculos de enfoque requieren mucho tiempo de procesamiento. En la Sección 10.11 se analizan los métodos de especificación de los parámetros de la cámara y del objetivo para simular los efectos de enfoque.
10.8 VISUALIZACIÓN DE LA INTENSIDAD DE LA LUZ Una intensidad superficial calculada mediante un modelo de iluminación puede tener cualquier valor en el rango que va de 0.0 a 1.0, pero un sistema de gráficos por computadora sólo puede mostrar un conjunto limitado de intensidades, por tanto, los valores de intensidad calculados deben convertirse a uno de los valores
10.8
Visuaiización de la intensidad de la luz
6 0 3
permitidos en el sistema. Además, el número de niveles de intensidad permitidos en el sistema puede distribuirse de modo que se correspondan con la forma en que nuestros ojos perciben las diferencias de intensidad. Cuando mostramos escenas en un sistema monocromo, podemos convertir las intensidades calculadas en patrones de semitono, como se explica en la Sección 10.9.
Distribución de los niveles de intensidad del sistema Para cualquier sistema, el número de niveles de intensidad permitidos puede distribuirse en el rango de 0.0 a 1.0 de modo que esta distribución se corresponda con nuestra percepción de lo que son intervalos de intensidad iguales entre niveles. Los humanos percibimos las intensidades relativas de la luz de la misma forma en que percibimos las intensidades relativas de sonido. Según una escala logarítmica. Esto significa que si el cociente de dos valores de intensidad es igual al cociente de otras dos intensidades, percibiremos que la diferencia entre cada par de intensidades es la misma. Como ejemplo, el hombre percibe la diferencia entre las intensidades 0.20 y 0.22 igual que la diferencia entre 0.80 y 0.88. Por tanto, para mostrar w+I niveles de intensidad sucesivos con una diferencia percibida de brillo igual, los niveles de intensidad en el monitor deben espaciarse de modo que el cociente de las intensidades sucesivas sea constante: L = L = ... = Jju
(f034)
= r
donde / representa la intensidad de una de las componentes de color de un haz luminoso. El nivel más bajo que puede mostrarse se representa como / y el nivel más alto como ! . Cualquier nivel de intensidad intermedio podrá entonces expresarse en términos de / como: 0
n
0
Podemos calcular el valor de /' a partir de los valores de I y n de un sistema concreto efectuando la sustitución k = n en la expresión anterior. Puesto l = 1.0, tendremos: {)
n
(KU6)
r = Por tanto, la fórmula de ¡ de la Ecuación 10.35 puede reescribirse como: k
I
_
tin-tUn
u - 'o Como ejemplo, si /„ = | para un sistema con n = 3, tendremos r = 2y los cuatro valores de intensidad serán
¿y
y
LO.
El valor de intensidad más bajo / depende de las características del monitor y se encuentra normalmente en el rango comprendido entre 0.005 y aproximadamente 0.025. Esta intensidad residual en un monitor de vídeo se debe a la luz reflejada por los fósforos de la pantalla. Por tanto, una región «negra» de la pantalla siempre tendrá un cierto valor de intensidad por encima de 0.0. Para una imagen en escala de grises con 8 bits por píxel (n = 255) e /» = 0.01, el cociente de intensidades sucesivas es aproximadamente r = 1.0182. Los valores aproximados de las 256 intensidades de este sistema serán 0.0100, 0.0102, 0.0104, 0.0106, 0.0107, 0.0109 0.9821 y 1.0000. Con las componentes de color RGB se utilizan métodos similares. Por ejemplo, podemos expresar la intensidad de la componente azul de un color en el nivel k en términos del menor valor de intensidad azul obtenible, mediante la fórmula: 0
donde.
604
CAPITULO 10 Modelos de iluminación y métodos de representación superficial
(10,39)
y n es el número de niveles de intensidad.
Corrección gamma y tablas de sustitución de vídeo Cuando mostramos imágenes en color o monocromáticas sobre un monitor de vídeo, las variaciones de brillo percibidas son no lineales, mientras que los modelos de iluminación producen una variación lineal de los valores de intensidad. El color RGB (0.25, 0.25, 0.25) obtenido a partir del modelo de iluminación representa la mitad de intensidad del color (0.5, 0.5, 0.5). Usualmente, estas intensidades calculadas se almacenan en un archivo de imagen en forma de valores enteros que van de 0 a 255, con un byte para cada una de las tres componentes RGB. Este archivo de imagen que describe las intensidades también es lineal, por lo que un píxel con el valor (64, 64, 64) representará la mitad de intensidad de un píxel que tenga el valor (128, 128, 128), Las tensiones del cañón de electrones, que controla el número de electrones que inciden sobre la pantalla de fósforo, produce niveles de brillo que están detemiinados por la curva de respuesta del monitor que se muestra en la Eigura 10.34. Por tanto, el valor de intensidad mostrado (64, 64, 64) no parecerá la mitad de brillante que el valor (128, 128, 128). Para compensar las no linealidacles del monitor, los sistemas gráficos utilizan una tabla de consulta de vídeo que ajusta los valores lineales de intensidad de entrada. La curva de respuesta del monitor está descrita mediante la función exponencial: (10.40)
t=aV< 7
La variable / representa la intensidad mostrada y él parámetro I es la correspondiente tensión en el tubo de rayos catódicos. Los valores de los parámetros a y /dependen de las características del monitor utilizado dentro del sistema gráfico. Así. si queremos mostrar un valor de intensidad concreto /, el valor de tensión que permitirá generar esta intensidad es:
(10.41)
Este cálculo se denomina corrección gamma de la intensidad, y los valores de gamma están normalmente en el rango comprendido entre 1.7 y 23. El estándar de señal de NTSC (National Television System Committee) es y 2.2. La figura 10.35 muestra un curva de corrección gamma utilizando el valor de gamma de NTSC. estando tanto la intensidad como la tensión normalizadas en el intervalo de 0 a 1.0. La Ecuación 10.41 se utiliza para definir la tabla de consulta de vídeo que convierte los valores enteros de intensidad de un archivo de imagen a valores que controlen las tensiones del cañón de electrones. Podemos combinar la corrección gamma con el mapeado logarítmico de intensidad para generar una tabla de sustitución. SI / es un valor de intensidad de entrada producido por un modelo de iluminación, primero localizamos la intensidad más próxima I en una tabla de valores creada con la Ecuación 10.34 o la Ecuación 10.37. Alternativamente, podemos determinar el número del nivel correspondiente a este valor de intensidad aplicando la fórmula: k
k = round log,
—
(10.42)
y luego podemos calcular el valor de intensidad para este nivel utilizando la Ecuación 10.37. Una vez dispongamos del valor de intensidad ¡y podemos calcular la tensión del cañón de electrones mediante la ecuación:
10.8
m
Visualización de la intensidad de la luz
0.5
i.o
lnlensidad
Tensión normalizada del cartón de e l e c t r o n e s
FIGURA 10.34. Una curva típica de respuesta de un monitor, mostrando la variación en la intensidad (o brillo) visualizada en función de la tensión normalizada del cañón de electrones.
605
FIGURA 10.35. Una curva de consulta de v í d e o para corrección de las intensidades que mapea un valor de intensidad normalizado a una tensión normalizada del cañón de electrones, utilizando una c o l e c c i ó n g a m m a con / = 2.2.
(1(143) Los valores V pueden entonces almacenarse en las tablas de sustitución, almacenando los valores de k en las posiciones de pixel del búfer de imagen. Si un sistema concreto no dispone de tabla de sustitución, pueden almacenarse directamente en el búfer de imagen los valores calculados de VL La transformación combinada a una escala logarítmica de intensidad, seguida del cálculo de V utilizando la Ecuación 10.43 se denomina también en ocasiones corrección gamma. k
k
Si los amplificadores de vídeo de un monitor están diseñados para convertir los valores de intensidad lineales en tensiones del cañón de electrones, podemos combinar los dos procesos de conversión de la intensidad. En este caso, la corrección gamma estará integrada en el hardware y los valores logarítmicos ¡ deben precalcularse y almacenarse en el búfer de imagen (o en la tabla de colores). k
Visualización de imágenes de plano continuo Los sistemas infográficos de alta calidad proporcionan generalmente 256 niveles de intensidad para cada componente de color, pero en muchas aplicaciones pueden obtenerse imágenes aceptables con un menor número de niveles. Un sistema de cuatro niveles proporciona unas capacidades de sombreado mínimas para las imágenes de tono continuo, mientras que pueden generarse imágenes fotorrealistas en sistemas capaces de proporcionar entre 32 y 256 niveles de intensidad por píxel. La Figura 10.36 muestra una fotografía en tono continuo impresa con diversos niveles de intensidad. Cuando se utiliza un pequeño número de niveles de intensidad para reproducir una imagen de tono continuo, los bordes entre las diferentes regiones de intensidad (denominados contornos) son claramente visibles. En la reproducción de dos niveles, las características faciales de la mujer que aparece en la fotografía apenas son identilicables. Utilizando cuatro niveles de intensidad, comenzamos a identificar los patrones de sombreado originales, pero los efectos de contorneado son excesivos. Con 8 niveles de intensidad, los efectos de contorneado siguen siendo obvios, pero comenzamos a disponer de una mejor indicación del sombreado original.
606
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
(d) FIGURA 10.36. Lina fotografía de tono continuo (a) impresa con 2 niveles de intensidad (b>, cuatro niveles de intensidad (e) y 8 niveles de intensidad (d). Para 16 o más niveles de intensidad, los efectos de contorneado disminuyen y las reproducciones son bastante similares al original. Las reproducciones de imágenes de plano continuo utilizando más de 32 niveles de intensidad sólo muestran diferencias muy sutiles con respecto al original.
10.9 PATRONES DE SEMITONO Y TÉCNICAS DE ALEAT0RIZAC1ÓN Con un sistema que tenga muy pocos niveles de intensidad disponibles, podemos crear un incremento aparente en el número de niveles visualizados incorporando múltiples posiciones de píxel en la visualización de cada valor de intensidad de una escena. Cuando contemplamos una pequeña región compuesta de varias posiciones de píxel, nuestros ojos tienden a integrar o promediar los detalles menores, obteniendo una intensidad global. Los monitores e impresoras monocromos, en concreto, pueden aprovechar este efecto visual para generar imágenes que parecen mostradas con múltiples valores de intensidad. Las fotografías de tono continuo se reproducen en periódicos, revistas y libros mediante un proceso de impresión denominado impresión por semitonos y las imágenes reproducidas se denominan semitonos. Para
10.9 Patrones de semitono y técnicas de aleatorización
607
x
FIGURA 10.37. Una sección ampliada de una fotografía reproducida medíanle un método de impresión por semitonos, donde se muestra cómo se representan los tonos mediante «puntos» de tamaño variable. una fotografía en blanco y negro, cada área de intensidad constante se reproduce mediante un conjunto de pequeños círculos negros sobre fondo blanco. El diámetro de cada círculo es proporcional al nivel de oscuridad requerido para dicha región de intensidad. Las regiones más oscuras se imprimen con círculos de mayor tamaño, mientras que las regiones más claras se imprimen con círculos más pequeños (más espacio en blanco). La Figura 10.37 muestra una sección ampliada de una reproducción de semitono en escala de grises. Los semitonos en color se imprimen utilizando pequeños puntos circulares de diversos tamaños y colores, como se muestra en la Figura 10.38. Los semitonos en los libros y revistas se imprimen en papel de alta calidad utilizando aproximadamente entre 60 y 80 círculos de diámetro variable por centímetro. Los periódicos utilizan un papel de menor calidad y menor resolución (entre 25 y 30 puntos por centímetro).
Aproximaciones de semitonos En infogralm, las reproducciones de semitonos se simulan utilizando regiones de pixeles rectangulares que se denominan patrones de aproximación de semitonos o simplemente patrones de pixeles. 1:1 número de niveles de intensidad que podemos mostrar con este método dependerá de cuántos pixeles incluyamos en la cuadrícula rectangular y de cuántos niveles pueda visualizar el sistema. Con n por n pixeles por cada cuadrícula en un sistema monocromo, podemos representar n + 1 niveles de intensidad. La Figura 10.39 muestra una forma de definir los patrones de píxel para representar cinco niveles de intensidad que podrían utilizarse en un sistema monocromo. En el patrón 0, todos los pixeles están desactivados; en el patrón 1, hay un píxel activado; y en el patrón 4, los cuatro pixeles están activados. Un valor de intensidad / en una escena se mapea a un patrón concreto de acuerdo con el rango enumerado bajo cada una de las cuadrículas mostradas en las figuras. El patrón 0 se utiliza para 0.0 < / < 0.2, el patrón 1 para 0.2 < / < 0.4 y el patrón 4 para 0.8 < / < 1.0. 2
Con cuadrículas de 3 por 3 pixeles en un sistema monocromo, podemos mostrar diez niveles de intensidad. En la Figura 10.40 se muestra una forma de definir los diez patrones de píxel para estos niveles. Las posiciones de píxel se seleccionan en cada nivel de modo que los patrones aproximen los tamaños crecientes de los círculos utilizados en las reproducciones de semitono. Es decir, las posiciones de los pixeles «activados» están cerca del centro de la cuadrícula para los niveles de intensidad inferiores y se expanden hacia afuera a medida que se incrementa el nivel de intensidad. Para cualquier tamaño de cuadricula de pixeles, podemos representar los patrones de pixeles para las diversas intensidades posibles mediante una máscara (matriz) de posiciones de píxel. Como ejemplo, podríamos usar la siguiente máscara para generar tos nueve patrones de cuadrícula 3 por 3 para niveles de intensidad por encima de 0 que se muestran en la Figura 10.40.
608
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
(a)
(b)
íc)
FIGURA 10.38. Patrones de puntos para semitonos en color. La (a) se muestra agrandada según un factor 10 en (b) y según un Massachuseffs.) 8
3
5
I
4
9
superior de la esfera de! reloj en el semitono en color 50 en (c). (Cortesía de IRIS Graphics. Inc., Bedford,
Para mostrar una intensidad concreta cuyo número de nivel sea A, activaremos todos los píxeles cuyo número de posición sea igual o inferior a k. Aunque la utilización de patrones de píxeles n por n incrementa el número de intensidades que pueden representarse, la resolución del área de visualización se reduce según el factor \In en las direcciones JC ej>. Utilizando patrones de cuadrícula de 2 por 2 en un área de pantalla de 512 por 5 1 2 , por ejemplo, se reduce la resolución a 256 por 256 posiciones de intensidad. Y con patrones 3 por 3, reducimos la resolución del área de tamaño 512 por 5 1 2 a 128 por 128. Otro problema con las cuadrículas de píxeles es que, a medida que se incrementa el tamaño de la cuadrícula, los patrones de subcuadrícula comienzan a hacerse perceptibles. El tamaño de cuadrícula que podrá utilizarse sin distorsionar las variaciones de intensidad dependerá del tamaño de cada píxel visualizado. Por
10.9
0 0.0 - I < 0.2
1 2 0.2 < I < 0.4
0.4 < l < 0.6
Patrones de semitono y técnicas de aleatorización
0.6
s
3 | < 0.8
609
4 0.8 £ I
FIGURA 10.39. Un conjumo tic patrones de cuadrícula de 2 por 2 píxcles que puede utilizarse para mostrar cinco niveles de intensidad en un sistema monocromo, indicándose los píxeles «activados» como circuios rojos. Los valores de intensidiid asignados a cada uno de los palrones de cuadrícula se indican debajo de las matrices de píxeles.
ti 0 Ü.OsKO.1
3 0.1 < l< 0.2
0.2 ss I < 0.3
0.3 S l< 0.4
0.7 S I < 0.8
8 0.8 s l < 0 . 9
m%m Jim 0.5 ^ I < O.fi
0.6
-5 I <
0.7
0.4 < I < 0.5
li
9 0.9 < | < 1.0
FIGURA 10.40. Un conjunto de patrones de cuadrícula de 3 por 3 píxeles que puede usarse para mostrar diez niveles de intensidad en un sistema monocromo, indicándose los píxeles «activados» como círculos rojos. Los valores de intensidad que se asignan a cada uno de los patrones de la cuadrícula se indican debajo de las matrices de píxeles. lauto, para los sistemas de menor resolución (menos píxeles por centímetro), nos tendremos que dar por satislechos con un número menor de niveles de intensidad. Por otra parte, las imágenes de alta calidad requieren al menos 64 niveles de intensidad, lo que quiere decir que necesitamos cuadrículas de X por 8 píxeles. Y para conseguir una resolución equivalente a la de los semitonos de los libros y las revistas, debemos mostrar 60 puntos por centímetro. Por tanto, será necesario visualizar 60 X 8 = 480 puntos por centímetro. Algunos dispositivos, como por ejemplo las fumadoras de alta calidad, son capaces de obtener esta resolución. Los patrones de cuadricula de píxeles para las aproximaciones de semitono deben también construirse de forma que se minimicen el contorneado y otros electos visuales no presentes en la escena original. Podemos minimizar el contorneado haciendo que cada patrón de cuadrícula sucesivo represente una evolución con respecto al patrón anterior, es decir, formamos el patrón de nivel k añadiendo una posición "activada" al patrón de cuadrícula utilizado para el nivel k - 1. Así. si una posición de píxei está activada para un determinado nivel de intensidad, también lo estará para todos los niveles superiores (Figuras 10.3 - y 10.40). Podemos minimizar la introducción de otros efectos visuales evitando la existencia de patrones simétricos. Con una cuadrícula de 3 por 3 píxeles, por ejemplo, el tercer nivel de intensidad por encima de cero se representará mejor mediante el patrón de la Figura 10.41 (a) que mediante cualquiera de las disposiciones simétricas de la figura 10.4l(b). Los patrones simétricos de esta figura producirían trazos verticales, horizontales o diagonales en las áreas de gran tamaño que estuvieran sombreadas con el nivel de intensidad 3. En las tareas de impresión en dispositivos tales como fumadoras y algunas impresoras, los píxeles aislados no se reproducen de manera adecuada. Por tanto conviene evitar los patrones de cuadrícula con un único píxel "activado" o con píxeles «activados» aislados, como en la Figura 10.42. o
Los métodos de aproximación de semitonos también pueden aplicarse para incrementar el número de niveles de intensidad del sistema que sean capaces de mostrar más de dos niveles de intensidad por pixel. Por ejemplo, en un sistema de escala de grises que pueda visualizar cuatro valores de intensidad por pixel, podemos utilizar cuadrículas de 2 por 2 píxeles para representar 13 diferentes niveles de intensidad. La Figura
610
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
u s
FIGURA 10.41. Para una cuadrícula de 3 por 3 píxeles, el palrón de (a) es mejor que cualquiera de los patrones simétricos de (b) para representar el tercer nivel de intensidad por encima de Ü.
(b,
i #
FIGURA 10.42. Patrones de cuadricula de semitono con píxeles aislados que no pueden reproducirse de manera adecuada en algunos dispositivos de impresión.
0
o
o
o
o
I
#
I
1
9
1
ra»
i
0
1
!i m 2
2
i\
1 i
V ¡ 2
4 3
2 ¡ 2
#
1
1
3
I
m
1
#
2
5 3
3
J
10
II
3
3
i
3 12
FIGURA 10.43. Representaciones de las intensidades 0 a 12 obtenidas mediante patrones de aproximación de semitonos utilizando cuadriculas de 2 por 2 píxeles en un sistema de cuatro niveles, con los niveles de intensidad de píxel etiquetados de 0 a 3.
FIGURA 10.44. Un patrón de cuadricula de 2 por 2 píxeles para la visuali/ación de colores RGB. 10.43 ilustra una forma de definir los 13 patrones de cuadricula de píxeles, pudiendo asignarse a cada píxel los niveles de intensidad 0, 1, 2 y 3. De forma similar, podemos utilizar patrones de cuadrícula de píxeles para incrementar el número de niveles de intensidad que pueden representarse en un sistema en color. Por ejemplo, un sistema RGB con tres bits por píxel utilizará un bit por píxel para cada cañón de color. Así. cada píxel se visualiza mediante tres puntos de fósforo, de modo que puede asignarse al píxel uno cualquiera de ocho colores diferentes (incluidos el blanco y el negro). Pero con patrones de cuadrícula de 2 por 2 píxeles, son 12 los puntos de fósforo que podemos utilizar para representar un color, como se muestra en la Figura 10.44. El cañón de electrones rojo permite activar cualquier combinación de los cuatro puntos rojos del patrón de cuadrícula y esto proporciona cinco posibles configuraciones para el color rojo del patrón. Lo mismo puede decirse de los cañones verde y azul, lo que nos da un total de 125 combinaciones de color diferentes que pueden representarse con nuestros patrones de cuadrícula 2 por 2.
Técnicas de aleatorización El término aleatorización (dithering) se utiliza en varios contextos. Fundamentalmente, hace referencia a técnicas empleadas para aproximar semitonos sin reducir la resolución, a diferencia de lo que sucede con los
10.9 Patrones de semitono y técnicas de aleatorización 611 patrones de cuadrículas de píxeles. Pero el término aleatorización se emplea también en ocasiones como sinónimo para cualquier esquema de aproximación de semitonos, e incluso para referirse a las aproximaciones de semitonos en color. Los valores aleatorios sumados a las intensidades de los píxeles con el fin de descomponer los contornos Se suelen denominar r u i d o de a l e a t o r i z a c i ó n . Se han utilizado diversos algoritmos para generar las distribuciones aleatorias. El efecto de todos ellos consiste en añadir ruido a la imagen completa, lo que tiende a suavizar las fronteras entre los distintos niveles de intensidad. Un método denominado a l e a t o r i z a c i ó n o r d e n a d a genera variaciones de intensidad mediante una aplicación biyectiva de los puntos de una escena a las posiciones de píxel utilizando una m a t r i z de a l e a t o r i z a c i ó n D_ para seleccionar cada nivel de intensidad. La matriz D contiene n por n elementos a los que se asignan valores enteros positivos diferentes en el rango que va de 0 a rr — 1 . Por ejemplo, podemos generar cuatro niveles de intensidad mediante: / ;
D
2
=
3
I
0
2
(10.45)
y podemos generar nueve niveles de intensidad mediante: 7
2
6
4 0
1
3
5
8
(10.46)
Los elementos de las matrices l > y D están en el mismo orden que la máscara de píxeles utilizada para definir las cuadrículas de 2 por 2 y 3 por 3 píxeles, respectivamente. En un sistema monocromo, determinamos los valores de intensidad que hay que visualizar comparando las intensidades de entrada con los elementos de la matriz. Primero se cambia la escala de los niveles de intensidad de entrada al rango 0 < / < n->. Si hay que aplicar la intensidad / a la posición de pantalla (.v, v), calculamos la posición de referencia (fila y columna) en la matriz de aleatorización de la forma siguiente: 2
3
j = (x mod n) + 1 ,
(10.47)
k = (y mod n) + 1
Si / > D (/', A), activaremos el píxel situado en la posición (v, y). En caso contrario, el pixel permanecerá desactivado. En las aplicaciones de color RGB, este procedimiento se implemenla para la intensidad de cada una de las componentes individuales de color (roja, verde y azul). Los elementos de la matriz de aleatorización se asignan según las directrices que ya hemos comentado para las cuadriculas de píxeles, es decir, con el objetivo de minimizar los efectos visuales artificiales, como el contorneado. La aleatorización ordenada produce áreas de intensidad constante idénticas a las que se generan mediante los patrones de cuadrículas de píxeles. cuando los valores de los elementos de la matriz se corresponden con los de la máscara de la cuadrícula de aproximación de semitonos. Las variaciones con respecto a las imágenes obtenidas mediante cuadrículas de píxeles se producen en la frontera de dos áreas de intensidad diferente. Normalmente, el número de niveles de intensidad utilizados será un múltiplo de 2. Las matrices de aleatorización de orden superior, n > 4, se obtienen entonces a partir de las matrices de orden inferior utilizando la relación recurrente:
4D„,_ D (lJ)U„ 1 +
4D
n ; 2
:
+D (2,l)c/„ 2
/ ?
/ 2
4D,
í / ? +
4D
D (l,2)c/ 2
n
/
2
+
n / 2
(10.48)
D 0.2)U n 2
m
El parámetro U representa la matriz «unidad» (todos los elementos iguales a 1 ) . Como ejemplo, si se específica D - , como en la Ecuación 1 0 . 4 5 , la relación recursiva 1 0 . 4 8 nos da: /f/1
612
CAPÍTULO 10
Miníelos de iluminación y métodos de representación superficial
15
7
13
5
3
11
12
4
10
6
0
8
2
10
(10.49)
Otro método para mapear una imagen con m por // puntos a un área de visualizaeión de /;/ por n píxeleses la difusión de error. Con este método, el error entre un valor de intensidad de entrada y el nivel de intensidad seleccionado para una determinada posición de pixel se dispersa, o difunde, a las posiciones de pixel situadas a la derecha y por debajo de la posición de pixel actual. Comenzando con una matriz IVI de valores de intensidad obtenida cscaneando una fotografia, podemos tratar de construir una matriz I de valores de intensidad de pixel para un área de la pantalla. En este caso, podemos hacerlo leyendo las lilas de M de izquierda a derecha, comenzando por la fila superior, y determinando el nivel de intensidad de pixel más próximo disponible para cada elemento de M. Entonces, el error entre el valor almacenado en la matriz M y el nivel de intensidad mostrado en cada posición de pixel se distribuye a los elementos vecinos utilizandoci siguiente algoritmo simplificado:
for
- 0;
(j for
j
\*
< m;
Determinar
* íjue
esté
* asignar
error = M [jl
I
[j + H [ k - 1 ] ,
I
¿
¿i M
Ij + U t k + X l
-
valor valor
-
I
intensidad
al
del
sistema
[ j ] [k]
disponible
y
[j] [ k ] .
+
alpha
tj+l][k-l)
[ j + l ] [k] M
de
[ j ] [k] ;
[j] [k+1] M
{
próximo al v a l o r de M
este
* M
[kl
el
más
[ j ] [k]
I
I
j++)
0; k < n ; k + + )
(k =
+
*
beta
error; *
error;
+ gamma * e r r o r ;
[j+l] tk+l]
+
delta
*
error;
Una vez asignados los niveles de intensidad a los elementos de la matriz I, mapcamos la matriz sobre algún área de un dispositivo de salida, como por ejemplo una impresora o un monitor de vídeo. Por supuesto, no podemos dispersar el error más allá de la última columna de la matriz (k = n) o por debajo de la última illa de la matriz (j - m) y para un sistema monocromo los valores de intensidad del sistemas son simplemente 0 y I. Los parámetros para distribuir el error pueden elegirse de modo que se satisfaga la relación:
a + f}+ y + S< 1
(10.50)
Una posible elección para los parámetros de difusión de errores que produce muy buenos resultados es {a, p, y, S) = ( - ¡ | , - ¡ | , f ^ ) . La Figura 10.45 ilustra la distribución de errores utilizando estos valores de parámetros. La difusión de errores produce en ocasiones «fantasmas» en las imágenes al repetir ciertas partes de la imagen (ecos), particularmente con características faciales tales como la linea del pelo o el contorno de la nariz. Estos fantasmas pueden reducirse a menudo en dichos casos seleccionando valores de los parámetros de difusión de errores cuya suma dé un valor inferior a 1 y cambiando la escala de los valores de la matriz después de dispersar los errores. Una forma de cambiar la escala consiste en multiplicar todos los elementos de la matriz por 0.8 y luego sumar 0.1. Otro método para mejorar la calidad de la imagen consiste en alternar la lectura de las filas de la matriz, leyendo una de derecha a izquierda y la siguiente de izquierda a derecha.
10.10 Métodos de representación de polígonos
613
Columna k
Á
3 16
' I I
7 16
Fila j
1 16
Fila./ + I
v ¡k_
16
FIGURA 10.45. Fracción del error de intensidad que puede distribuirse B las posiciones de pixel adyacentes utilizando un esquema de difusión de errores. 34
48
40
32
29
15
23
31
42
58
56
53
21
5
7
10
so
62
61
45
13
1
2
18
38
46
54
37
25
17
9
26
28
14
22
30
35
49
41
33
20
4
6
11
43
59
57
52
i:
0
3
19
51
63
60
44
24
16
8
27
39
47
55
36
FIGURA 10.46. Un posible esquema de distribución para dividir la matriz de intensidad en 64 clases de difusión de puntos, numeradas de 0 a 63. Una variación del método de difusión de errores es la difusión de puntos. Con este método, la matriz m por n de valores de intensidad se divide en 64 clases, numeradas de 0 a 63, como se muestra en la Figura 10.46. El error entre un error de matriz y la intensidad visualizada se distribuye entonces únicamente a aquellos elementos vecinos de la matriz que tengan un número de clase mayor. La distribución de los 64 números de clase está realizada con el objetivo de minimizar el número de elementos que estén completamente rodeados por elementos con un número de clase inferior, ya que esto tendería a dirigir todos los errores de los elementos circundantes hacia esa posición.
10.10 MÉTODOS DE REPRESENTACIÓN DE POLÍGONOS Los cálculos de intensidad de un modelo de iluminación pueden aplicarse a los procedimientos de representación superficial de varias formas. Podemos utilizar un modelo de iluminación para determinar la intensidad superficial en cada posición de pixel proyectada, 0 bien podemos aplicar el modelo de iluminación a unos pocos puntos seleccionados y aproximar la intensidad en el resto de las posiciones de la superficie. Los paquetes gráficos realizan normalmente la representación superficial utilizando algoritmos de línea de barrido que reducen el tiempo de procesamiento tratando sólo con superficies poligonales y calculando las intensidades superficiales exclusivamente en los vértices. Después, se interpolan las intensidades de los vértices para las otras posiciones de la superficie poligonal. Se han desarrollado otros métodos de representación poligonal basados en líneas de barrido más precisos y asimismo los algoritmos de trazado de rayos permiten calcular la intensidad en cada punto proyectado de la superficie para el caso de superficies tanto planas como curvas. Vamos a considerar primero los esquemas de representación de superficies basados en líneas de barrido que se suelen aplicar al caso de los polígonos. Después, en la Sección 10.I I, examinaremos los métodos que pueden utilizarse en los procedimientos de trazado de rayos.
614
CAPITULO 10
Modelos de iluminación y métodos de representación superficial
Representación superficial con intensidad constante El método más simple para representar una superficie poligonal consiste en asignar el mismo color a todas las posiciones proyectadas de superficie. En este caso, utilizamos el modelo de iluminación para determinar la intensidad ele las tres componentes de color RGB en una única posición de la superficie, como por ejemplo en un vértice o en el centroide del polígono. Este técnica, denominada representación superficial de intensidad constante o representación superficial plana, proporciona un método rápido y simple para mostrar las caras poligonales de un objeto y que puede ser útil para generar rápidamente una imagen que nos indique la apariencia general de una superficie curva, como en la Figura I0.50(b). La representación plana también resulla útil durante las tareas de diseño o en otras aplicaciones en las que queramos identificar rápidamente las caras poligonales individuales utilizadas para modelar una superficie curva. En general, la representación plana de una superficie poligonal proporciona una imagen precisa de la superficie si se cumplen todas las siguientes suposiciones: •
El polígono es una cara de un poliedro y no una malla de aproximación de una superficie curva.
•
Todas las fuentes luminosas que iluminan el polígono están lo suficientemente lejos de la superficie, de modo que N • L y la función de atenuación son constantes para toda el área del polígono.
•
La posición de visualización está lo suficientemente lejos del polígono, de modo que V • R es constante para toda el área del polígono.
Incluso si alguna de estas condiciones no es cierta, podemos seguir aproximando razonablemente bien los efectos de iluminación de la superficie utilizando mecanismos de representación superficial de intensidad constante si las caras poligonales del objeto son pequeñas.
Representación de superficies por el método de Gouraud Este esquema, desarrollado por Henri Gouraud y denominado representación de superficies por el método de Gouraud o representación de superficies por interpolación de la intensidad, interpola linealmente los valores de intensidad de los vértices en las caras poligonales de un objeto iluminado. Desarrollado para representar una superficie curva que esté aproximada mediante una malla poligonal, el método de Gouraud efectúa una transición suave entre los valores de intensidad de una cara poligonal y los valores de las caras poligonales adyacentes, a lo largo de las aristas comunes. Esta interpolación de intensidades en el área del polígono elimina las discontinuidades de intensidad que pueden aparecer en la representación plana de superficies. Cada sección poligonal de una superficie curva teselada se procesa mediante el método de representación de superficies de Gouraud utilizando los siguientes procedimientos: (1)
Se determina el vector unitario normal promedio en cada vértice del polígono.
(2)
Se aplica un modelo de iluminación en cada vérlicc del polígono para obtener la intensidad luminosa en dicha posición.
(3)
Se interpolan linealmente las intensidades de los vértices para el área proyecta del polígono.
En cada vértice del polígono, obtenemos un vector normal calculando el promedio entre los vectores normales de todos los polígonos de la malla de la superficie que comparten dicho vértice, como se ilustra en la figura 10.47. Así, para cualquier posición de vértice V, obtenemos el vector unitario normal del vértice mediante la fórmula: (10.51)
Una vez obtenido el vector normal en el vértice, invocamos el modelo de iluminación para calcular la intensidad superficial en dicho punto.
10,10 Métodos de representación de polígonos
615
x
FIGURA 10.48. Para representar la superlieie de Gouraud, la intensidad en el punto 4 se interpola línealmente a partir de las intensidades en los vértices I y 2. La intensidad en el punto 5 se interpola línealmente a partir de las intensidades en los vértices 2 y 3. En un punto interior p se asigna un valor de iniensidad que se interpole linealmente a partir de las intensidades en las posiciones 4 y 5.
FIGURA 10.47. El vector normal en el vertice V se calcula como promedio de las normalcs de superficie para cada uno de los polígonos que comparten dicho vértice.
Después de haber calculado todas las intensidades de vértice para una cara poligonal, podemos interpolar los valores de los vértices para obtener las intensidades en las posiciones situadas a lo largo de las líneas de barrido que intersecten con el área proyectada del polígono, como se ilustra en la Figura 10.48. Para cada línea de barrido, la intensidad de la intersección de la línea de barrido con una arista del polígono se interpone linealmente a partir de las intensidades de los extremos de dicha arista. Para el ejemplo de la Figura 10.48, la arista del polígono cuyos extremos están en las posiciones 1 y 2 es intersectada por la linea de barrido en el punto 4. Un método rápido para obtener la intensidad en el punto 4 consiste en interpolar entre los valores correspondientes a los vértices I y 2 utilizando únicamente el desplazamiento vertical de la línea de barrido: / = ^ ^ / , + ^ 4
V|-y
2
:
:
^ /
1
(10.52)
V,-y.
En esta expresión, el símbolo / representa la intensidad de una de las componentes de color RGB. De forma similar, la intensidad en la intersección derecha de esta línea de barrido (punto 5) se interpola a partir de los valores de intensidad en los vértices 2 y 3. Partiendo de estas dos intensidades de los extremos, podemos interpolar linealmente para obtener las intensidades de píxcl en las distintas posiciones que componen la linea de barrido. La intensidad de una de las componentes de color RGB en el punto p de la Figura 10.48, por ejemplo, se calcula a partir de las intensidades de los puntos 4 y 5 como: x. -x - v - x , ¡„=^-^-¡^^—^1, n
(10.53)
En la implementación de los mecanismos de representación de Gouraud, podemos realizar los cálculos de intensidad representado por las licuaciones 10.52 y 10.53 de manera eficienle utilizando métodos increméntales. Comenzando por una línea de barrido que intersecte uno de los vértices del polígono, podemos obtener incrementalmente los valores de intensidad para otras líneas de barrido que intersecten una arista conectada a dicho vértice. Suponiendo que las caras poligonales sean convexas, cada línea de barrido que cruce el polígono tendrá dos intersecciones con las aristas, como por ejemplo los puntos 4 y 5 de la Figura 10.48. Una vez obtenidas las intensidades en las dos intersecciones de la línea de barrido con las aristas, aplicamos los procedimientos increméntales para obtener las intensidades de pixel en la línea de barrido.
616
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Como ejemplo del cálculo incremental de las intensidades, vamos a considerar las líneas de barrido y - l de la Figura 10.49, que intersectan la arista izquierda de un polígono. Si la línea de barrido^ es la línea de barrido situada inmediatamente por debajo del vértice de .y, con intensidad / , , es decir j> = y - 1, podemos calcular la intensidad / en la línea de barrido .y a partir de la Ecuación 10.52, de la manera siguiente: }
(10.54)
Si continuamos bajando por la arista del polígono, la intensidad en la arista para la siguiente línea de barri(10.55)
Así, cada valor sucesivo de intensidad al descender por la arista se calcula simplemente sumando el término constante (/ - I )/(y - y ) al valor de intensidad anterior. Se utilizan cálculos increméntales similares para obtener las intensidades en las sucesivas posiciones de pixel horizontales dentro de cada línea de barrido. Los mecanismos de representación superficial de Gouraud pueden combinarse con un algoritmo de detección de superficies ocultas con el fin de rellenar los polígonos visibles para cada línea de barrido. En la Figura 10.50(c) se muestra un ejemplo de objeto tridimensional representado por el método de Gouraud. 2
l
l
2
líneas de barrido
x *+
FIGURA 10.49. Interpolación incremental de los valores de intensidad a lo largo de una arista de un polígono para líneas de barrido sucesivas.
FIGURA 10.50. Una aproximación de un objeto mediante malla poligonal (a) se muestra utilizando representación superficial plana en (b) y representación superficial de Gouraud en (c).
10.10 Métodos de representación de polígonos 6 1 7
Este método de interpolación de la intensidad elimina las discontinuidades asociadas con los mecanismos de representación plana, pero presenta algunas otras deficiencias. Los resaltes en la superficie se muestran en ocasiones con formas anómalas y la interpolación lineal de la intensidad puede provocar la aparición de trazos brillantes u oscuros, denominados b a n d a s de M a c h , sobre la superficie. Estos efectos pueden reducirse dividiendo la superficie en un número mayor de caras poligonales o utilizando cálculos de intensidad más precisos.
Representación superficial de Phong Un método más preciso de interpolación para la representación de un malla poligonal fue el que desarrolló posteriormente Phong Bu i Tuong. Esta técnica, denominada representación superficial de Phong o representación por interpolación de los vectores normales, realiza una interpolación de los vectores normales en lugar de interpolar los valores de intensidad. El resuUado es un cálculo más preciso de los valores de intensidad, una imagen más realista de los resaltes de la superficie y una enorme reducción en los efectos de bandas de Mach. Sin embargo, el método de Phong requiere realizar más cálculos que el método de Gouraud. Cada sección poligonal de una superficie curva teselada se procesa mediante el método de representación superficial de Phong utilizando los siguientes procedimientos: (1)
Se determina el vector unitario normal promedio en cada vértice del polígono.
(2)
Se interpolan linealmente las normales a los vértices para el área proyectada del polígono.
(3)
Se aplica un modelo de iluminación en las distintas posiciones de las líneas de barrido para calcular las intensidades de los píxeles utilizando los vectores normales interpolados.
Los procedimientos de interpolación para vectores normales en el método de Phong son los mismos que para los valores de intensidad en el método de Gouraud. El vector normal N de la Figura 10.51 se interpola verticalmente a partir de los vectores normales en los vértices 1 y 2 mediante la fórmula: N =
JSMf, + A l 2 L N ,
(10.56)
v
INI
>i-- 2
Después, aplicamos los mismos métodos increméntales para obtener los vectores normales en las sucesivas líneas de barrido y en las sucesivas posiciones de píxel dentro de cada línea de barrido. La diferencia entre las dos técnicas de representación superficial es que ahora deberemos aplicar el modelo de iluminación para cada posición de píxel proyectada dentro de las líneas de barrido, con el fin de obtener los valores de intensidad superficial.
Representación superficial rápida de Phong Podemos reducir el tiempo de procesamiento en el método de representación de Phong realizando ciertas aproximaciones en los cálculos del modelo de iluminación. Los algoritmos de representación superficial rápida de Phong llevan a cabo los cálculos de intensidad utilizando una expansión en serie de Taylor truncada y limitando las caras poligonales a parches de superficie triangulares.
de barrido v
FIGURA 10.51. Interpolación de las normales a la superficie a lo largo de una arista de un polígono.
618
CAPITULO 10
Modelos de iluminación y métodos de representación superficial
Puesto que el método de Phong interpola ios vectores normales a partir de las normales en los vértices, podemos escribir la expresión para el cálculo de la normal N a la superficie en la posición (x,y) de un parche triangular como: N = Ax + Bv + C (10.57) donde los vectores A, B y C se determinan a partir de las tres ecuaciones de los vértices: N = Ax + Ey + C, A
k
k = 12, 3
k
(10.58)
donde (x ,y ) denota una posición proyectada de un vértice del triángulo sobre el plano de píxeles. Si omitimos los parámetros de rellectividad y atenuación, podemos escribir los cálculos para la reflexión difusa de la luz de una fuente luminosa en un punto de la superficie (x, y) como: k
k
L||N| =
L - ( A r + B;y + C ) | L | | A x + By + C|
^ ( L - A ) x + (L-B).y + L - C |L||Ar + B v + C | Esta expresión puede escribirse en la forma: ax + by + e J
2
[dx ' + exy + / y + gx+hy + /] donde se utilizan parámetros como a, />, c y d para representar los diversos productos escalares. Por ejemplo, fl = 1 7 T
(10-61)
Finalmente, podemos expresar el denominador de la Ecuación 10.60 como una expansión en serie de Taylor y retener los términos de hasta segundo grado en x ey. Esto nos da: 2
2
J ¿x,y) = T x + T xy + T y +T x+T y-r T á[f
s
4
3
2
{
0
(10.62)
donde cada T es función de los diversos parámetros de la Ecuación 10.60, como a, ¿ y e . Utilizando diferencias finitas, podemos evaluar la Ecuación 10.62 con sólo dos sumas para cada posición de pixel ( J , V ) , una vez que hayamos evaluado los parámetros iniciales de diferencias finitas. Aunque las simplificaciones en el método rápido de Phong reducen los cálculos requeridos para la representación superficial de Phong, sigue siendo necesario un tiempo aproximadamente igual a dos veces el correspondiente a la representación superficial de Gouraud. Y el método básico de Phong, utilizando diferencias finitas, es de 6 a 7 veces más lento que el algoritmo de representación de Gouraud. Los mecanismos de representación rápida de Phong para reflexión diñisa pueden ampliarse para incluir reflexiones especulares utilizando aproximaciones similares para evaluar los términos especulares tales como (N • H)"*. Además, podemos generalizar el algoritmo para incluir una posición de visualización finita y otros polígonos distintos de los triángulos. k
10.11 MÉTODOS DE TRAZADO DE RAYOS En la Sección 8.20, hemos presentado la noción de proyección de rayos, que es una técnica que se utiliza en geometría constructiva de sólidos para localizar las intersecciones con las superficies a lo largo de la trayec-
10.11 Métodos de trazado de rayos
619
Mi
w ^ PuiiUi de
referencia de proyección
mes de en el plano "Xpíxel Posieii de proyección Dlxel en
FIGURA 10.52. Trayectos múltiples de rellexión y transmisión para un rayo trazado desde el punto de referencia de proyección a través de una posición de píxel y a través de una escena que contiene diversos objetos.
FIGURA 10.53. Una escena generada mediante trazado de rayos, donde se muestran los efectos globales de reflexión y transparencia. (Cortesía de Evarts <& Satheriatul) toria de un rayo trazado desde una posición de píxel. También hemos hablado de los métodos de proyección de rayos en la Sección 9.1() como medio para identificar las superficies visibles en una escena. El trazado de rayos es la generalización del procedimiento básico de proyección de rayos. En lugar de limitamos a localizar la superficie visible desde cada posición de píxel, lo que hacemos es continuar rebotando el rayo correspondiente al píxel a través de la escena, como se ilustra en la Eigura 10.52, con el fin de recopilar las diversas contribuciones de intensidad. Esto proporciona una técnica simple y potente de representación para obtener efectos globales de rellexión y transmisión. Además, el algoritmo básico de trazado de rayos detecta las superIkies visibles, identifica las áreas en sombra, permite representar efectos de transparencia, genera vistas de proyección en perspectiva y admite efectos de iluminación con múltiples fuentes luminosas. Se han desarrollado numerosas extensiones del algoritmo básico para la generación de imágenes fotorrealistas. Las imágenes de escenas generadas mediante trazado de rayos pueden ser enormemente realistas, particularmente cuando la escena contiene objetos brillantes, pero los algoritmos de trazado de rayos requieren un tiempo de eálculo considerable. En la Eigura 10.53 se muestra un ejemplo de los efectos globales de rellexión y transmisión que pueden conseguirse mediante las técnicas de trazado de rayos.
620
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Algoritmo básico de trazado de rayos El sistema de coordenadas para un algoritmo de trazado de rayos suele definirse como se muestra en la Figura 10.54, con el punto de referencia de proyección en el eje z y las posiciones de pixel en el plano xy. Después describimos la geometría de una escena en este sistema de coordenadas y generamos los rayos correspondientes al pixel. Para una lista de proyección en perspectiva de la escena, cada rayo se origina en el punto de referencia de proyección (centro de proyección), pasa a través del centro de un pixel y se adentra en la escena para formar las diversas ramas del rayo, según los trayectos de reflexión y transmisión. Las contribuciones a la intensidad del pixel se acumulan entonces para las distintas superficies intersectadas. F-sta técnica de representación está basada en los principios de la óptica geométrica. Los rayos luminosos que salen de las superficies de una escena emanan en todas direcciones y algunos de ellos pasan a través de las posiciones de pixel situadas en el plano de proyección. Puesto que hay un número infinito de emanaciones de rayos, determinamos las contribuciones de intensidad para un pixel concreto trazando hacia atrás el trayecto luminoso desde la posición del pixel hacia la escena. En el algoritmo básico de trazado de rayos, se genera un rayo luminoso para cada pixel. Á medida que se genera el rayo de cada pixel, se procesa la lista de superficies de la escena para determinar si el rayo intersecta con alguna de ellas. En caso afirmativo, calculamos la distancia desde el pixel al punto de intersección con la superficie. Una vez comprobadas todas las superficies, la distancia de intersección calculada más pequeña identificará la superíicie visible para dicho pixel. Entonces reflejamos el rayo en la superficie visible según un proyecto de reflexión especular (ángulo de reflexión igual al ángulo de incidencia). Para una superficie transparente, también enviamos un rayo a través de la superficie en la dirección de refracción. Los rayos reflejado y refractado se denominan rayos secundarios. Repetimos entonces los procedimientos de procesamiento de rayos para los rayos secundarios. Comprobamos si existen intersecciones con las superficies y, en caso afirmativo, se usa la superficie intersectada más próxima a lo largo de la trayectoria de un rayo secundario para producir recursivamente la siguiente generación de trayectos de reflexión y refracción. A medida que los rayos de un pixel se bifurcan a través de una escena, cada superficie recursivamente intersectada se añade a un árbol de trazado de rayos binario, como se muestra en la Figura 10.55. Utilizamos las ramas izquierdas del árbol para representar los trayectos de reflexión y las ramas derechas para representar los trayectos de transmisión. La profundidad máxima de los árboles de trazado de rayos puede configurarse como opción del usuario o puede determinarse según la cantidad de almacenamiento disponible. Terminamos cada trayecto del árbol binario correspondiente a un pixel si se cumple cualquiera de las siguientes condiciones: •
El rayo no intersecta ninguna superficie.
•
El rayo intersecta a una fuente de luminosa que no es una superficie rellectante.
•
El árbol ha alcanzado su profundidad máxima permitida.
10.11 Métodos de trazado de rayos
621
referencia de proyección (a)
(b)
FIGURA 10.55. Los Irayeclos de reflexión y refracción para un rayo de píxel que viaja a través de una escena se muestran en (a) y el correspondiente árbol binario de trazado de rayos se indica en (b).
FIGURA 10.56. Vectores unitarios en la superticie de un objeto interseclado por un rayo que incide según la dirección u.
En cada intersección con una superficie, invocamos el modelo básico de iluminación para determinar la contribución de dicha superficie a la intensidad. Este valor de intensidad se almacena en la posición correspondiente al nodo de la superficie dentro del árbol del píxel. A un rayo que inlersecte una fuente luminosa no reflectante se le puede asignar la intensidad de la fuente, aunque las fuentes luminosas en el algoritmo básico de trazado de rayos son usualmente fuentes puntuales situadas en posiciones que caen más allá de los límites de coordenadas de la escena. La figura 1 0 . 5 6 muestra una superficie inlerseclada por un rayo y los vectores unitarios utilizados para los cálculos de la intensidad luminosa reflejada. El vector unitario u define la dirección de la trayectoria del rayo, N es el vector unitario normal a la superficie, R es el vector unitario de reflexión, L es el vector unitario que indica la dirección de una fuente luminosa puntual y H es el vector unitario medio entre L y V. Para los cálculos de trazado de rayos, la dirección de visualización es V = —u. El trayecto definido según la dirección de L se denomina rayo de s o m b r a . Si algún objeto intersecta el rayo de sombra entre la superficie y la fuente luminosa puntual, dicha posición de la superficie estará en sombra con respecto a la fuente. La luz ambiente en la superficie se calcula como kj la reflexión difusa debido a la fuente es proporcional a k (N • L) y la componente de reflexión especular es proporcional a A (H • N ) " A . Como se explica en la Sección 1 0 . 3 , la dirección reflexión de especular para el trayecto del rayo secundario R depende de la normal a la superficie y de la dirección del rayo incidente: a>
(¡
¥
R = u - (2u • N ) N
110.63)
622 CAPITULO 10 Modelos de iluminación y métodos de re prese ni ación superficial
FIGURA 10.57. Trayecto de transmisión del rayo refractado T a través de un material transparente.
inciderne
Para una superficie transparente, necesitamos también obtener las contribuciones de intensidad de la lu/ transmitida (refractada) a través del material. Podemos localizar la fuente de esta contribución trazando un rayo secundario según la dirección de transmisión T, como se muestra en la Figura 10.57. El vector unitario de transmisión T puede obtenerse a partir de los vectores u y N de la forma siguiente: (10.64)
COSO, - ^ - c o s Ö ,
N
Los parámetros r¡ y t] son los índices de refracción en el material incidente y en el material refractante, respectivamente. El ángulo de refracción 6 puede calcularse a partir de la ley de Snell: i
r
3
Después de haber completado el árbol binario para un píxel, se acumulan las contribuciones de intensidad, comenzando por la parle inferior (nodos terminales) del árbol. La intensidad superficial correspondiente a cada nodo del árbol se atenúa según la distancia con respecto a la superficie padre (el siguiente nodo subiendo por el árbol) y se suma a la intensidad existente en dicha superficie padre. La intensidad asignada al pixel es la suma de las intensidades atenuadas en el nodo raíz del árbol de rayos. Si el rayo principal de un píxel no intersecta ningún objeto de la escena, el árbol de trazado de rayos estará vacío y se asignará al píxel la intensidad de fondo.
Cálculos de intersección entre rayos y superficie Un rayo puede describirse con una posición inicial P y un vector de dirección unitario u, como se ilustra en la Figura 10.58. Las coordenadas para cualquier punto P situado a lo largo del rayo, a una distancia s de P„, se calculan entonces a partir de la ecuación del rayo: 0
P = P,
su
(I0M)
Inicialmente, el vector P puede definirse en la posición P del píxel del plano de proyección, o puede seleccionarse como posición inicial el punto de referencia de proyección. El vector unitario u se obtiene inicialmente a partir de la posición del píxel a través de la cual pasa un rayo y del punto de referencia de proyección: 0
p i x
(10.67) pi*
prp
p - P Aunque no es necesario que u sea un vector unitario, si lo es, se simplificarán algunos de los cálculos.
1 0 . 1 1 Métodos de trazado de rayos 623
FIGURA 10.58. Descripción de un rayo con un vector de posición inicial P y un vector de dirección unitario u. ()
Para localizar el punto de intersección del rayo con una superficie, utilizamos la ecuación de la superficie para hallar la posición P. como se representa en la Ecuación 10.66. Esto nos da un valor para el parámetro v, que es la distancia desde P hasta el punto de intersección con la superficie a lo largo de la trayectoria del rayo. En cada superficie intersectada, los vectores P y u se actualizan para los rayos secundarios en el punto de intersección entre el rayo y la superficie. Para los rayos secundarios, la dirección de reflexión para u es R y la dirección de transmisión es T. Cuando se detecta una intersección entre un rayo secundario y una superficie, se resuelve un sistema formado por la ecuación del rayo y la ecuación de la superficie para obtener las coordenadas de intersección, después de lo cual se actualiza el árbol binario y se genera el siguiente conjunto de rayos de reflexión y refracción. Se han desarrollado algoritmos eficientes de cálculos de intersecciones entre rayos y superficies para las formas que más comúnmente aparecen en las escenas, incluyendo diversas superficies de tipo splitw. El procedimiento general consiste en combinar la ecuación del rayo con las ecuaciones que describen la superficie y resolver el sistema para obtener el valor del parámetro $, En muchos casos, se utilizan métodos numéricos de localización de raíces y cálculos increméntales para localizar los puntos de intersección con una superficie. Para objetos complejos, a menudo resulta conveniente transformar la ecuación del rayo al sistema (Je coordenadas local en el que el objeto está definido. Asimismo, los cálculos de intersección para un objeto complejo pueden simplificarse en muchos casos transformado el objeto a una forma más adecuada. Como ejemplo, podemos efectuar los cálculos de trazado de rayos para una elipsoide transformando las ecuaciones del rayo y de la superficie a un problema de intersección con esferas. La Figura 10.59 muestra una escena con trazado de rayos que contiene múltiples objetos y patrones de textura. t)
0
Intersecciones entre rayos y esferas Los objetos más simples para efectuar un trazado de rayos son las esferas. Si tenemos una esfera de radio r y centro P (Figura 10.60), cualquier punto P de la superficie satisfará la ecuación de la esfera: c
2
2
|P - P J - r = 0 f
(JQJ8)
FIGURA 10.59. Una escena de un trazado de rayos que muestra los efectos de reflexión global de los patrones de textura de las superficies. {Cortesia de Sun Microsystems. )
624
CAPÍTULO 10 Modelas ¡le iluminación y métodos de representación superficial
FIGURA 10.60. Un rayo imersecta una esfera con radio r y centro P
Sustituyendo la Ecuación del rayo 10.66 para P en la ecuación anterior, tenemos: 2
2
|P - su - P,| - r = 0
(10.69)
0
Si representamos P
P„ como AP y expandimos el producto escalar, obtenemos la ecuación cuadrática: 2
2
.v- - 2(u • AP)s + (|AP| - r ) = 0
(10.70)
cuya solución es:
í = u-AP±V(u-AP) -|AP| +r J
2
U
0
7
l
)
Si el discriminante es negativo, o bien el rayo no intersecUi la es lera 0 la esleía se encuentra detrás de P , fin cualquiera de los dos casos, podemos eliminar la esfera de los cálculos posteriores, ya que asumimos que la escena se encuentra delante del plano de proyección. Cuando el discriminante no es negativo, se obtienen las coordenadas de intersección con la superficie a partir de la ecuación del rayo 10.66 utilizando el más pequeño de los dos valores de la Ecuación 10.71. La figura 10.61 muestra una escena de trazado de rayos que contiene un copo de nieve formado por esferas brillantes y donde se ilustran los efectos de reflexión global en las superficies que se pueden obtener mediante trazado de rayos. a
FIGURA 10.61. Un copo de nieve representado mediante trazado de rayos y donde se utilizan 73S l esferas y 3 (beata luminosas. {Cortesía Je Eric Haines, AutoJesk, Inc.)
10.11 Métodos de trazado de rayos
625
Resulta posible realizar algunas optimizaciones en los cálculos de intersección entre el rayo y la esfera con el fin de reducir el tiempo de procesamiento. Además, la Ecuación 10.71 está sujeta a errores de redondeo cuando se procesa una esfera de pequeño tamaño que está muy alejada de la posición inicial del rayo. Es decir, si: «|AP| 2
podríamos perder el término r debido a los errores de precisión de |AP| . Podemos evitar esto en la mayoría de los casos reordenando los cálculos correspondientes a la distancia s de la forma siguiente: 2
AP-(u
AP)u
i (172)
Intersecciones entre rayos y poliedros Los cálculos de intersección para poliedros son más complicados que para las esferas. Por tanto, a menudo resulta más eficiente procesar un poliedro realizando un test inicial de intersección sobre un volumen que lo encierre. Por ejemplo, la Figura 10.62 muestra un poliedro dentro de una esfera. Si un rayo no interseela la esfera circunscrita, eliminamos el poliedro de las comprobaciones posteriores. En caso contrario, identificamos a continuación las caras frontales del poliedro como esos polígonos que satisfagan la desigualdad: u •N<0
(¡0.73)
donde N es la normal a la superficie del polígono. Para cada cara del poliedro que satisfaga la condición 10.73, resolvemos la ecuación del plano: N • P = -D
(10.74)
para calcular la posición P que también satisfaga la ecuación del rayo 10.66. Aquí, N = (A, #, C) y D es el cuarto parámetro del plano. La posición P estará tanto en el plano como en el trayecto del rayo si se cumple que: N-(^+.vu)=-D
(¡0.75)
y la distancia desde la posición inicial del rayo hasta el plano es: P + N-P
ü
(¡0.76)
N•11
Esto nos da una posición sobre el plano infinito que contiene la cara poligonal, pero esta posición puede no estar dentro de las fronteras del polígono (Figura 10.63). Por tanto, necesitamos realizar una comprobación de si el punto está dentro del polígono (Sección 3.15) para determinar si el rayo intersecta esta cara del poliedro. Realizaremos este test para cada cara que satisfaga la desigualdad 10.73. La distancia s más pequeña hasta un polígono intersectado identifica la posición de intersección sobre la superficie del poliedro. Si ninguno de
FIGURA 10.62. Un poliedro encerrado en una esfera circunscrita.
626
CAPITULO 10 Modelos de iluminación y métodos de representación superficial
FIGURA 10.63. Intersección de un rayo en el plano de un polígono. los puntos de intersección de la Ecuación 10.76 son puntos interiores a los polígonos, el rayo no intersecta el poliedro.
Reducción de los cálculos de intersección con los objetos Los cálculos de intersección entre las superficies y los rayos pueden representar hasta un 95 por ciento del tiempo de procesamiento en una representación mediante trazado de rayos de una escena. Para una escena con muchos objetos, la mayor parte del tiempo de procesamiento para cada rayo se invierte en comprobar objetos que no son visibles según el trazado del rayo. Por tanto, se han desarrollado diversos métodos para reducir el tiempo de procesamiento invertido en estos cálculos de intersecciones. Un método para reducir los cálculos de intersecciones consiste en encerrar grupos de objetos adyacentes dentro de un volumen de contorno, como por ejemplo una esfera o un paralelepípedo (Figura 10.64). Entonces, podemos ver si existen intersecciones de los rayos con el volumen de contorno. Si el rayo no intersecta la superficie del contorno, eliminamos las superficies encerradas de las comprobaciones sucesivas de intersección. Esta técnica puede ampliarse para incluir una jerarquía de volúmenes de contorno. En otras palabras, podemos encerrar varios volúmenes de contorno dentro de un volumen mayor y llevar a cabo las com probaciones de intersección jerárquicamente; primero comprobamos el volumen más externo, después comprobamos en caso necesario los volúmenes de contorno interiores, etc.
Métodos de subdivisión espacial Otra forma de reducir los cálculos de intersecciones consiste en utilizar procedimientos de subdivisión espacial. Podemos encerrar una escena completa dentro de un cubo y luego subdividir sucesivamente el cubo hasta que cada subregión (celda) no contenga más de un número máximo de superficies prefijado. Por ejemplo podemos obligar a que cada celda no contenga más de una superficie. Si hay disponibles capacidades de procesamiento vectoriales y en paralelo, el número máximo de superficies por celda puede determinarse según el tamaño de los registros de vectores y el número de procesadores. La subdivisión espacial del tubo puede almaEsfera de contorno
FIGURA 10.64. Un grupo de objetos dentro de una esfera.
1 ü. 11 Métodos de trazado de rayos 627
FIGURA 10.65. Intersección de un rayo con un cubo que encierra a todos los objetos de una escena.
FIGURA 10.66. Recorrido del rayo a través de una suforegión (celda) de un cubo que encierra a una escena.
cenarse en un árbol octal o en un árbol de partición binaria. Además, podemos realizar una subdivisión uniforme dividiendo cada cubo en ocho ociantes de igual tamaño en cada caso, o podemos realizar una subdivisión adaptad va subdividiendo únicamente aquellas regiones del tubo que contengan objetos. A continuación, trazamos los rayos a través de las celdas individuales del cubo, realizando comprobaciones de intersección sólo dentro de aquellas celdas que contengan superficies. La primera superficie intersectada será la superficie visible para ese rayo. Existe un compromiso, sin embargo, entre el tamaño de celda y el número de superficies por celda. A medida que reducimos el número máximo de superficies permitidas por celda, se reduce la cantidad de procesamiento necesaria para las pruebas de intersección con las superficies, pero esto reduce también el tamaño de las celdas, por lo que son necesarios más cálculos para determinar la trayectoria del rayo a través de las celdas. La Figura 10.65 ilustra la intersección del rayo de un píxel con la cara frontal de un cubo que rodea a una escena. La posición de intersección en la cara frontal del cubo identifica la celda inicial que tiene que atravesar este rayo. Después, procesamos el rayo a través de las celdas del cubo determinando las coordenadas de las posiciones de entrada y de salida (Figura 10.66). En cada celda no vacía, comprobamos las intersecciones con las superficies y este procesamiento continúa hasta que el rayo intersecta una superficie de un objeto o sale del cubo delimitador. Dado un vector unitario de dirección del rayo u y una posición de entrada del rayo P para una celda, identificamos las caras potenciales de salida de una celda como aquellas que satisfacen la desigualdad: in
u-N >0
{10.77)
A
donde N representa el vector unitario normal a la superficie para la cara k de la celda. Si los vectores unitarios normales a las caras de la celda de la Figura 10.66 están alineados con los ejes de coordenadas cartesianas, entonces, ¿
(±1,0,0) N.
00.78)
(0,11,0) (0,0,±l)
y podemos determinar los tres planos candidatos de salida simplemente comprobando el signo de cada componente de u. La posición de salida en cada plano candidato se obtiene a partir de la ecuación del rayo:
feHLrfui donde s es la distancia según el rayo desde P a P plano para cada cara de la celda, tenemos: . k
in
N
í
P
ü u U
u
u
<
/ft79
>
- Sustituyendo la ecuación del rayo en la ecuación del u
=
_
D
i
ilO.SO)
628
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
y la distancia del rayo a cada cara candidala de salida se calcula corno:
El valor más pequeño calculado para s identifica la cara de salida para la celda. Si las caras de las celdas están alineadas en paralelo con los planos de coordenadas cartesianas, los vectores normales N son los vectores unitarios I0.7S según los ejes y podemos simplificar los cálculos de la Ecuación I0.8I. Por ejemplo, si un plano candidato de salida tiene el vector normal ( 1 , 0 , 0), entonces para ese plano tendremos: k
A
(10.82) donde u = (w , Uyí ftú» #¿ = ~ D es la posición de coordenadas del plano candidalo de salida y # es la posición de coordenadas de la cara de entrada de la celda. Pueden realizarse diversas modificaciones a los procedimientos de recorrido de las celdas para acelerar el procesamiento. Una posibilidad consiste en elegir un plano de salida candidato k que sea perpendicular a la dirección de la componente de u de mayor tamaño, liste plano de salida candidato se divide entonces en sectores, como se muestra en el ejemplo de la Figura 10.67. El sector del plano candidato que contenga P determinará el verdadero plano de salida. Por ejemplo, si el punto de intersección P está en el sector 0 para el plano de ejemplo de la Figura 10.67, el plano que habíamos elegido es el verdadero plano de salida y habríamos terminado. Si el punto de intersección está en el sector 1, el verdadero plano de salida será el plano superior y necesitaremos simplemente calcular el punto de salida en la frontera superior de la celda. De la misma forma, el sector 3 identifica el plano inferior como verdadero plano de salida y los sectores 4 y 2 identifican como verdadero plano de salida los planos izquierdo o derecho de la celda, respectivamente. Cuando el punto de salida en el plano candidato cae en los sectores 5, 6 , 7 u 8, debemos llevar a cabo dos cálculos de intersección adicionales para identificar el verdadero plano de salida. La implemenlación de estos métodos en máquinas vectoriales de procesamiento en paralelo permite obtener incrementos aún mayores en la velocidad. La escena de la Figura 10.68 se obtuvo mediante trazado de rayos empleando métodos de subdivisión espacial. Sin la subdivisión espacial, los cálculos de trazado de rayos tardaban 10 veces más. La eliminación de los polígonos también permitía en este ejemplo acelerar el procesamiento. Para una escena que contenga 20.48 esfera y ningún polígono, el mismo algoritmo se ejecutaba 46 veces más rápido que el algoritmo básico de trazado de rayos. La Figura 10.6° ilustra otro esquema obtenido mediante trazado de rayos utilizando subdivisión espacial y métodos de procesamiento en paralelo. Esta imagen de la escultura de Rodin /:'/ Pensador se obtuvo mediante trazado de rayos en 24 segundos utilizando más de 1.5 millones de rayos. Para obtener la escena de la Figura 10.70 se empleo una técnica de hi'tfcr luminoso, que es un tipo de particionamiento espacial. Aquí, hay un cubo centrado en cada fuente luminosa puntual y cada cara del cubo se particiona utilizando una cuadrícula de elementos cuadrados. Entonces, el paquete de trazado de rayos mantiene una lista ordenada de los objetos que son visibles para los haces luminosos a través de cada cuadrado. v
k
0
o u U ¡
o u |k
FIGURA 10.67. Un plano candidato de salida de ejemplo, junto con sus seelores numerados.
1 ü. 11 Métodos de trazado de rayos 629
FIGURA 10.68. Una escena obtenida mediante trazado de rayos en paralelo que contiene 37 esferas y 720 superficies poligonales. El algoritmo de trazado de rayos utiliza 9 rayos por pixel y una profundidad de árbol de 5. Los métodos de subdivisión espacial permitían procesar la escena 10 veces más rápido que el algoritmo básico de trazado de rayos en un Alliant KX/8. [Cortesía de Lee-Htan Quek. Oracle Corporation. Redwood Shores, California )
FIGURA 10.69. lista escena obtenida mediante trazado de rayos tardaba 24 segundos en representarse en una computadora paralela Kendall Square Research KSR1 con 32 procesadores. La escultura de Rodin El Pensador fue modelada con 3.036 primitivas. Se usaron dos fuentes luminosas y un rayo principal por píxel para obtener los efectos globales de iluminación a partir de los 1.675.776 rayos procesados. {Cortesía de M. J Keates y R. J llubbold. Departamento de Computer Science, Universidad de Manchester, Reino Unido.) con el fin de acelerar el procesamiento de los rayos de sombra. Como medio para determinar ios efectos de iluminación superficial, se calcula un cuadrado para cada rayo de sombra y luego se procesa el rayo de sombra de acuerdo con la lista de objetos correspondientes a dicho cuadrado. Las comprobaciones de intersección en los programas de trazado de rayos también pueden reducirse mediante procedimientos de subdivisión direccional, considerando sectores que contengan un haz de rayos. Dentro de cada sector, podemos ordenar las superficies según su profundidad, como en la Figura 10.71, Cada rayo necesita entonces comprobar únicamente los objetos correspondientes al sector que contiene a dicho rayo.
630
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
FIGURA 10.70. Escena de una habitación iluminada con S rúenles luminosas y representada (a) utilizando la técnica de trazado de rayos basada en bufet luminoso para procesar los rayos de sombra. Un primer plano (b) de parte de la habitación mostrada en (a) iluslra los electos globales de iluminación. La habitación está modelada por 12.98 polígonos, 4 esferas, 76 cilindros y cuádricas. Él tiempo de representación fue de 246 minutos en un VAX 11/780. comparado con 602 minutos sin la utilización de búferes luminosos. (Cortesìa de Eric llaines y Donald P. Greenherg, Program of Computer (irapliics. Cornell University )
a un lia/ de rayos
FIGURA 10.71. Subdivisión direccional del espacio. Los rayos de los píxeles en el sector indicado realizan comprobaciones de intersección en orden de profundidad únicamente para las superficies contenidas dentro de ese sector.
Simulación de los efectos de enfoque de la cámara Para modelar los efectos de la cámara en una escena, especificamos la longitud de enfoque y otros parámetros para un objetivo convexo (o apertura de la cámara) que haya que colocar delante del plano de proyección. Los parámetros del objetivo se configuran entonces de modo que algunos objetos de la escena puedan estar enfocados mientras que otros aparecerán desenfocadas. La distancia focal del objetivo es la distancia desde el centro del objetivo hasta el punto local /•", que es el punto de convergencia para un conjunto de rayos paralelos que pasan a través de la lente, como se ilustra en la Figura 10.72. Un valor típico para la distancia focal de una cámara de 35 mm e s / = 50 mm. Las aperturas de las cámaras suelen describirse mediante un parámetro n, denominado número-f o f-stop, que es el cociente entre la distancia íócal y el diámetro de apertura:
10.11 Métodos de trazado de rayos
631
Rayos luminosos paralólos eniranies
lije de la lente
Plano focal
Figura 10.72. Visla latera! de un objetivo. Los rayos paralelos son enfocados por la lente sobre una posición situada en el plano focal, que está a la distancia / del centro de la lente.
Plano del objeto
Plano «le imagen (película)
FIGURA 10.73. Parámetros de un objetivo. Un objeto a una distancia í/del objetivo estará enfocado sobre el plano de imagen a una distancia ¿/ de la lente.
(/0.83) Por tanto, podemos utilizar el radio r o el número-f junto con la distancia focal f, para especificar los parámetros de la cámara. Para conseguir un modelo de enfoque más preciso, podríamos utilizar el tamaño de la película (anchura y altura) y la distancia focal para simular los efectos de la cámara. Los algoritmos de trazado de rayos determinan normalmente los efectos de enfoque utilizando la ecuación de una lente fina de la óptica geométrica:
•U-L-I d
d,
f
(10.84)
632
CAPÍTULO 10
Modelos de iluminación y melados de representación superficial
El parámetro ¿/es la distancia desde el centro de la lenie hasta la posición de un objeto y J es la distancia desde el centro de la lente al plano de imagen, donde ese objeto estará enfocado. El punto del objeto y el de su imagen se encuentran en lados opuestos de la lente, a lo largo de una linea que pasa por el centro de la lente y d > / ( F i g u r a 10.73). Por tanto, para enfocar un objeto concreto situado a una distancia dác la lente, situamos el plano de píxclcs a una distancia d- por detrás del objetivo. Para una posición de la escena situada a una cierta distancia cf # ¿Y, el punto proyectado estará desenfocado en el plano de imagen, si d' > d, el punto estará enfocado en una posición situada delante del plano de imagen, mientras que si d' < d, el punto estará enfocado en una posición situada detrás del plano de imagen. La proyección de un punto situado en la posición d' sobre el plano de imagen es aproximadamente un pequeño círculo, denominado círculo de confusión, y el diámetro de este círculo puede calcularse como: j
s
\d'-d\f nd
Podemos elegir los parámetros de la cámara con el fin de minimizar el tamaño del círculo de confusión para un cierto rango de distancias, denominado profundidad de c a m p o de la cámara. Además, se trazan múltiples rayos para cada pixel con el lin de muestrear distintas posiciones sobre el área del objetivo; hablaremos de estos métodos de trazado de rayos distribuidos en una sección posterior.
Trazado de rayos con antialiasing Dos técnicas básicas de antialiasing empleadas en los algoritmos de trazado de rayos son el sttpermuestreo y el maestreo adaptativo. El muestreo en el trazado de rayos es una extensión de los métodos de antialiasing expuestos en la Sección 4.17. En el supermueslreo y en el muestreo adaptativo, el pixel se trata como un área cuadrada finita en lugar de como un único punto. El supermueslreo utiliza normalmente múltiples rayos equiespaciados (muestras) para cada área de pixel. II muestreo adaptativo utiliza rayos no equiespaciados en algunas regiones del área de pixel. Por ejemplo, pueden usarse más rayos cerca de los bordes de los objetos con el lin de obtener una mejor estimación de las intensidades de los píxeles. (Otro método de muestreo consiste en distribuir aleatoriamente los rayos a lo largo del área del pixel. Hablaremos de esta técnica en la siguiente sección)- Cuando se utilizan múltiples rayos por pixel, las intensidades de los rayos de pixel se promedian para obtener la intensidad global del pixel. La Figura 10.74 ilustra un procedimiento simple de supermueslreo. Aqui, se genera un rayo a través de cada esquina del pixel. Si las intensidades calculadas para los cuatro rayos no son aproximadamente iguales, o si algún pequeño objeto cae entre los cuatro rayos, dividimos el área del pixel en subpixeles y repetimos el proceso. Como ejemplo, el pixel de la Figura 10.75 se divide en nueve subpixeles utilizando 16 rayos, uno en cada esquina de cada subpíxel. Entonces, se utiliza muestreo adaptativo para subdividir aún más dichos sub-
Posiciones de pixel sobra el plano de proyección
FIGURA 10.74. Supermuestreo con cuatro rayos por pixel, uno en cada esquina del pixel.
Punto de referencia de proyección
I ü. 11 Métodos de trazado de rayos 6 3 3
.
•
•
•
j . . I •
•
•
•
FIGURA 1075. Subdivisión de un pixel en 9 subpíxeles con un rayo en cada esquina de cada subpíxel
FIGURA 10.76. lina escena generada mediante trazado de rayos por subdivisión adaptativa. {Cortesia de Jeny í'ann ) píxeles que rodeen a un pequeño objeto o que no tengan rayos de intensidad aproximadamente igual, liste proceso de subdivisión puede continuarse hasta que lodos los rayos de subpíxel tengan aproximadamente las mismas intensidades o hasta que se alcance un limite superior, por ejemplo 256, que indicará el número máximo de rayos por pixel. La Figura 10.76 es un ejemplo de escena representada mediante trazado de rayos con subdivisión adaptativa. Se utiliza tina fuente luminosa compleja para proporcionar sombras suaves y realistas. Se generaron casi 26 millones de rayos principales, con 33.5 millones de rayos de sombra y 67.3 de rayos de reflexión. Para desarrollar las figuras del juego de ajedrez se emplearon técnicas de figuras articuladas (Sección 13.8). Los patrones de superficie de madera veteada y mármol se generaron mediante métodos de texturas sólidas (Sección 10.16) con una función de ruido. Fn lugar de pasar los rayos a través de las esquinas de los píxeles, podemos generar los rayos a través de los centros de los subpíxeles, como en la Figura 10.77. Con este enfoque, podemos ponderar los rayos de acuerdo con alguno de los esquemas de muestren analizados en la Sección 4.17. Otro método para el antialiasing de las escenas generadas consiste en tratar cada rayo de píxel como si fuera un cono, como se muestra en la Figura 10.78. Sólo se genera un rayo por píxel, pero ahora el rayo tiene una sección transversal finita. Para determinar el porcentaje de recubrimiento del área del píxel por parte de los objetos, calculamos la intersección del cono del píxel en la superficie del objeto, Para una esfera, esto requiere hallar la intersección de dos círculos. Para un poliedro, tenemos que hallar la intersección de un circulo con un polígono.
634
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
FIGURA 10.77. Posiciones de rayos centradas en las áreas de subpíxel.
FIGURA 10.78. Un rayo de píxel con forma de cono.
Trazado de rayos distribuido Se trata de un método de muestreo estocástico que distribuye aleatoriamente los rayos de acuerdo con los diversos parámetros de un modelo de iluminación. Los parámetros de iluminación incluyen el área del pixel, las direcciones de reflexión y refracción, el área del objetivo de la cámara y el tiempo. Los efectos del aliasing se sustituyen así con ruido de bajo nivel, que mejora la calidad de una imagen y permite modelar de manera más precisa los efectos de las superficies brillantes y translúcidas, las aperturas finitas de cámara, las fuentes luminosas finitas y la visualización desenfocada de los objetos en movimiento. El trazado de rayos distribuido (también denominado trazado de rayos de distribución) proporciona esencialmente una evaluación de Monte Cario de las múltiples integrales que aparecen en una descripción física precisa de la iluminación de una superficie. El muestreo de los pixeles se lleva a cabo distribuyendo aleatoriamente una serie de rayos a lo largo del área del píxel. Sin embargo, seleccionar las posiciones de los rayos de forma completamente aleatoria puede hacer que los rayos se agrupen en una pequeña región del área del píxel, dejando sin muestrear una buena parte de éste. Una mejor aproximación para la distribución de los rayos en el área del píxel consiste en utilizar una técnica denominada fluctuación (¡i/tering) sobre una cuadrícula regular de subpíxelcs. Esto se suele llevar a cabo dividiendo inicialmente el área del píxel (un cuadrado unitario) en las 16 subáreas que se muestran en la Figura 10.79 y generando una posición fluefuante aleatoria en cada subárea. Las posiciones aleatorias de los rayos se obtienen haciendo fluctuar las coordenadas de los centros de cada subárea en pequeñas cantidades, S y IL donde - 0 . 5 < S , S < 0.5. Entonces seleccionamos la posición ajustada como (x + S ,y + donde (x,y) es la posición central del píxel. Aleatoriamente se asignan códigos enteros de I a 16 a cada uno de los 16 rayos y se utiliza una tabla de sustitución para obtener valores paro los otros parámetros, como el ángulo de reflexión y el tiempo. Cada rayo de subpíxel se traza a través de la escena y se procesa para determinar la contribución de intensidad correspondiente a cada rayo. Las 16 intensidades de rayo se promedian entonces para obtener la intensidad global del píxel. Si las intensidades de los subpíxelcs varían demasiado, podemos subdividirel pixel todavía más. Para modelar los efectos del objetivo de la cámara, procesamos los rayos de los pixeles a través de una lente que se sitúa delante del plano de pixeles. Como hemos indicado anteriormente, la cámara se simula utilizando una distancia focal y otros parámetros, de modo que una serie de objetos seleccionados queden enfocados. Entonces, distribuimos los rayos de los subpíxeles por el área de apertura. Suponiendo que tengamos 16 rayos por píxel, podemos subdividir el área de apertura en 16 zonas y asignar a continuación a cada subpíxel una posición central en una de las zonas. Puede utilizarse el siguiente procedimiento para determinar la distribución de muestreo para el píxel: se calcula una posición ajustada mediante fluctuación para cada cenx
x
y
x
10.11 Métodos de trazado de rayos
635
FIGURA 10.79. Muesireo de un píxel utilizando 16 áreas de subpíxel y una posición lluctuantc de rayo con respecto a las coordenadas del centro de cada subárea.
Posición del objetivo
Dirección del rayo de subpíxel
Posición de subpíxel
Plano de imagen
FIGURA 10.80. Distribución de los rayos de subpíxel sobre el objetivo de una cámara con distancia focal /.
tro de zona y se proyecta un rayo hacia la escena desde esta posición de zona ajustada, a través del punto focal de la lente. Ubicamos el punto focal del rayo a una d i s t a n c i a / d e la lente, según la línea que sale del centro del subpíxel y pasa por el centro de la lente, como se muestra en la Figura 10.80. Con el plano de píxeles a una distancia d de la lente (Figura 10.73), las posiciones situadas a lo largo del rayo cerca del plano del objeto (el plano de enfoque) a una distancia d delante de la lente, estarán enfocadas. Otras posiciones a lo largo del rayo estarán desenfocadas. Para mejorar la visualización de los objetos desenfocados, puede incrementarse el número de rayos de subpíxel. l
Los trayectos de reflexión y transmisión también se distribuyen por una cierta región espacial. Para simular los brillos de las superficies, los rayos reflejados desde una posición de la superficie se distribuyen alrededor de la dirección de reflexión especular R de acuerdo con los códigos de rayo asignados (Figura 10.81). La dispersión máxima en torno a R se divide en 16 zonas angulares y cada rayo se refleja según una dirección que se ajusta mediante fluctuación a partir del centro de la :zona correspondiente a su código entero. Podemos utilizar el modelo de Phong, eos"* <¡>, para determinar la distribución máxima para los ángulos de reflexión. Si el material es transparente, los rayos refractados pueden distribuirse en torno a la dirección de transmisión T de forma similar, con el fin de modelar el carácter translúcido de los objetos (Sección 10.4). Las fuentes de luz no puntuales se pueden tratar distribuyendo una serie de rayos de sombra por lodo el área de la fuente de luz, como se ilustra en la Figura 10.82. La fuente luminosa se divide en zonas y a los rayos de sombras se les asignan direcciones fluctuantes según las diversas zonas. Además, las zonas pueden ponderarse de acuerdo con la intensidad de la fuente luminosa dentro de dicha zona y de acuerdo también con el tamaño del área proyectada de la zona sobre la superficie del objeto. Entonces, se envían más rayos de sombra a las zonas que tengan un mayor peso. Si algunos rayos de sombra interseclan objetos opacos situados entre la superficie y la fuente luminosa, se genera una penumbra (región parcialmente iluminada) en dicho punto de la superñcie. Pero si todos los rayos de sombra quedan bloqueados, el punto de la superficie estará dentro de una región de sombra (completamente oscuro) con respecto a dicha fuente luminosa. La Figura 10.83 ilustra las regiones de sombra y de penumbra sobre una superficie parcialmente oculta con respecto a una fuente luminosa.
636
CAPITULO
10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.81. Modelado de objetos brillantes y translúcidos distribuyendo los rayos de subpíxcl en torno a la dirección de reflexión R y a la dirección de transmisión T.
FIGURA 10.82. Distribución de los rayos de sombra en
ionio a una fuente luminosa imita.
FIGURA 10.83. Regiones de sombra y de penumbra creadas por un eclipse solar sobre la superficie de la Tierra.
FIGURA 10.84. Una escena, titulada ¡984, representada utilizando trazado de rayos distribuido. Los efectos de iluminación incluyen el desenfoque del movimiento, penumbras y reflexiones superficiales para múltiples fuentes luminosas de tamaño finito. {Cortesía de Pixar.Q ¡984 Pixar. Todos los derechos reservados.) Podemos crear el efecto de desenfoque de movimiento distribuyendo los rayos a lo largo del tiempo. Se determina un tiempo total y de la imagen y una serie de subdivisiones de este tiempo de imagen de acuerdo con la dinámica de los movimientos requeridos en la escena. Los intervalos temporales se etiquetan con códi-
10.11 Métodos de trazado de rayos 6 3 7
gos enteros y a cada rayo se le asigna un tiempo fluctuante dentro del intervalo correspondiente al código del rayo. Entonces, los objetos se mueven a sus posiciones correspondientes a dicho punto y se Ira/a el rayo a través de la escena. Para los objetos con mucho desenfoque se utilizan rayos adicionales. Para reducir los cálculos podemos utilizar recuadros o esferas de contorno para las comprobaciones iniciales de intersección de los rayos, es decir, movemos el objeto de contorno de acuerdo con los requisitos de movimiento y comprobamos si se produce una intersección. Si el rayo no intersecta el objeto de contorno, no será necesario procesar las superficies individuales dentro del volumen de contorno. La Figura 10.S4 muestra una escena con desenfoque de movimiento. Esta imagen fue representada utilizando trazado de rayos distribuido con 4096 por 3550 píxeles y 16 rayos por píxel. Además de las reflexiones con desenfoque de movimiento, las sombras se muestran con áreas de penumbra que son consecuencia de las fuentes luminosas finitas que iluminan la mesa de billar. En las Figuras 10.85 y 10.86 se proporcionan ejemplos adicionales de objetos representados con métodos de trazado de rayos distribuido. La Figura 10.87 ilustra los efectos de enfoque, refracción y antialiasing que pueden obtenerse con el trazado de rayos distribuido.
FIGURA 10.85. I lúa rueda de aluminio bruñido que muestra los efectos de reflexión y de sombras generados con técnicas de trazado de rayos distribuido.
(Cortesia de Stephen If. IVesfin, Program of C omputer Graphics, Cornell University.)
FIGURA 10.86. I Ina escena de una habitación representada mediante métodos de trazado de rayos distribuido, i ( 'önesia de John Snyder. Jed Lengyel. Devendrá Kalra y Al Barr. Computer Graphics Lab. California Institute of Technology < 1988 Caltech.)
638
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.87. Una escena que muestra los efectos de enfoque, de antialiasing y de iluminación que pueden obtenerse con una combinación de métodos de trazado de radios y de radiosidad. Se utilizaron modelos físicos realistas de iluminación para generar los efectos de refracción, incluyendo las cáusticas en ta sombra de la copa. (Cortesía de Pe/er Shirley, nner Science Department. University ofUtah.)
10.12 MODELO DE ILUMINACIÓN DE RADIOSIDAD Aunque el modelo básico de iluminación produce resultados razonables para muchas aplicaciones, hay diversos efectos de iluminación que no quedan descritos de forma precisa mediante las aproximaciones simples de este modelo. Podemos modelar más adecuadamente los efectos de iluminación si tenemos en cuenta las leyes físicas que gobiernan las transferencias de energía radiante dentro de una escena iluminada, Este método para el cálculo de los valores de color de los píxeles se denomina generalmente modelo de radiosidad.
Términos de la energía radiante En el modelo cuántico de la luz, la energía de la radiación es transportada por los fotones individuales. Para la radiación luminosa monocromática, la energía de cada fotón se calcula como:
donde la frecuencia/ medida en hercios (ciclos por segundo), caracteriza el color de la luz. Una luz azul tiene una alta frecuencia dentro de la banda visible del espectro electromagnético, mientras que una luz roja tiene una baja frecuencia. La frecuencia también nos da la lasa de oscilación para la amplitud de las componentes eléctrica y magnética de la radiación. El parámetro h es la constante de Planck* que tiene el valor 6.6262 X 10 julios • see, independientemente de la frecuencia de la luz. La energía total para la radiación luminosa monocromática es: 34
1
(I(W)
todo* los lolone.s
La energía radiante para una frecuencia luminosa concreta se denomina también radiancia espectral. Sin embargo, cualquier radiación luminosa real, incluso la correspondiente a una fuente «monocromática» con-
10. i 2
Modelo de iluminación de radiosidad
639
tiene un rango de frecuencias. Por tanto, la energía radiante total es la suma para todos los fotones de todas las frecuencias: £=I
I ¥ f
(10.88)
lntlns Iny (utom-s
La cantidad de energía radiante transmilida por unidad de tiempo se denomina flujo radiante
dt
El flujo radiante también se llama frecuencia radiante y se mide en vatios (julios por segundo). Para obtener los efectos de iluminación para las superficies de una escena, calculamos el llujo radiante por unidad de área que abandona cada superficie. Esta cantidad se denomina radiosidad B o exitancia radiante.
d
dA
{¡OM)
2
que se mide en unidades de vatios por metro . Y la intensidad / se toma a menudo como medida del flujo radiante en una dirección concreta por unidad de ángulo sólido por unidad de área proyectada, con unidades de vatios/(metro • tereorradianes). Sin embargo, en ocasiones la intensidad se define simplemente como el (lujo radiante en una dirección concreta. 2
Dependiendo de la interpretación del término intensidad, la radiancia puede definirse como la intensidad por unidad de área proyectada. Alternativamente, podemos obtener la radiancia a partir del llujo radiante o de la radiosidad por unidad de ángulo sólido.
Modelo básico de radiosidad Para describir con precisión las reflexiones difusas de tina superllcie, el modelo de radiosidad calcula las interacciones de energía radiante entre todas las superficies de una escena. Puesto que el conjunto resultante de ecuaciones puede ser extremadamente difícil de resolver, el modelo básico de radiosidad presupone que todas las superficies son reflectores difusos ideales, pequeños y opacos (lambertianos). Aplicamos el modelo de radiosidad determinando la cantidad diferencial de flujo radiante dñ que sale de cada punto superficial de la escena, y luego sumamos las contribuciones de energía para todas las superficies con el fin de obtener la cantidad de energía transferida entre las mismas. En la Figura 10.88, que ilustra la transferencia de energía radiante desde una superllcie, dB es el flujo radiante visible que emana del punto de la superficie en la dirección dada por los ángulos f?y <¿> dentro de un ángulo sólido diferencial ¿ t o p o r unidad de tiempo, por unidad de área superficial.
FIGURA 10.88. Energía radiante visible emilida desde un punto de una superficie en la dirección (0 0) dentro del ángulo sólido d(0. y
FIGURA 10.89. Para un elemento unitario de superllcie, el área proyectada perpendicular a la dirección de transferencia de energía es igual a eos 0.
640
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
La intensidad / para la radiación difusa en la dirección (ft 0) puede describirse como la energía radianie por unidad de tiempo por unidad de área proyectada por unidad de ángulo sólido, o: . dB l =(10,91) d(ú eos
(10.92)
Para un reflector difuso perfecto, / es constante, por lo que podemos expresar el flujo radianie B como; B=/i
cos<¡> do)
(10.93)
J henil
Asimismo, el elemento diferencial de ángulo sólido dio puede expresarse como (Apéndice A): d(0 = - v = sin $ dtp dB t de modo que, B = I\ Jo
cose sin (¡> dd) dO Jo
= 171
(10.94)
Podemos formar un modelo para las reflexiones luminosas de las distintas superficies estableciendo un «cierre» de las superficies (Figura 10.91). Cada superficie dentro del cierre es o un reflector, o un emisor
FIGURA 10.90. La energía radiante lolal para un punió de la superficie es la suma de las contribuciones en todas las direcciones de un hemisferio centrado en
FIGURA 10.91. I in cierre de superficies para el mófte
dicho punto de la superficie.
lo de radiosidad.
10.12 Modelo de iluminación de radiosidad
641
(fuente luminosa) o una combinación reflector-emisor. Designamos el parámetro de radiosidad B como la tasa total de energía radiante que abandona la superficie k por unidad de área. El parámetro de la energía ¡incidente H es la suma de las contribuciones de energía radiante de todas las superficies del cierre que llegan a la superficie k por unidad de tiempo, por unidad de área. En otras palabras. k
k
(10.95) donde el parámetro F- se denominad/evo/- de forma para las superficies j y k. El factor de forma F- es la fracción de la energía radiante de la superficie j que alcanza a la superficie k. Para una escena con n superficies dentro del cierre, la energía radiante de la superfìcie k se describe mediante la ecuación de radiosidad: k
k
B =E +p H k
k
k
k
(10.96) j>i
Si la superficie k no es una fuente luminosa, entonces E = 0. En caso contrario, E será la tasa de energía emitida desde la superficie k por unidad de área (vatios/m ). El parámetro p es el factor de rellectividad para la superficie k (porcentaje de la luz incidente que es reflejado en todas direcciones). Este factor de rellectividad está relacionado con el coeficiente de reflexión difusa usado en los modelos empíricos de iluminación. Las superficies planas y convexas no pueden «verse» a sí mismas, por lo que no hay ninguna auto-incidencia y el factor de forma F para estas superficies es ü. Para obtener los efectos de iluminación sobre las diversas superficies contenidas dentro del cierre, necesitamos resolver el sistema de ecuaciones de radiosidad para las n superficies, dada la matriz de valores para E , p y Fj . En otras palabras, debemos resolver: k
k
2
k
kk
k
k
k
O - f t ^ - P . I V V ^
|-p,''n -p F 2
-PA,
-pA \-p F
2l
2
*=U.3
~P2 1„ •
'-p„f"„J
(10.97)
fi,
tí,
F
n
n
=
È
(I0M)
A.
Después, convertimos los valores de intensidad I dividiendo los valores de radiosidad B por n. Para imágenes en color, podemos calcular los componentes RGB individuales de la radiosidad (B , B , B ) utilizando las componentes de color para p y E . Antes de poder resolver la Ecuación 10.97, debemos determinar los valores de los factores de forma F- . Hacemos esto considerando la transferencia de energía desde la superficie j a la superficie k (Figura 10.92). La tasa de energía radiante que incide sobre un pequeño elemento superficial dA procedente del elemento de área dA- es: dB dAj = (/ j eos dco) dA (10 99) k
k
kfi
k
k(¡
kíi
k
k
k
f
¡
Pero el ángulo sólido doy puede escribirse en términos de la proyección del elemento de área dA en perpendicular a la dirección dB- de la forma siguiente: k
9
r
r
Por tanto, podemos expresar la Ecuación 10.99 en la forma:
(10.100)
642
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Superficie k
FIGURA 10.92. Transferencia de una cantidad dilerencial de encrgia radiante dB- desde un clémente- de superficie con area dA- hacia el elemento de supertic ie dA .
Superficie j
k
J
<№jdAt=
(iQJOl)
I, cos0. TL cos0, dA, dA,
-¡p
"
El factor de forma entre las dos superficies es el porcentaje de la energía qtie emana del área dA¡ e incide en:
(f 0.102)
energía incidente en dA
k
energía total que sale de dA
j
1 cos
¡
(
\
k
Asimismo, Bj = nlp de modo que: f 0.103)
eos0. cos0 dA A
t
Ttr
y la fracción de la energía emitida desde el área dA - y que incide en la superficie completa k es: 1'
~2 suri,
w
^
ClA
k
Kr
donde Af. es el àrea de la superficie k. Podemos enlonces definir el factor de forma entre las dos superfìcies corno el promedio de la expresión anterior para lodo el àrea, que sera: i r A
f
r
c o s e cos ri»,
JMÌ, Jsuif,
(10.105)
nr
Las dos integrales de la Ecuación 10.105 se evalúan utilizando técnicas de integración numérica y estipulando las siguientes condiciones: iXi %
=
,drd
P
AF = A F }
}k
k
ti
i0(
^° *
(conservación de la energía)
(reflexión uniforme de la luz)
FJJ — Q» para todo j (suponiendo sólo parches superficiales planos o convexos)
10.12 Modelo de iluminaáón de radiosidad
643
Para aplicar el modelo de radiosidad, suhdividimos cada superficie de una escena en muchos pequeños polígonos. La apariencia realista de la escena mostrada se mejora al reducir el tamaño de las subdivisiones poligonales, pero entonces hace falta más tiempo para representar la escena. Podemos acelerar el cálculo de los factores de forma utilizando un hemicubo para aproximar el hemisferio. Esto sustituye la superficie esférica por un conjunto de superficies (planas) lineales. Después de evaluados los factores de forma, podemos resolver el conjunto de ecuaciones lineales 10.97 utilizando una técnica numérica tal como la eliminación gaussiana o la descomposición LA (Apéndice A). Alternativamente, podríamos comenzar con valores aproximados para las B¡ y resolver el sistema de ecuaciones lineales iterativamente utilizando el método de GaussSeidel. En cada iteración, calculamos una estimación de la radiosidad para el parche superficial Á utilizando los valores de radiosidad previamente obtenidos en la ecuación de radiosidad:
Entonces podemos mostrar la escena en cada paso para observar la mejora en la representación de las superficies. Este proceso se repite hasta que los cambios en los valores de radiosidad calculados sean pequeños.
Método de radiosidad mediante refinamiento progresivo Aunque el método de radiosidad produce representaciones altamente realistas de las superficies, se necesita un tiempo de procesamiento considerable para calcular los factores de forma y además los requisitos de almacenamiento son muy altos. Utilizando la técnica de refinamiento progresivo, podemos reestructurar el algoritmo iterativo de radiosidad para acelerar los cálculos y reducir los requisitos de almacenamiento en cada iteración. A partir de la ecuación de radiosidad, la transferencia de energía radiante entre dos parches de superficie se calcula como: B debido a B = p B F
(10.106)
Bj debido a B = p - B F para todo./
(H). 107)
k
¡
k
f
jk
Recíprocamente, k
;
k
k
que podemos reescribir como: A B
t
debido a
L
B = pB F - , k
j
ii
para todo j
jk
(10,108)
É Esta relación es la base para la técnica de refinamiento progresivo de los cálculos de radiosidad. Utilizando un único parche superficial ¿, podemos calcular todos los factores de forma F y considerar la transferencia de luz desde dicho parche a todas las demás superficies del entorno. Con este procedimiento, sólo necesitamos calcular y almacenar los valores de los parámetros para un único hemicubo y los factores de forma asociados. En la siguiente iteración, sustituimos estos valores de parámetros por valores correspondientes a otro parche seleccionado. Y podemos mostrar las mejoras sucesivas en la representación de las superficies a medida que pasamos de un parche seleccionado a otro. Inicialmente, hacemos B = Zapara todos los parches superficiales. Después, seleccionamos el parche con el mayor valor de radiosidad, que será el emisor de luz más brillante y calculamos la siguiente aproximación a la radiosidad para todos los demás parches. Este proceso se repite en cada paso, de modo que las fuentes luminosas se seleccionan primero, empezando por la de mayor energía radiante, y después se seleccionan los demás parches basándose en la cantidad de luz recibida de las fuentes luminosas. Los pasos en una técnica simple de refinamiento progresivo son los que se esbozan en el siguiente algoritmo: jk
k
644
CAPÍTULO 10 Miníelos de iluminación y métodos de representación superficial
for
ea.ch p a t c h \*
k
D e f i n i r hemicubo
for each patch dRad = r h o dB B
[j} tjl
j
f a c t o r e s de
forma
F
[j][k3.
*/
{
[j]
= dB = B
y calcular
[j]
[j]
* B
[k]
*
F
[j][k]
• A
[j]
/ A
[k] ,
+ dRad; + dRad;
) dB
Ik]
=
0;
Ln cada paso, se selecciona el parche superficial con el mayor valor de A B A , dado que la radiosidad es una medida de la energía radiante por unidad de área. Asimismo, seleccionarnos los valores iniciales como & B = B = E para todos los parches superficiales. Este algoritmo de refinamiento progresivo aproxima la propagación real de la luz a través de una escena en función del tiempo. La visuali/ación de las superficies representadas en cada paso produce una secuencia de vistas que pasa de una escena oscura a otra completamente iluminada. Después del primer paso, las únicas superficies iluminadas son las fuentes luminosas y los parches no emisores que son visibles para el emisor seleccionado. Para producir vistas iniciales más útiles de la escena, podemos fijar un nivel de luz ambiente de modo que todos los parches tengan algo de iluminación. En cada etapa de la iteración, reducimos entonces la luz ambiente de acuerdo con el nivel de transferencia de energía radiante que haya en la escena. La Figura 10.93 muestra una escena representada mediante el modelo de radiosidad con refinamiento progresivo. En las Figuras 10.94, 10.95 y 10.96 se ilustran diversas condiciones de iluminación en representaciones de escenas obtenidas con el método de radiosidad. A menudo suelen combinarse los métodos de trazado de rayos con él modelo de radiosidad con el fin de producir sombreados superficiales especulares y difusos altamente realistas, como en la figura 10.87. k
k
k
k
k
FIGURA 10.93. Nave de la catedral de Chartres representada mediante un modelo de radiosidad con refinamiento progresivo. La representación obtenida por John Wallace y John Lin. utilizando el paquete de trazado de rayos y radiosidad Starbase de I Icwlcu-Packard. Los factores de forma de radiosidad se calcularon medíante método de trazado de rayos. (Cortesía de Eric llames, Autodesk, Inc, ' 1989 //ew/ettd'ackard Co.)
10.12 Modelo de iluminación de radiosidad
FIGURA 10.94. Imagen do un museo consiruciivista representada mediante un metodi) de radiosidad de rclìnamiento progressivo. {Cortesia de Shenchang Eric Chen, Stuart /. Feldman y Julie Dorsey. Program of Computer Graphics. Cornell University. ¡988 Cornell University Program of Computer Graphics. )
(a)
645
FIGURA 10.95. Simulación de la escalera de la lone en el Engineering Theory Center Building de la Universidad de Cornell, representado mediante un método de radiosidad de refinamiento progresivo. (Cortesia de Keith Howie y Ben Trumbore, Program of Computer Graphics, Cornell University, i') /990 Cornell University Program of Computer Graphics.)
ib)
FIGURA 10.96. Simulación de dos esquemas de iluminación para un decorado utilizado en la representación de Let Bohemia en el Teatro Metropolitano de la Opera. En (al se incluye una \isia diurna completamente iluminada, mientras que en t b) podemos ver una vista nocturna. ( Cortesía de Julie Dorsey y Mark Shepard, Prognati of i 'omputer Graphics. Cornell University. G 1991 Cornell University Program of Computer Graphics.)
646
10.13
CAPÍTULO 10
Modelos- de dominación y métodos de representación superficial
MAPEADO DE ENTORNO
Un procedimiento alternativo para modelar reflexiones globales consiste en definir una matriz de valores de intensidad que describa el entorno situado alrededor de un objeto o de un grupo de objetos. En lugar de utilizar trazado de rayos entre los objetos o cálculos de radiosidad para determinar los efectos globales de iluminación difusa y especular, simplemente mapeamos la matriz Je entorno sobre un objeto en relación con la dirección de visualización. Este procedimiento se denomina mapeado de entorno o en ocasiones milpeado de reflexión (aunque también podrían modelarse electos de transparencia con el mapa de entorno). Se trata de una aproximación simple y rápida a las técnicas más precisas de representación basada en trazado de rayos que hemos expuesto en las Secciones 10.11 y 10.12. El mapa de enlomo se define sobre las superficies de un universo circundante. La información del mapa de entorno incluye los valores de intensidad para las fuentes luminosas, el cielo y otros objetos de fondo. La Figura 10.97 muestra el universo circundante como una esfera, pero a menudo se utiliza un cubo o un cilindro para definir las superficies de entorno que rodean a los objetos de una escena. Para obtener la imagen de la superficie de un objeto, proyectamos áreas de píxel sobre la superficie del objeto y luego reflejamos cada una de esas áreas proyectadas sobre el mapa de entorno con el fin de obtener los valores de intensidad superficial para el píxel. Si el objeto es transparente, también podemos refractar el área de píxel proyectada hacia el mapa de enlomo. El proceso de mapeado de enlomo para la reflexión de un área de píxel proyectada se ilustra en la Figura 10.98. La intensidad del píxel se determina promediando los valores de intensidad dentro de la región intersectada del mapa de entorno.
10.14 MAPEADO DE FOTONES Aunque el método de radiosidad puede producir imágenes precisas con efectos de iluminación globales para las escenas simples, este método se hace más difícil de aplicar a medida que se incrementa la complejidad de una escena. Tanto el tiempo de representación como los requisitos de almacenamiento se hacen prohibitivos para las escenas muy complicadas, y muchos efectos de iluminación son difíciles de modelar correctamente El mapeado de fotones proporciona un método general eficiente y preciso para modelar la iluminación global en las escenas complejas. El concepto básico del mapeado de fotones consiste en separar la información de iluminación de la geometría de una escena. Se trazan trayectorias de rayos a través de la escena desde todas las fuentes luminosas y la
FIGURA 10.97. Universo esférico con el mapa de entor no sobre la superficie de la esfera.
FIGURA 10.98. Proyección de un área de píxel sobre una superficie y reflexión del área sobre el mapa de enlomo.
10.15 Adición de detalles a las superficies
647
información de iluminación correspondiente a las intersecciones entre los rayos y los objetos se almacena en un mapa de fotones. Entonces, se aplican métodos de trazado de rayos distribuido utilizando algoritmos increméntales similares a los que se emplean en las representaciones mediante radiosidad. Las fuentes luminosas pueden ser puntuales, focos direccionales o de cualquier otro tipo. La intensidad asignada a una fuente luminosa se divide entre sus rayos (fotones) y las direcciones de los rayos se distribuyen aleatoriamente. Una fuente luminosa puntual se modela generando trayectorias de rayos uniformemente en todas direcciones, a menos que la fuente sea direccional (Sección 10.1). Para otras fuentes luminosas, se seleccionan posiciones aleatorias en la fuente y se generan rayos en direcciones aleatorias. Para las luces brillantes se generan más rayos que para las fuentes luminosas de baja potencia. Además, pueden construirse para las fuentes luminosas mapas de proyección que almacenen información binaria sobre si hay o no objetos en cualquier región del espacio. También pueden utilizarse esferas de contorno dentro del algoritmo para proporcionar información acerca de los objetos contenidos en grandes regiones del espacio. Para una escena puede generarse cualquier número de rayos y la precisión de ios efectos de iluminación se incrementa a medida que se generan más trayectorias de rayos.
10.15 ADICIÓN DE DETALLES A LAS SUPERFICES Hasta ahora hemos expuesto las técnicas de representación para la visualización de superficies suaves de los objetos. Sin embargo, la mayoría de los objetos no tienen superficies suaves y homogéneas. Necesitamos las texturas superficiales para modelar de manera precisa objetos tales como paredes de ladrillo, carreteras de grava, alfombras, madera o piel humana. Además, algunas superficies contienen patrones que es preciso tener
№ FIGURA 10.99- Etapas de modelado y representación en el desarrollo del personaje animado Dr. Aki Ross para la película Final Fantasy: The Spirits Within: (a) modelo alámbrico de Aki, (b) estructura superficial de la piel y la ropa y (e) figura final representada, incluyendo el pelo y los detalles relativos a la ropa y a las características de la piel. {Cortesía de Square Píc/nres, Ine €¿ 2001 FFFP Todos los derechos reservados.)
648
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
en cuenta durante los procedimientos de representación. La superficie de una vasija podría mostrar un diseño pintado, un vaso de agua puede tener grabado el escudo de la familia, una pista de tenis contiene marcas que indican las distintas zonas en que se divide el campo y una autopista de cuatro carriles tiene una serie de líneas divisorias y otras marcas, como huellas de frenazo o manchas de aceite. La Figura 10.99 ilustra las capas básicas en el modelado y representación de un objeto al que hay que añadir detalles superficiales. Primero puede utilizarse una imagen alámbrica del objeto para ajustar el diseño global. A continuación, se encajan las capas superficiales sobre el contomo del objeto para producir una vista de la estructura con una superficie suave. Después, se añaden los detalles de la superficie a las capas exteriores. Para el ejemplo de la Figura 10.99, los detalles de la superficie incluyen los patrones de la chaqueta (como los pliegues y la textura de la lela) y las características de la piel, como poros o pecas. En la Figura 10.100 se muestran imágenes ampliadas de las características de la piel de este personaje, que han sido generadas por computadora, mientras que la Figura 10.101 muestra las características simuladas de la piel para una persona mayor. En la Figura 10.102 se proporcionan ejemplos adicionales de escenas representadas con detalles superficiales. Podemos añadir detalles a las superficies utilizando diversos métodos, incluyendo: •
Pegar pequeños objetos, como flores o espinas sobre una superficie mayor.
•
Modelar patrones superficiales mediante pequeñas áreas de polígonos.
•
Mapear matrices de texturas o procedimientos de modificación de la intensidad sobre una superficie.
•
Modificar el vector normal a la superficie para crear relieves localizados.
•
Modificar tanto el vector normal a la superficie como el vector tangente a la superficie para mostrar patrones direccionales sobre madera y otros materiales.
Adición de detalles a las superficies
649
*FIGURA 10.101. Características faciales y textura superficial de la piel para el personaje animado Dr. Ski, que representa a un hombre de 70 años de edad en
Final Fantasy: The Spirits Within. (Cortesía cíe Sanare Pictures, Inc. Í 200! FFFP Todos tos derechos reservados.) la película
FIGURA 10.102. Escenas que ilustran la generación infográilea de detalles superficiales para diversos objetos: (a) plantas (cortesía de Deborah R. Fowler, Przemystaw Prusinkiemcz y Johannes fíat/jes. University of Calgary. É ¿992.), (b) conchas marinas con diversos patrones y superficies en relieve {cortesía de Deborah R. Fowler, Hans Me i nh ardí y Przemyslaw Prusinkiemcz, University ofCalgary. C- 1992.), (c) una tabla de frutas {cortesía de SOFTIMAGE, Inc.) y (d) patrones superficiales para piezas de ajedrez y para un tablero de ajedrez, generados con métodos de mapeado de texturas (cortesía de SOFTÍMAGE. Inc.), de cactus a las que se les han añadido espinas y llores
650
CAPITULO 10
Modelos de iluminación y métodos de representación superficial
10.16 MODELADO DE LOS DETALLES SUPERFICIALES MEDIANTE POLÍGONOS Un método simple para añadir detalles a una superficie consiste en modelar patrones u otras características superficiales utilizando caras poligonales. Para detalles a gran escala, el modelado mediante polígonos puede proporcionar buenos resultados. Algunos ejemplos de dichos detalles a gran escala serían los cuadrados en un tablero de ajedrez, las líneas divisorias en una autopista, los patrones de las baldosas en un suelo de linóleo, los diseños llórales en una alfombra, los paneles de una puerta o los anuncios en el lateral de un camión. También podríamos modelar una superficie irregular con pequeñas caras poligonales aleatoriamente orientadas, siempre y cuando las caras no sean excesivamente pequeñas. Los polígonos para la aplicación de patrones superficiales se suelen solapar sobre una superficie poligonal mayor y se procesan junto con esa superficie padre. El algoritmo de detección de superficies visibles sólo procesa al polígono padre, pero los parámetros de iluminación de los polígonos de detalle superficial tienen preferencia sobre los del polígono padre. Cuando haya que modelar detalles superficiales intrincados o muy precisos, los métodos basados en polígonos no son prácticos. Por ejemplo, sería difícil modelar con precisión la estructura superficial de uva pasa utilizando caras poligonales.
10.17 MAPEAD0 DE TEXTURAS Un método común para añadir detalles a un objeto consiste en mapear patrones sobre la descripción geométrica del objeto. El patrón de texturas puede definirse mediante una matriz de valores de color o mediante un procedimiento que modifique los colores del objeto. Este método para incorporar detalles de los objetos a una escena se denomina mapeado de texturas o mapeo de patrones y las texturas pueden definirse como patrones unidimensionales, bidimensionales o tridimensionales. Cualquier especificación de textura se denomina espacio de textura, que se referencia mediante coordenadas de textura comprendidas en el rango que va de Oal.0. Las funciones de textura en un paquete gráfico permiten a menudo especificar como opción el número de componentes de color para cada posición de un patrón. Por ejemplo, cada especificación de color en un patrón de textura podría estar compuesta por cuatro componentes RGBA, tres componentes RGB, un único valor de intensidad para un tono de azul, un índice a una tabla de colores o un único valor de luminancia (una media ponderada de las componentes RGB de un color). Cada componente de la descripción de una textura se denomina frecuentemente «texel», pero existe una cierta confusión en el uso de este término. Algunas veces, una posición de un espacio de texturas correspondiente a un conjunto de componentes de color, como por ejemplo una tripleta RGB, se denomina texel, mientras que en otras ocasiones se denomina texel a un único elemento de la matriz de texturas, como por ejemplo el valor de la componente roja de un color RGB.
Patrones de textura lineales Puede especificarse un patrón de textura unidimensional mediante una matriz de valores de color con un sólo subíndice, definiendo esta matriz* una secuencia de colores en un espacio de texturas lineal. Por ejemplo, podríamos definir una lista de 32 colores RGB a la que hiciéramos referencia mediante unos valores de suhítidice que fueran de 0 a 95. Los primeros tres elementos de la matriz almacenan las componentes RGB del primer color, los siguientes tres elementos almacenan las componentes RGB del segundo color, etc. Este conjunto de colores, o cualquier subconjunto contiguo de los colores, podría entonces usarse para formar una línea con un cierto patrón a través de un polígono, una banda alrededor de un cilindro o un patrón de color para mostrar un segmentó de línea asilado. Para un patrón lineal, el espacio de texturas se referencia mediante un único valor de la coordenada s. Para las especificaciones de color RGB, el valor A- = 0.0 designa el primer color RGB de la matriz (formado por
10.17 Mapeado de texturas
651
tres elementos), el valor* = I.O designa las últimas tres componentes de color de RGB y el valor .y = 0.5 referencia los tres elementos intermedios de color RGB de la matriz. Por ejemplo, si el nombre de la matriz de textura es c o l o r A r r a y , entonces el valor .y = 0.0 hace referencia a los tres valores de la matriz c o l o r A r r a y [0], c o l o r A r r a y [1] y c o l o r A r r a y [ 2 ] . Para mapear un patrón de textura lineal sobre una escena, asignamos un valor de la coordenada $ a una posición espacial y otro valor de la coordenada л a una segunda posición espacial. La sección de la matriz de colores correspondiente al rayo especificado de coordenadas s se utiliza entonces para generar una línea multicolor entre las dos posiciones espaciales. Un procedimiento de mapeado de texturas utiliza normalmente una función lineal para calcular las posiciones de la matriz que hay que asignar a los píxeles a lo largo de un segmento lineal. Cuando el número de colores de textura especificados para la línea es pequeño, puede asignarse cada color a un gran conjunto de píxeles, dependiendo de la longitud de la línea. Por ejemplo, si el rango especificado de la coordenada л abarca un único color RGB (tres elementos de color RGB) dentro de la matriz de texturas, todos los píxeles de la línea se mostrarán con dicho color. Pero si hay que mapear múltiples colores a las distintas posiciones a lo largo de la línea, entonces se asignarán menos píxeles a cada color. Asimismo, puesto que algunos píxeles podrían ¡ñapearse a posiciones de la matriz que estuvieran situadas entre sucesivos colores RGB, se pueden usar diversos esquemas para determinar el color que hay que asignar a cada píxel. Un método simple de mapeado de colores consiste en asignar a cada píxel el color de la matriz más próximo. Alternativamente, si un píxel se mapea a una posición que esté comprendida entre los elementos iniciales de la matriz correspondientes a dos colores sucesivos, el color del píxel puede calcularse como una combinación lineal de los dos elementos de color más próximos dentro de la matriz. Algunos procedimientos de mapeado de texturas permiten utilizar valores para las coordenadas de texturas que estén fuera del rango de 0 a 1.0. Estas situaciones pueden surgir cuando queramos mapear múltiples copias de una textura sobre un mismo objeto o cuando los valores de s calculados puedan estar lucra del intervalo unitario. Si queremos pennitir valores de las coordenadas de texturas que caigan fuera del rango que va de 0 а E0, podemos simplemente ignorar la parte entera de cualquier valor s determinado. En este caso, el
valor - 3 . 6 , por ejemplo, haría referencia a la misma posición dentro del espacio de texturas del valor 0.6 o el valor 12.6. Pero si no queremos permitir valores fuera del rango que va de 0 a 1.0, entonces podemos limitarnos a fijar los valores dentro de este intervalo unitario: cualquier valor calculado que sea inferior a 0 adoptará el valor 0 y a todos los valores calculados que sean superiores a 1.0 se les asignará el valor 1.0.
Patrones de textura superficial Una textura para un área superficial se define comúnmente mediante un patrón rectangular de color, y las posiciones dentro de este espacio de textura se referencian mediante valores de coordenadas bidimensionales (л, /). Las especificaciones para cada color de patrón de texturas pueden almacenarse en una matriz con tres subíndices. Si se define un patrón de texturas con 16 por 16 colores RGB, por ejemplo, entonces la matriz correspondiente a este patrón contendrá 16 X 16 X 3 = 768 elementos. La Figura 10.103 ilustra un espacio de textura bidimensional. Los valores correspondientes а д у / varían de 0 a 1.0. La primera fila de la matriz enumera los valores de color a lo largo de la parle inferior del patrón de texturas rectangular, mientras que la última fila de la matriz enumera los valores de color correspondientes a la parle superior del patrón. La posición de coordenadas (0, 0) en el espacio de texturas hace referencia al primer conjunto de componentes de color en la primera posición de la primera illa, mientras que la posición (1.0, 1.0) hace referencia al último conjunto de componentes de coloren la última posición de la última tila de la matriz. Por supuesto, podríamos enumerar los colores de la matriz de texturas de otras formas; si enumeráramos los colores de arriba a abajo, el origen del espacio de textura bidimensional estaría en la esquina superior izquierda del patrón rectangular. Pero colocar el origen del espacio de texturas en la esquina inferior izquierda suele simplificar los procedimientos de mapeado sobre la referencia de coordenadas espaciales de una escena. Especificamos un mapeado de textura superficial para un objeto utilizando los mismos procedimientos que para mapear una textura lineal sobre la escena. Pueden asignarse las coordenadas (д\ /) del espacio de textu-
652
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
o columnas ( 1 , I)
(0, I) Illa m — 1
FIGURA 10.103. Coordenadas bidimensionales del espacio de texturas que hacen referencia a posiciones dentro de una matriz de valores de color que contienen m filas y /; columnas. Cada posición de la matriz hace referencia a múltiples componentes de color.
Espacio de textura: coordenadas Í.Y. t)
lila I lila 0
(1.0)
(0.0)
Espacio de imagen: coordenadas (x, y) del pixel
espacio tie objeto: parárneiros de superficie {u, v)
Transformación textura-supeiii cié
Transformación de visualización de proyección
FIGURA 10.104. Sistemas de coordenadas para el espacio de texturas bidimensional. el espacio de objetos y el espacio de imagen. ras correspondientes a las cuatro esquinas de patrón de texturas (Figura 10.103) a cuatro posiciones en el espacio dentro de la escena, utilizándose una transformación lineal para asignar los valores de color a las posiciones de píxel proyectadas para el área espacial designada. También es posible realizar otros tipos de mapeados. Por ejemplo, podríamos asignar tres coordenadas del espacio de texturas a los vértices de un triángulo. Las posiciones en la superficie de un objeto, como por ejemplo un parche de sp/ine cúbica o una sección de esfera, pueden describirse mediante coordenadas uv en el espacio de objetos, y las posiciones de píxel proyectadas se referencian en coordenadas cartesianas xy. El mapeado de la textura superficial puede llevarse a cabo en una de estas dos formas: o bien mapeamos el patrón de textura sobre la superficie de un objeto y luego sobre el plano de proyección, o podemos mapear cada área de píxel sobre la superficie del objeto y luego manear este área superficial sobre el espacio de texturas. El mapeado de un patrón de texturas sobre las coordenadas de píxel se denomina en ocasiones escaneo de textura, mientras que el mapeado de las coordenadas de píxel sobre el espacio de texturas se denomina escaneo en orden de píxel, escaneo inverso o escaneo en orden de imagen. La Figura 10,104 ilustra las dos posibles secuencias de translómiación entre los tres espacios. Las transformaciones lineales paramétricas proporcionan un método simple para mapear las posiciones del espacio de texturas sobre el espacio de objetos: u = u(sj) = a s + bj+c ii
ii
{10.109) v = \isj) = a s + bj + c v
v
La transformación desde el espacio de objetos hasta el espacio de imagen se lleva a cabo concatenando las transformaciones de visualización de proyección. Una desventaja del mapeado desde el espacio de texturas al espacio de píxeles es que un parche de textura seleccionado no suele corresponderse con las fronteras del píxel, lo que requiere efectuar una serie de cálculos para determinar el porcentaje de recubrimiento del píxel. Por tanto, el método de mapeado de texturas más comúnmente utilizado es el mapeado del espacio de píxeles al espacio de texturas (Figura 10.105). Esto evita los cálculos de subdivisión de píxel y permite aplicar fácilmente procedimientos de antialiasing (filtrado). Un procedimiento de antialiasing efectivo consiste en
10.17 Mapeado de texturas
653
Àrea de pixel
Superficie
de pixel
Mairi/ de patrón rectangular
FIGURA 10.105. Mapeado de texturas mediante proyección de áreas de pixel sobre el espacio de texturas. Área de pixel ampliada
FIGURA 10.106. Área ampliada para un pixel, que incluye las posiciones centrales de los píxeles adyacentes. proyectar un área de píxel ligeramente mayor que incluya los centros de los píxeles vecinos, como se muestra en la Figura 10.106, y aplicar una función piramidal para ponderar los valores de intensidad del patrón de texturas. Pero el mapeado del espacio de imagen al espacio de texturas requiere calcular la inversa de la transformación de visualización-proyección y la inversa de la transformación del mapa de texturas M~' . En el siguiente ejemplo, vamos a ¡lustrar este técnica mapeando un patrón definido sobre una superficie cilindrica.
Ejemplo 10.1 M a p e a d o d e u n a t e x t u r a s u p e r f i c i a l Para ilustrar los pasos del mapeado de textura superficial, vamos a considerar la transferencia del patrón mostrado en la Figura 10.107(a) a una superficie cilindrica. Los parámetros de superficie son las coordenadas cilindricas: 14=0,
V
o< e< n/i.
=
Z
o
Y la representación paramétrica para la superficie en el sistema de referencia cartesiano es: x = r eos
w,
y = r sin W,
Z = V
Podemos mapear el patrón matricial sobre la superficie utilizando la siguiente transformación lineal, que transforma las coordenadas del espacio de textura (s\ i) = (0, 0) en la esquina inferior izquierda de! elemento de superficie (x, y, z) = (r, 0, 0).
654
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
t LO
\ \ \
0.75
\ \
0.25
0.25
\ \
0.5
0.75
x
I.O №
(a)
FIGURA 10.107. Mapeado de un patrón de texturas dctlnido dentro de un cuadrado unitario (a) sobre una superficie cilindrica (b).
U = .V7ZZ2,
V = /
A continuación, seleccionamos una posición de visualizaeión y aplicamos la transformación de visualizaeión inversa desde las coordenadas de pixel hasta el sistema de referencia cartesiano de la superficie cilindrica. Después, las coordenadas de la superficie cartesiana se transfieren a los parámetros de superficie uv mediante los cálculos u = tan"'(v/v),
v =z
y las posiciones de píxel proyectada se mapean sobre el espacio de texturas mediante la transformación inversa i =
ttHfi
/ = v
Entonces se promedian los valores de color en la matriz del patrón cubierta por cada área de píxel proyectada con el Un de obtener el color del píxel.
Patrones de textura volumétricos Además de los patrones lineales y superficiales, podemos diseñar un conjunto de colores para una serie de posiciones en una región tridimensional del espacio. Estas texturas se denominan a menudo patrones de textura v o l u m é t r i c o s o texturas s ó l i d a s . Podemos hacer referencia a una textura sólida utilizando coordenadas tridimensionales para el espacio dé texturas (A, f, r), Y el espacio de textura tridimensional se define dentro de un cubo unitario, estando las coordenadas de textura comprendidas entre Oy 1.0. Un patrón de textura volumétrico puede almacenarse en una matriz de cuatro subíndices, en la que los primeros tres subíndices denotan la posición de una Illa, la posición de una columna y una posición de profundidad. El cuarto subíndice se utiliza para hacer referencia a una componente de un color concreto del patrón. Por ejemplo, un patrón de textura sólida RGB con 16 filas, 16 columnas y 16 planos de profundidad podría almacenarse en una matriz con 1 6 X I 6 X 1 6 X 3 = 12.288 elementos. Para mapear el espacio de texturas completo sobre un bloque tridimensional, asignamos las coordenadas de las ocho esquinas del espacio de texturas a ocho posiciones del espacio de una escena. O bien, podemos mapear una sección plana del espacio de texturas, como por ejemplo un plano de profundidad o una cara del cubo de texturas, sobre un área plana de la escena. Existen muchas otras posibles formas de mapear una textura sólida. Las texturas sólidas permiten obtener vistas internas, como por ejemplo secciones transversales, para objetos tridimensionales que haya que mostrar con patrones de (extura. Así, pueden aplicarse a los ladrillos o a los
10.17 Mapetub tif texturas
655
FIGURA 10.108. Una escena en la que se han modelado las características de los objetos utilizando métodos de texturas sólidas. (Cortesía Je Peter Shirley, Computer Science Department, University ofUtah.) objetos de madera unos mismos patrones de textura en toda su extensión espacial. La Figura 10.108 muestra una escena visualizada mediante texturas sólidas para obtener patrones de madera veteada y otros tipos de texturas.
Patrones de reducción de texturas En animación y otras aplicaciones, el tamaño de los objetos suelen cambiar a menudo. Para objetos mostrados con patrones de textura, necesitamos entonces aplicar los procedimientos de mapcado de texturas a las dimensiones modificadas del objeto. Cuando el tamaño de un objeto texturado se reduce, el patrón de textura se aplica a una región más pequeña y esto puede hacer que aparezcan dispersiones en las texturas. Para evitar éstos, podemos crear un conjunto de patrones de reducción de texturas que se deberán utilizar cuando el tamaño visualizado de los objetos se reduzca. Normalmente, cada patrón de reducción tiene la mitad del tamaño del patrón anterior. Por ejemplo, si tenemos un patrón bidimensional 16 por 16, podemos deílnir cuatro patrones adicionales con los tamaños reducidos H por 8, 4 por 4, 2 por 2 y 1 por I. Para cualquier vista de un objeto, podemos entonces aplicar el patrón de reducción apropiado con el fin de minimizar las distorsiones. Estos patrones de reducción se suelen denominar mapas M I P o mip niaps, donde el término mip es un acrónimo de la (rase latina multum inparva, que podría traducirse como «mucho en un pequeño objeto».
Métodos de texturado procedimental Otro método para añadir un patrón de texturas a un objeto consiste en utilizar una definición procedimental para las variaciones de color que hay que aplicar. Esta técnica evita los cálculos de transformación implicados en el mapeado de patrones matriciules sobre las descripciones de los objetos. Además, el texturado procedimental elimina los requisitos de almacenamiento necesarios cuando hay que aplicar muchos patrones dfi textura de gran tamaño, y en especial texturas sólidas, a una escena. Generamos una textura procedimental calculando variaciones para las propiedades o características de un objeto. Por ejemplo, las vetas de madera o del mármol pueden crearse para un objeto utilizando funciones
656
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.109. Una escena representada con VG Shaders y modelada con RenderMan utilizando caras poligonales para las facetas de las gemas, superficies cuádrieas y parches bieúbicos. Además de matrices de texturas, se utilizaron métodos procedimentales para crear la atmósfera vaporosa de la jungla y la cubierta vegetal, que muestra un característico efecto de iluminación. (Cortesía de ¡he VALIS Group. Reimpreso de Graphics Genis III. editado por David Kirk. € 1992 Academic Press, Inc.) armónicas (curvas sinusoidales) definidos en una región del espacio tridimensional. Entonces, se superponen perturbaciones aleatorias a las variaciones armónicas con el fin de descomponer los patrones simétricos. La escena de la Figura 10.109 fue representada utilizando descripciones procedimentales para patrones que son típicos de las superficies de las piedras, del oro pulido y de las hojas de plátano.
10.18 MAPEADO DE RELIEVE Aunque las matrices de texturas pueden utilizarse para añadir detalles de carácter fino a una superficie, usualmente no son efectivas para modelar la apariencia rugosa de las superficies de algunos ohjetos tales como naranjas, fresas o pasas. Los detalles relativos a la intensidad luminosa que se proporcionan en una matriz de texturas para este tipo de objetos están definidos de forma independiente de los parámetros de iluminación, como por ejemplo la dirección de la fuente Luminosa. Un método mejor para modelar la rugosidad de las superficies consiste en aplicar una función de perturbación a la normal a la superficie y luego usar el vector normal perturbado en los cálculos realizados dentro del modelo de iluminación. Esta técnica se denomina m a p e a d o de relieve (bump mapping). Si P(w, v) representa una posición sobre una superficie paramétrica, podemos obtener la normal a la superficie en dicho punto mediante el cálculo: N'=P;XP;
UO.UQ)
donde P y P son las derivadas parciales de P con respecto a los parámetros u y v. Para aplicar variaciones a la normal a la superficie, podemos modificar el vector de posición de la superficie sumándole una pequeña función de perturbación, denominada función de relieve: H
V
P'(u,v) = P(u,v) + b(u,v)n
(MI")
Esto añade relieves a la superficie en la dirección del vector unitario normal a la superficie n - N N. Entonces, la normal a la superficie perturbada se obtiene de la manera siguiente:
10.18 Mapcado de relieve
N'=P;XP;
657
uo.112)
La derivada parcial de P' con respecto a u es:
P ' = | - ( P + ¿n) u
d u
= P„+Í>„n K
(10.113)
+
Suponiendo que la magnitud de la función de relieve b sea pequeña, podemos ignorar el último término de la expresión anterior, de modo que:
P>P ¿>„
n
(10.114)
P,>P,+¿>n
(10.115)
u +
De forma similar,
Y la normal a la superficie perturbada será:
(a)
(b>
FIGURA 10.110. Representación del aspecto característico de las superficies rugosas mediante mapeado de relieve. {Cortesia de (a) Peter Shirley, Computer Science Department, Universdüd de Utah y (b) SOFTf MAGE, Jnc\)
658
CAPÍTULO 10
Modelos,
FIGURA 10.111. Rl caballero de cristal de la película Eljoven Sherlock Holmes. Se utilizó una combinación de mapeado de relieve, mapeado de entorno y mapeado de texturas para representar la superficie de la armadura. (Cortesía de Industrial Light & Magic © 1985 Paramount Pictiwes/Amhlin.) N' = P„ x P„ + b, (P x n) + b„ (n x P) + b b (n x n) a
y
Pero n X n = 0, de modo,
N' = N ¿>,,
(ÜÉÉ
+
El paso final consiste en normalizar N' para utilizarla en los cálculos del modelo de iluminación. Hay muchas formas en las que podemos especificar la función de relieve v). Podemos definir una expresión analítica, pero los cálculos se reducen si simplemente obtenemos los valores de relieve mediante tablas de sustitución. Con una tabla de relieve, los valores de b pueden determinarse rápidamente utilizando interpolación lineal y cálculos increméntales. Entonces, las derivadas parciales b y b se aproximan mediante diferencias finitas. La tabla de relieve puede construirse con patrones aleatorios, con patrones de cuadrícula regulares o con formas de caracteres. Los controles aleatorios resultan útiles para modelar una superficie regular, como la de una pasa, mientras que un patrón repetitivo puede utilizarse para modelar la superficie de una naranja, por ejemplo. Para aplicar mecanismos de aniialiasing, suprimimos las áreas de píxel y promediamos las intensidades calculadas de los subpíxeles. H
v
La Figura 10.110 muestra ejemplos de superficies representadas con mapeado de relieve. En la Figura 10.111 se proporciona un ejemplo de métodos combinados de representación superficial. La armadura del caballero de cristal de la película El joven Sherlock Hoimes fue representado mediante una combinación de mapeado de relieve, mapeado de entorno y mapeado de texturas. Un mapa de entorno de la escena circundante fue combinado con un mapa de relieve para producir las reflexiones de iluminación de fondo y la apariencia rugosa de la superficie. Después, se añadieron colores adicionales, iluminación superficial, relieves, manchas de suciedad y pliegues para obtener el efecto global mostrado en esta figura.
10.19 MAPEADO DEL SISTEMA DE REFERENCIA Este método para añadir detalle a las superficies es una extensión del mapeado de relieve. En el mapeado del sistema de referencia (Jrame mapptng), perturbamos tanto el vector normal a la superficie N como un sistema de coordenadas local (Figura 10.112) asociado a N. Las coordenadas locales se definen mediante un vector tangente a la superficie T y un vector binormal B = T X N. El mapeado del sistema de referencia se utiliza para modelar superficies anisólropas. Orientamos T a lo largo de la «veta» de la superficie y aplicamos perturbaciones direccionales, además de las perturbaciones de
10.20 Funciones OpenGL de iluminación y representación de superficies 6 5 9
S u p i
'
r l , c i e
FIGURA 10.112. Un sistema de coordenadas local en una posición de la superficie.
relieve en la dirección N. De esta forma, podemos modelar patrones de veta de madera, patrones de cruce de las hebras en los tejidos y vetas en el mármol u otros materiales similares. Tanto las perturbaciones de relieve como las dirección al es pueden generarse utilizando tablas de sustitución.
10.20 FUNCIONES OpenGL DE ILUMINACIÓN Y REPRESENTACIÓN DE SUPERFICIES En OpenGL hay disponibles diversas rutinas para definir fuentes de luz puntuales, para seleccionar los coeficientes de reflexión superficiales y para elegir valores para otros parámetros del modelo básico de iluminación. Además, podemos simular la transparencia y podemos mostrar los objetos utilizando representación plana de las superficies o representación de Gouraud.
Función OpenGL para fuentes luminosas puntuales Podemos incluir múltiples fuentes luminosas puntuales en la descripción OpenGL de una escena, teniendo asociadas cada fuente luminosa diversas propiedades, como su posición, tipo, color, atenuación y efectos de foco direccional. Podemos establecer un valor de una propiedad para una fuente luminosa con la función: glLighc*
(ÜghCName,
1 ightProperty,
p r o p e r t y V a l u e J ,•
Se añade un código sufijo igual a i o f al nombre de la función, dependiendo del tipo de dato al que pertenezca el valor de la propiedad. Para datos vectoriales, también se añade el código de sufijo v y entonces el parámetro p r o p e r t y V a l u e será un puntero a una matriz. Puede hacerse referencia a cada fuente luminosa mediante un identificador, y al parámetro l i g h t N a m e se le asigna uno de los identiílcadores simbólicos OpenGL G L _ L I G H T O „ G L _ L I G H T I , G L > _ L i G H T 2 . . . , G L _ L I G H T 7 , aunque algunas implementaciones de OpenGL pueden permitir más de ocho fuentes luminosas. De forma similar, al parámetro l i g h t P r o p e r t y hay que asignarle una de las diez constantes simbólicas de propiedad que admite OpenGL. Después de haber asignado todas las propiedades a una fuente luminosa, podemos activarla mediante el comando: t
glEnable
(1ighcName);
Sin embargo, también necesitamos activar las rutinas de iluminación OpenGL, lo que hacemos mediante la función: glEnable
(GL__LIGHTING) ;
Entonces las superficies de los objetos se representan utilizando cálculos de iluminación que incluirán las contribuciones de cada una de las fuentes luminosas que hayan sido activadas.
Especificación de la posición y el tipo de una fuente luminosa en OpenGL La constante simbólica de propiedad OpenGL para designar la posición de una fuente luminosa es GL_POSl En realidad, esta constante simbólica se utiliza para definir dos propiedades de las fuentes luminosas
TION.
660
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
al mismo tiempo: la posición de la fuente luminosa y el tipo de la fuente luminosa. May disponibles en OpenGL dos clasificaciones generales de las fuentes luminosas utilizadas para iluminar una escena. Una fuente luminosa puntual puede clasificarse como próxima a los objetos que hay que iluminar (una fuente local) o puede tratarse como si estuviera infinitamente alejada de una escena. Esta clasificación es independiente de la posición que asignemos a la fuente luminosa. Para una fuente luminosa próxima, la luz emitida radia en todas direcciones y la posición de la fuente luminosa se incluye en los cálculos de iluminación. Pero la luz emitida por una fuente distante sólo puede emanar en una dirección y esta dirección se aplica a todas las superficies de la escena, independientemente de la posición que hayamos asignado a la fuente luminosa. La dirección de los rayos emitidos desde una fuente clasificada como distante se calcula como la dirección desde la posición asignada de la linca que une la posición asignada a la fuente luminosa con el origen de coordenadas. Se utiliza un vector de coma flotante de cuatro elementos para designar tanto el tipo de la fuente luminosa como los valores de coordenadas que definen su posición. Los primeros tres elementos de este vector proporcionan la posición en coordenadas universales, mientras que el cuarto elemento se utiliza para designar el tipo de la fuente luminosa. Si asignamos el valor 0.0 al cuarto elemento del vector de posición, la luz .se considera como una fuente muy distante (lo que se denomina en OpenGL una luz «direccional») y la posición ele la fuente luminosa se utilizará entonces únicamente para determinar la dirección de los rayos de luz. En caso contrario, se asume que la fuente luminosa es una fuente puntual local (lo que se denomina en OpenGL una luz «posicionat» y la posición de la luz es utilizada por las rutinas de iluminación con el fin de determinar la dirección de los rayos luminosos que inciden sobre cada objeto de la escena. En el siguiente ejemplo de código, la fuente luminosa l está definida como una fuente local en la ubicación (2.0, 0.0, 3.0), mientras que la fuente luminosa 2 es una fuente distante que emite los rayos luminosos en la dirección y negativa: GLfloat U g h t l P o s T y p e [ ]
= (2.0,
0.0, 3.0,
1.0);
GLÉloat light2PosType [ ]
= (0.0,
1.0,
0.0};
glLightCv glEnable glLightfv glEnable
(GL_LIGHT1,
O.ü,
GL_POSITION,
UghtlPosType);
GL_POSITION,
light2PosType);
(GL_LIGHT1); (GL_LIGHT2, (GL_LIGHT2 >;
Si no especificamos una posición y un tipo para una fuente luminosa, los valores predeterminados son (0.0, 0.0, 1.0, 0.0), lo que indica una fuente distante cuyos rayos luminosos viajan en la dirección z negativa. La posición de una fuente luminosa está incluida en la descripción de la escena y se transforma a coordenadas de visualización junto con las posiciones de los objetos; esta transformación se lleva a cabo mediante las matrices de transformación geométrica y transformación de visualización de OpenGL. Por tanto, si queremos conservar una fuente luminosa en una posición fija relativa a los objetos de una escena, debemos definir su posición después de especificar las transformaciones geométricas y de visualización del programa. Pero si queremos que la fuente luminosa se mueva a medida que se mueve el punto de vista, definiremos su posición antes de especificar la transformación de visualización y podemos aplicar una traslación o rotación a una fuente luminosa con el fin de moverla alrededor de una escena estacionaria.
Especificación de los colores de las fuentes luminosas en OpenGL A diferencia de una fuente luminosa real, una fuente en OpenGL tiene tres diferentes propiedades de color RGBA. En este esquema empirico, los tres colores de la fuente luminosa proporcionan opciones para variar los efectos de iluminación de una escena. Configuramos estos colores utilizando las constantes simbólicas de propiedad del color G L _ A M B I E N T , G L _ D I F F U S E y G L _ S P E C U L A R . A cada uno de estos colores se le asigna un conjunto de cuatro valores de coma flotante. Las componentes de cada color se especifican en el orden ( R , G, B, A) y la componente alpha se utiliza sólo si están activadas las rutinas de mezcla de color. Como cabe suponer a partir de los nombres de las constantes simbólicas de propiedad del color, uno de los colores de la fuente luminosa contribuye a la luz de fondo (ambiente) de la escena, otro color se utiliza en los cálculos de
10.20 Funciones OpenGL de iluminación y representación de superficies 661 iluminación difusa y el tercer color se emplea para calcular los efectos de iluminación especular para las superficies. En realidad, las fuentes luminosas tienen sólo un color, pero podemos utilizar los tres colores de fuente luminosa en OpenGL para crear distintos efectos de iluminación. En el siguiente ejemplo de código, asignamos el color negro como color ambiente para una fuente luminosa local, denominada G L _ L I G H T 3 , y asignamos el color blanco a los colores difuso y especular. GLfloat blackColor [ ]
= {u.O,
0.0,
0.0, 1.0};
GLfloat whiteColor [ ]
= {l.O,
1.0,
1.0,
1.0};
glLightfv
(GL_LIGHT3,
GL_AMBIENT,
blackColor);
glLightfv
(GL_L.IGHT3,
GL_DIFFUSE,
whiteColor);
glLightfv
(GL_LIGHT3,
GL_SPECULAR,
whiteColor);
Los colores predeterminados para la fuente luminosa 0 son negro para el color ambiente y blanco para los colores difuso y especular. Todas las demás fuentes luminosas tienen como color predeterminado el negro para las propiedades de color ambiente, difuso y especular.
Especificación de coeficientes de atenuación radial de la intensidad para una fuente luminosa OpenGL Podemos aplicar una atenuación radial de la intensidad a la luz emitida desde una fuente luminosa local OpenGL, y las rutinas de iluminación OpenGL calcularán esta atenuación utilizando la Ecuación 10.2, siendo d la distancia desde la posición de la fuente luminosa hasta la posición de un objeto. Las tres constantes de propiedad OpenGL para la atenuación radial de la intensidad son G L _ C O N S T A N T _ A T T E N U A T I O N , G L _ L i N E A R _ A T T E N U A T I O N y G L _ Q U A D R A T I C _ A T T E N U A T I O N , que se corresponden con los coeficientes £ 7 , a, y a de la Ecuación 10.2. Puede utilizarse un valor entero positivo o un valor positivo de coma flotante para definir cada uno de los coeficientes de atenuación. Por ejemplo, podríamos asignar los valores de los coeficientes de atenuación radial de la forma siguiente: f
0
2
glLightf
(GL_LIGHT6, GL_C0NSTANT_ATTENUATlON,
glLightf
(GL_LIGHT6,
GL_LINEAR_ATTENDATION,
glLightf
ÍGL_LIGHT6,
GL_QUADRATIC_ATTENUATION,
1.5);
0.75); 0.4) ;
Una vez especificados los valores de los coeficientes de atenuación, la función de atenuación radial se aplica a los tres colores (ambiente, difuso y especular) de la fuente luminosa. Los valores predeterminados de los coeficientes de atenuación son ct = LO, a = 0.0 y a = 0.0. Así, la opción predeterminada es que no haya atenuación radial:/, = 1.0. Aunque la atenuación radial puede producir imágenes más realistas, los cálculos consumen mucho tiempo. Q
]
2
r a d ¡ l U e n
Fuentes luminosas direccionales en OpenGL (focos) Para fuentes luminosas locales (aquellas que no se considera que están en el infinito), podemos también especificar un efecto direccional o de foco. Esto limita la luz emitida de la fuente a una región del espacio con forma de cono. Definimos la región cónica mediante un vector de dirección según el eje del cono mediante una apertura angular 0, con respecto al eje del cono, como se muestra en la figura 10.11 % Además, podemos especificar un exponente angular de atenuación a¡ para la fuente luminosa, que determinará cuánto decrece la intensidad de la luz a medida que nos alejamos desde el centro del cono hacia la superficie del mismo. A lo largo de cualquier dirección dentro del cono de luz, el factor de atenuación angulares c o s ' «(Ecuación 10.5), donde eos a se calcula como el producto escalar del vector del eje del cono y del vector que une la fuente luminosa con la posición de un objeto. Calculamos el valor para cada uno de los colores ambiente, diluso y especular en un ángulo a multiplicando las componentes de intensidad por este factor de atenuación angular. Si a > 0f, el objeto estará fuera del cono de la fuente luminosa y no será iluminado por ésta. Para los rayos de luz que se encuentran dentro del cono, también podemos atenuar radialmente los valores de intensidad. ü
6 6 2
CAPÍTULO 1 0
Modelos de iluminación y nielados de representación superficial
FIGURA 10.113. Un cono circular de luz emitido por una fuente luminosa OpenüL. La extensión angular del cono de luz, medido desde el eje del cono, es 6, y el ángulo desde el eje al vector de dirección de un objeto se designa mediante O.
Fuente luminosa
Hay tres constantes de propiedad OpenGL para los efectos direccionales: G L _ S P O T _ D I R E C T I O N , y G L _ S P O T _ _ E X P O N E N T . Especificamos la dirección de la luz como un vector en coordenadas universales enteras o de coma dotante. El ángulo del cono 8 se especifica como un valor entero o de coma ílotante en grados, y este ángulo puede ser 180° o cualquier valor en el rango que va de 0° a 90°. Cuando el ángulo del cono se hace igual a 180°, la fuente luminosa emite rayos en todas direcciones (360"). Podemos definir el valor del exponente de la atenuación de intensidad como un número entero o en coma flotante en el mugo comprendido entre 0 y 128. Las siguientes inscripciones especifican los efectos direccionales para la fuente luminosa número 3 de modo que el eje del cono se encuentra en la dirección .v, el ángulo del cono 6¡ es 30° y el exponente de atenuación es 2.5.
GL_SPOT_CUTOFF
t
GCfloat dirVector glLightfv
[
(GL_LIGHT3,
]
=
(1.0,
0.0,
0.0};
GL_SPOT_DIRECTION
glLightf
{GL_UIGHT3,
GL_SPOT_CUTOFF,
glLightf
{GL_LIGHT3,
GL_SPOT_EXPONENT,
dirVector);
#
30.0); 2.5);
Si no especificamos una dirección para la fuente luminosa, la dirección predeterminada será paralela al eje z negativo, es decir, (0.0, 0.0, —1.0). Asimismo, el ángulo predeterminado del cono será 180° y el exponente de atenuación predeterminado será 0. Así, la opción predeterminada es una fuente luminosa puntual que irradia en todas direcciones, sin ninguna atenuación angular.
Parámetros de iluminación globales en OpenGL Pueden especificarse diversos parámetros de iluminación en OpenGL a nivel global. Estos valores se utilizan para controlar la forma en que se llevan a cabo detemiinados cálculos de iluminación, y un valor de parámetro global se especifica mediante la siguiente función: glLightModel*
(paramName,
paramValue);
Agregamos un código de sufijo igual a i o f, dependiendo del tipo de dato del valor del parámetro. Y para los dalos vectoriales, también agregamos el código de sufijo v. Al parámetro paramName se le asigna una constante simbólica OpenGL que identifica la propiedad global que hay que configurar, mientras que al parámetro paramValue se le asigna un único valor o un conjunto de valores. Utilizando la función g l L i g h t M o d e l , podemos definir un nivel global de luz ambiente, podemos especificar cómo hay que caieu-
10.20
fruiciones
OpenGL de iluminación y representación de superficies
663
lar los resaltes especulares y podemos decidir si debe aplicarse el modelo de iluminación a las caras posteriores de las superficies poligonales. Además de un color ambiente para las fuentes de luz individuales, podemos especificar un valor independiente para la iluminación de fondo de O p e n G L e n forma de parámetro global. Esto proporciona una opción adicional para los cálculos empíricos de iluminación. Para establecer esta opción, utilizamos una constante simbólica GL_LIGHT_MODEL_AMBIENT. La siguiente instrucción, por ejemplo, establece la iluminación de fondo general para una escena, asignándola un color azul de baja intensidad (oscuro), con un valor de alpha igual a 1.0: globalAmbienC glLightModelfv
[ ]
= (0.0, 0.0, 0.3, 1 . 0 ) ;
(GL_LIGHT_MODEL_AMBIENT,
globalAmbient);
Si no especificamos un nivel global de luz ambiente, la opción predeterminada es un color blanco de baja intensidad (gris oscuro), que equivale al valor (0.2, 0.2, 0.2, 1.0). Los cálculos de las reflexiones especulares requieren determinar diversos vectores, incluyendo el vector V que une una posición de una superficie con una posición de visualización. Para acelerar los cálculos de rellexión especular, las rutinas de iluminación de OpenGL pueden utilizar una dirección constante para el vector V, independientemente de la posición de la superficie en relación con el punto de visualización. Este vector unitario eonsUmte está en la dirección r positiva, (0.0, 0.0, 1.0), y es el valor predeterminado para V, pero si querernos desactivar este valor predeterminado y calcular V utilizando la posición de visualización real, que es el origen del sistemas de coordenadas de visualización, podemos utilizar el siguiente comando: glLightModeli
{GL_LIGHT_MODEL_LOCAL_VIEWER,
GL_TRUE);
Aunque los cálculos de reflexión especular requieren más tiempo cuando utilizamos la posición real de visualización para calcular V, lo cierto es que se obtienen imágenes más realistas. Podemos desactivar los cálculos superficiales para el vector V utilizando el valor predeterminado G L F A L S E (O 0, o 0.0) para el parámetro del observador local. Cuando se añaden texturas superficiales a los cálculos de iluminación OpenGL, los resalles de las superficies pueden atenuarse y los patrones de textura pueden verse distorsionados por los términos especulares. Por tanto, como opción, los patrones de textura pueden aplicarse únicamente a loé términos no especulares que contribuyen al color de una superficie. Estos términos no especulares incluyen los efectos de la luz ambiente, las emisiones superficiales y las reflexiones difusas. Utilizando esta opción, las rutinas de iluminación OpenGL generan dos colores para cada cálculo de iluminación superficial: un color especular y las contribuciones de color no especulares. Los patrones de textura se combinan únicamente con el color no especular, después de lo cual se combinan los dos colores. Para seleccionar esta opción de dos colores se utiliza la instrucción: glLightModeli
{GL_LIGHT_MODEL _COLOR_CONTROL, GL_ SE PARATE_S PECULAR_COt,OR) ;
No es necesario separar los términos de color si no estamos usando patrones de texturas, y los cálculos de iluminación se realizan de manera más eficiente si no se activa esta opción. El valor predeterminado para esta propiedad es G L _ S I N G L E _ C O L O R , que no separa el color especular de las otras componentes de color de la superficie. En algunas aplicaciones, puede que convenga mostrar las superficies posteriores de un objeto. Un ejemplo sería la vista interior en corle transversal de un sólido, en la cual habrá que mostrar algunas superficies posteriores, además de las superficies frontales. Sin embargo, de manera predeterminada, los cálculos de iluminación utilizan las propiedades asignadas de los materiales únicamente para las caras frontales. Para aplicar los cálculos de iluminación tanto a las caras frontales como a las posteriores, utilizando las correspondientes propiedades de los materiales de las caras frontal y posterior, utilizamos el comando: glLightModeli
ÍGL_LIGHT_MODEI _TWO_SIDE, GL_TRUE) ; J
664
Modelos de iluminación y métodos de representación superficial
CAPÍTULO 10
Los vectores normales a la superficie de las caras posteriores serán entonces invertidos y se aplicarán los cálculos de iluminación utilizando las propiedades de los materiales que se hayan asignado a las caras posteriores. Para desactivar los cálculos de iluminación en los dos lados, utilizamos el valor G L _ F A L S E (O 0, oO.Ü) en la flmción g l L i g h t M o d e l , valor que es el que se usa de manera predeterminada.
Función OpenGL de propiedad de una superficie Los coeficientes de reflexión y otras propiedades ópticas de las superficies se configuran utilizando la función: glMaterial*
(surfFace,
surfProperty,
propercyValue);
A la función se le añade un código de sufijo i o f, dependiendo del tipo de dalo del valor de la propiedad, y también se agrega el código v cuando se suministran propiedades que toman como valor un vector. Al parámetro s u r f F a c e se le asigna una de las constantes simbólicas G L _ F R O N T , GL_BACK O GL_FRONT_AND_BACK; el parámetro s u r f P r o p e r t y es una constante simbólica que identifica un parámetro de la superficie tal como / JL k k o h¿ y el parámetro p r o p e r t y v a l u e hay que configurarlo con el correspondiente valor. Todas las propiedades, exceptuando el componente de reflexión especular « , se especifican como valores vectoriales. Para establecer todas las propiedades de iluminación de un objeto utilizamos una secuencia de ñinciones g l M a t e r i a l , antes de ejecutar los comandos que describen la geometría del objeto. El valor RGIJA para el color de emisión de la superficie, / se selecciona utilizando la constante simbólica OpenGL de propiedad de la superficie G L _ E M I S S I O N . Como ejemplo, la siguiente instrucción establece el color de emisión para las superficies frontales asignándole un color gris claro: surfS
(ft
9
surfS
SurfEmissionColor glMaterialfv
[
]
=>
(GL_FRONT,
{0.8,
0.8,
GL_EMISSION,
0.8,
1.0};
SurfEmissionColor);
El color predeterminado de emisión de una superficie es el negro, (0.0. 0.0, 0.0, 1.0). Aunque puede asignarse un color de emisión a una superficie, esta emisión no ilumina a otros objetos de la escena. Para hacer eso, debemos definir la superficie como una fuente luminosa utilizando los métodos explicados en la Sección 10.3. Se utilizan los nombres simbólicos de propiedad OpenGL GL_AMBIENT, GLJDIFFUSE y GL_SPECULAR para asignar valores a los coeficientes de reflexión de la superficie. En el mundo real, los coeficientes ambiente y difuso deberían tener asignado el mismo valor vectorial, y podemos hacer eso utilizando la constante simbólica G L _ A M B i E N T _ A N D _ D i F F Ü S E . Los valores predeterminados para el coeficiente de ambiente son (0.2, 0.2, 0.2, 1.0), los valores predeterminados para el coeficiente difuso son (0.8, 0.8, 0.8, 1.0) y los valores predetemiinados para el coeficiente especular son (1.0, 1.0, 1.0, 1.0). Para definir el exponente de reflexión especular, utilizamos la constante G L _ S H I N I N E S S . Podemos asignar a esta propiedad cualquier valor en el rango comprendido entre 0 y 128 y el valor predeterminado es 0. Como ejemplo, las siguientes instrucciones establecen los valores de los tres coeficientes de reflexión y para el exponente especular. Los coeficientes difuso y de ambiente se configuran de modo que la superficie se muestre con un color azul claro al ser iluminada con luz blanca; la reflexión especular es del color de la luz incidente y el exponente especular tiene asignado un valor de 25.0. diffuseCoeff
[
specularCoeff glMaterialfv
] [
= ]
(0.2, =
{1.0,
0.4, 1.0,
(GL_FRONT_AND_BACK,
0.9, 1.0,
1.0}; 1.0} ;
GL_AMBIENT_AND_DIFFUSE,
diffuseCoeff); glMaterialfv
glMaterialf
(GL_FRONT_AND_BACK, (GL_FRQNT_AND_BACK,
GL_SPECULAR, GL_SHININESS,
specularCoeff); 25.0);
Las componentes de los coeficientes de reflexión también pueden definirse utilizando valores de una tabla de color, para lo cual se proporciona la constante simbólica OpenGL GL_COLOR_INDEXES. LOS índices de la
10.20 Punciones OpenGL de iluminación y representación de superficies
665
tabla de color se asignan como una matriz de tres elementos enteros o de coma flotante, y el valor predeterminado es (0, 1,1).
Modelo de iluminación OpenGL OpenGL calcula los electos de iluminación superficiales utilizando el modelo básico de iluminación 10.19, con algunas variaciones sobre la forma de especificar ciertos parámetros. El nivel de luz ambiente es la suma de las componentes de ambiente de las fuentes luminosas y del valor global de luz ambiente. Los cálculos de reflexión difusa utilizan las componentes de intensidad difusa de las fuentes luminosas y los cálculos de reflexión especular utilizan la componente de intensidad especular de cada fuente. Asimismo, el vector unitario v, especifica la dirección desde una posición de la superficie hasta una posición de visualización, y se le puede asignar el valor constante (0.0, 0.0, 0.0) si no se utiliza la opción de observador local. Para una fuente luminosa situada en el 'Infinito", el vector unitario de dirección de la luz L está en la dirección opuesta a la que se haya asignado a los rayos de luz procedentes de dicha fuente.
Efectos atmosféricos en OpenGL Después de haber aplicado el modelo de iluminación con el fin de obtener los colores superficiales, podemos asignar un color a la atmósfera de una escena y combinar los colores superficiales con dicho color de atmósfera. También podemos usar una función de atenuación de la intensidad atmosférica con el fin de simular la visualización de la escena a través de una atmósfera neblinosa o llena de humo. Los diversos parámetros atmosféricos se configuran utilizando la función g l F o g que hemos presentado en la Sección 9.14: glEnable glFog*
(GL_FOG);
(atmoParameter,
paramValue);
Se añade un código de sufijo igual a i o f para indicar el tipo del valor de datos, y con los datos vectoriales se utiliza el código de sufijo v. Para definir un color de atmósfera, asignamos la constante simbólica OpenGL GL_FOG_COLOR al parámetro atmoParameter. Por ejemplo, podemos hacer que la atmósfera tenga un color gris azulado mediante la instrucción: GLEloat atmoColor glFogfv
[4]
=
{GL_FOG_COLOR,
{0.8,
0.8,
1.0,
l.O);
atmoColor);
El valor predeterminado para el color de la atmósfera es el negro, (0.0. 0.0, 0.0, 0.0). A continuación, podemos elegir la función de atenuación atmosférica que haya que utilizar para combinar los colores de los objetos con el color de la atmósfera. Esto se lleva a cabo utilizando la constante simbólica GL_FOG_MODE: glFogi
ÍGL_FOG_MODE,
atmoAttenFunc);
Si asignamos al parámetro atmoAttenFunc el valor GL_EXP, se usará la Ecuación 10.312 como función de atenuación atmosférica. Con el valor GL_EXP2, se selecciona la Ecuación 10.32 como función de atenuación de atmósfera. Para cualquiera de ambas funciones exponenciales, podemos seleccionar un valor de densidad de la atmósfera mediante: glFog
(GL_FOG_DENSITY,
atmoDensity);
Una tercera opción para atenuaciones atmosféricas es la función lineal 9.13 de variación de la intensidad con la profundidad. En este caso, asignamos al parámetro atmoAttenFunc el valor GL_LINEAR. El valor predeterminado para el parámetro atmoAttenFunc es GL_EXP. Una vez seleccionada una función de atenuación atmosférica, esta función se utiliza para calcular la mezcla del color de la atmósfera y del color de la superficie del objeto. OpenGL utiliza la Ecuación 10.33 en sus rutinas atmosféricas para calcular este color de mezcla.
6 6 6 CAPÍTULO 10 Motlelos de iluminación y métodos de represen ración superficial
Funciones de transparencia OpenGL En OpenGL pueden simularse algunos electos de transparencia utilizando las rutinas de mezcla de color descritas en la Sección 4.3. Sin embargo, la implementación de la transparencia en un programa OpenGL no suele ser sencilla. Podemos combinar los colores de los objetos para una escena simple que contenga unas pocas superficies opacas y transparentes utilizando el valor de mezcla alpha para especificar el grado de transparencia y procesando las superficies según su orden de profundidad. Pero las operaciones de mezcla de color OpenGL ignoran los efectos de refracción, y el manejo de superficies transparentes en escenas complejas con una diversidad de condiciones de iluminación o con animaciones puede resultar muy complicado. Asimismo, OpenGL no proporciona ninguna funcionalidad para simular la apariencia superficial de un objeto translúcido (como por ejemplo un cristal esmerilado), que dispersa de manera difusa la luz transmitida a través del material semitransparente. Por tanto, para mostrar superficies translúcidas o los efectos de iluminación resultantes de la refracción, necesitamos describir nuestras propias rutinas. Para simular los efectos de iluminación a través de un objeto translúcido, podemos utilizar una combinación de valores de textura superficial y de propiedades del material. Para los efectos de refracción, podemos desplazar las posiciones de píxel para las superficies que se encuentren detrás de un objeto transparente, utilizando la Ecuación 10.29 para calcular el desplazamiento necesario. Podemos designar como transparentes los objetos de una escena utilizando el parámetro alpha en los comandos de color RGBA de superficie de OpenGL, tal como g l M a t e r i a l y g l C o l o r . Puede asignarse al parámetro alpha de una superficie el valor del coeficiente de transparencia (Ecuación 10.30) de dicho objeto. Por ejemplo, si especificamos el color de una superficie transparente mediante la función: glColor4f
CR,
G,
B,
A) ;
entonces, asignaremos al parámetro alpha el valor A = k A una superficie completamente transparente se le asignaría el valor alpha A = 1.0 y a una superficie opaca, el valor alpha A = 0.0. Una vez asignados los valores de transparencia, activamos las características de mezcla de color de OpenGL y procesamos las superficies, comenzando con los objetos más distantes y siguiendo por orden hasta los objetos más cercanos a la posición de visualización. Con la mezcla de color activada, cada color superficial se combina con los de las superficies solapadas que ya se encuentran en el búfer de imagen, utilizando los valores alpha asignados a la superficie. Configuramos los iáctores de mezcla de color de modo que todas las componente de color de la superficie actual (el objeto «fuente») se multiplican por (1 - A) = (I — k ), mientras que todas las componentes de color de las posiciones correspondientes del búfer de imagen (el «destino») se multiplican por el factor A = k : r
f
f
glEnable
(GL_BLEND);
g l B l e n d F u n c (GL_ONE_MINUS_SRC_ALPHA, GL_S R C_AL PHA};
Los dos colores se mezclan entonces utilizando la Ecuación 10.30, teniendo el parámetro alpha el valor k siendo los colores del búfer de imagen los correspondientes a una superficie que está detrás del objeto transparente que se esté procesando. Por ejemplo, si A = 0.3, entonces el nuevo color del búfer de imagen será la suma del 30 por ciento del color actual del búfer de imagen y el 70 por ciento del color de reflexión del objeto, para cada posición de la superficie. (Alternativamente, podríamos utilizar el parámetro de color alpha como factor de opacidad, en lugar de como factor de transparencia. Sin embargo, si asignamos a A un valor de opacidad, deberemos intercambiar también los dos argumentos en la función glBlendFunc.) Las comprobaciones de visibilidad pueden llevarse a cabo utilizando las funciones de búfer de profundidad de OpenGL de la Sección 9 . 1 4 . A medida que se procesa cada superficie visible opaca, se almacenan tanto los colores de la superficie como la profundidad de la misma. Pero cuando procesamos una superficie visible transparente, lo único que guardamos son sus colores, ya que la superficie no oculta a las superficies de fondo. Por tanto, cuando procesamos una superficie transparente, ponemos el búfer de profundidad en estado de sólo lectura utilizando la función g l D e p t h M a s k . p
1 0 . 2 0 luncumes OpenGL de iluminación y representación de superficies
667
Si procesamos todos los objetos en orden de profundidad, el modo de escritura del búfer de profundidad se desactiva y activa a medida que procesamos cada superficie transparente. Alternativamente, podríamos separar las dos clases de objeto, como en el siguiente fragmento de código: glEnable \*
ÍGL_DEPTH_TEST);
Procesar
glEnable
todas
las
superficies
opacas.
*\
(GL_BLEND);
gluepthMask
(GL_FALSE);
glBlendFunc
(GL_ONE_MINUS_SRC_ALPHA,
\*
todas
Procesar
glDepthMask glDisable
las
superíicies
GL_SRC_ALPHA);
transparentes.
*\
(GL_TRUE) ; ÍGLBLEND);
glutSwapBuffers
{
);
Si no se procesan los objetos transparentes en orden estricto de profundidad, comenzando por los más alejados, esta técnica no acumulará los colores superficiales con precisión en lodos los casos. Pero para las escenas simples se trata de un método rápido y efectivo para generar una representación aproximada de los efectos de transparencia.
Funciones de representación superficial OpenGL Las superficies pueden mostrarse con las rutinas OpenüL utilizando técnicas de representación superficial de intensidad constante o mecanismos de representación superficial de (iouraud. No se proporcionan rutinas OpenGL para aplicar los mecanismos de representación superficial de Phong, los mecanismos de trazado de rayos ni los métodos de radiosidad. I-I método de representación se selecciona mediante: glShadeModel
(surfRenderingMethod);
La representación de superficies con intensidad constante se desclecciona asignando el valor simbólico GL_FLAT al parámetro s u r f RenderingMethod. Para el sombreado de Gouraud (la opción predeterminada), utilizamos la constante simbólica GLSMOOTH. Cuando se aplica la función glShadeModel a una superficie curva teselada, como por ejemplo una esfera que esté aproximada mediante una malla poligonal, las rutinas de representación OpenGL utilizan los vectores normales a la superficie en los vértices del polígono para calcular el color del polígono. Las componentes cartesianas de un vector normal a la superficie en OpenGL se especifica mediante el comando: glNormal3*
(Nx,
Ny,
NzJ;
Los códigos de un sufijo para esta función son b (bytc), s (short), i (integer), i (fioal) y d (double). Además, añadimos el código de sufijo v cuando se proporcionen las componentes del vector mediante una matriz. Los valores de tipo bytes, shorl e integer se convierten a valores de tipo coma flotante comprendidos entre - 1.0 y 1.0. La función glNormal define las componentes del vector normal a la superficie como valores de estado que se aplican a todos los comandos g l V e r t e x subsiguientes. Kl vector normal predeterminado está en la dirección z positiva: (0.0, 0.0, 1.0). Para representación superficial plana, sólo necesitamos una normal a la superficie para cada polígono. El siguiente fragmento de código muestra cómo podemos definir la normal a cada polígono: glNormal3fv glBegin
(normalVector);
(GLTR1ANGLES);
glVertex3fv
(vertexl);
glVertex3fv
(vertex2J;
glVertex3fv
{vertex3);
glEnd
(
);
668
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Si queremos aplicar el procedimiento de representación superficial de Gouraud al triángulo anterior, necesitaremos especificar un vector normal para cada vórtice; glBegin
(GLTRIANGLES í ;
glNormal3fv
(normalVectorlí;
glVertex3fv
(vertexl);
glNormal3fv
(normalVector2);
glVertex3fv
(vertex2);
qlNormal3fv
(normalVector3);
glVertex3fv
(vertex3);
glEnd
{
);
Aunque los vectores normales no necesitan especificarse como vectores unitarios, los cálculos se reducirán si definimos como vectores unitarios todas las normales a las superficies. Cualquier normal a la superficie no unitaria será automáticamente convertida a un vector unitario si antes ejecutamos el comando: glEnable
(GL_NORMALIZE);
Este comando también renormali/a los vectores de las superficies cuando éstos se han visto modificados por transformaciones geométricas tales como un cambio de escala o una inclinación. Otra opción disponible es la especificación de una lista de vectores normales que haya que combinar o asociar con una matriz de vértices (Sección 3.I7 y Sección 4.3). Las instrucciones para crear una matriz de vectores normales son: glEnableClientState glNormalPointer
lGL_NORMAL_ARRAY);
(dataType,
offset,
normalArray);
Al parámetro d a t a T y p e se le asigna el valor constante G L _ B Y T E , GL_SHORT, G L _ I N T , GL_FLOAT (el valor predeterminado) o GL_DOUBLE. El número de bytes entre vectores normales sucesivos en la matriz n o r m a l A r r a y está dado por el parámetro o f f s e t , que tiene un valor predeterminado de 0,
Operaciones de semitonos en OpenGL En algunos sistemas pueden conseguirse diversos efectos de color y de escala de grises utilizando las rutinas de semitonos de OpenGL. Los patrones de aproximación de semitonos y las operaciones correspondientes son dependientes del hardware, y normalmente no tienen ningún efecto en los sistemas que dispongan de capacidades gráficas completas de color. Sin embargo cuando un sistema sólo tiene un pequeño número de bits por píxel, pueden aproximarse las especificaciones de color RGBA mediante patrones de semitono. Podemos activar las rutinas de semitonos con: glEnable
(GLDITHER);
que es la opción predeterminada, y desactivarlas mediante la función, glDisable
10.21
ÍGL_DITHER};
FUNCIONES DE TEXTURAS EN OpenGL
OpenGL dispone de un amplio conjunto de funciones de texturas. Podemos especificar un patrón para una línea, para una superficie, para un volumen interior o una región espacial, o como un subpatrón que haya que insertar dentro de otro patrón de texturas. También podemos aplicar y manipular los patrones de texturas de diversas formas. Además, los patrones de texturas pueden utilizarse para simular el mapeado de enlomo. Las rutinas de texturas OpenGL sólo pueden utilizarse en el modo de color RGB (RGBA). aunque algunos parámetros pueden configurarse utilizando un índice a una tabla de colores.
Funciones de texturas
10.21
en
OpenGL
669
Funciones OpenGL para texturas lineales Podemos utilizar un comando de la forma siguiente para especificar los parámetros de un patrón de texturas RGBA unidimensional medíanle una matriz de colores de una única dimensión: glTexImagelD
(GL_TEXTURE_1D, dataFormat,
glEnable
0,
GL_RGBA,
dataType,
nTexColors,
0,
lineTexArray);
(GL_TEXTURE_1D);
Hemos asignado al primer argumento de la función g l T e x I m a g e l D la constante simbólica OpenGL GL_TEXTURE_1D, para indicar que estamos definiendo una matriz de texturas para un objeto unidimensional: una línea. Si no estamos seguros de que el sistema vaya a soportar el patrón de texturas con los parámetros especificados, deberemos utilizar la constante simbólica G L _ P R O X Y _ T E X T U R E _ I D como principal argumento de g l T e x I m a g e l D . Esto nos permite consultar primero el sistema antes de definir los elementos de la matriz de texturas; hablaremos de los procedimientos de consulta en una sección posterior. Para el segundo y el quinto argumentos de esta función de ejemplo, utilizamos el valor 0. El primer valor 0 (segundo argumento) significa que esta matriz no es una reducción de otra matriz de texturas mayor. Para el quinto argumento, el valor 0 significa que no queremos que haya un borde alrededor de la textura. Si asignáramos a este quinto argumento el valor 1 (la única otra posibilidad), el patrón de texturas se mostraría con un borde de un píxel a su alrededor, que se utiliza para mezclar el patrón con los patrones de textura adyacentes. Para el tercer argumento, el valor GL_RGBA significa que cada color del patrón de texturas está especificado con cuatro valores RGBA. Podríamos habernos limitado a utilizar los tres valores de color RGB, pero los valores RGBA se procesan en ocasiones de manera más eficiente, ya que se alinean con las fronteras de la memoria del procesador. Es posible utilizar muchas otras especificaciones de color, incluyendo un único valor de intensidad o de luminancia. El parámetro n T e x C o l o r s , en cuanto a argumento, debe tener un valor entero positivo que indique el número de colores del patrón lineal de texturas. Puesto que hemos proporcionado un valor 0 para el quinto argumento (el parámetro de borde), el número de colores del patrón de textura debe ser una potencia de 2. Si hubiéramos asignado al quinto argumento el valor 1, entonces el número de colores del patrón de texturas tendría que ser 2 más una potencia de 2. Los dos bordes de color se utilizan para permitir la mezcla de color con los patrones adyacentes. Podemos especificar el patrón de texturas unidimensional con hasta 64 + 2 colores y algunas implementaciones OpenGL permiten patrones de textura mayores. Los parámetros que describen los colores de la textura y los colores de borde se almacenan en l i n e T e x A r r a y . En este ejemplo, no tenemos ningún borde y cada grupo sucesivo de cuatro elementos de la matriz representa una componente de color del patrón de texturas. Por tanto, el número de elementos de l i n e T e x A r r a y es 4 X n T e x C o l o r s . Como ejemplo específico, si quisiéramos definir un patrón de texturas Con 8 colores, la malriz de texturas deberían contener 4 X 8 = 32 elementos. Los parámetros d a t a F o r m a t y d a t a T y p e son similares a los argumentos de las funciones g l D r a w P i x e l s y g l R e a d P i x e l s (Sección 3.19). Asignamos una constante simbólica OpenGL a d a t a F o r m a t para indicar cómo se especifican los valores de color en la matriz de texturas. Por ejemplo, podríamos usar la constante simbólica GL__BGRA para indicar que las componentes de color están especificadas en el orden azul, verde, rojo, alpha. Para indicar el tipo de datos BGRA o RGBA, podemos asignar la constante OpenGL G L _ U N S I G N E D _ B Y T E al parámetro d a t a T y p e . Otros posibles valores que podrían asignarse al parámetro d a t a T y p e , dependiendo del formato de los datos que elijamos, son G L _ I N T y GL_FLOAT, entre otros. Podemos mapear múltiples copias de una textura, o de cualquier subconjunlo contiguo de los colores de textura, a un objeto de la escena. Cuando se mapea un grupo de elementos de textura sobre una o más áreas de píxel, las fronteras de los elementos de textura no suelen alinearse con las posiciones de las fronteras de los píxeles. Un área de píxel determinada podría estar contenida dentro de las fronteras de un único elemento de texlura RGB (o RGBA), o podría solaparse con varios elementos de textura. Para simplificar los cálculos del ma-peado de texturas, utilizamos las siguientes funciones para proporcionar a cada píxel el color del elemento de textura más próximo:
670
CAPÍTULO 10
Modelos de iluminación y métodos tic representación superficial
glTexParameteri
(ÜL T E X T Ü R E 1 D ,
glTexParameteri
(GL_TEXTURE_ 1 0 ,
GLTEXTURE_MAG_FILTER,
GI.NEAREST} ; GLTEXTUR E_MIN_ FILTER,
GL_NEAREST);
La primera función es utilizada por las rutinas de lexturado cuando una sección del patrón de texturas deba agrandarse para encajar en un rango de Coordenadas específico dentro de la escena, mientras que la segunda función se utiliza cuando el patrón de texturas tenga que ser reducido (estas dos operaciones de lexturado en OpenGL se denominan magnificación, MAG y minilicación. MI N). Aunque la operación de asignar el color de textura más próximo a un píxel puede llevarse a cabo rápidamente, también puede hacer que aparezcan electos de aliasing. Para calcular el color del pixel como combinación lineal de los colores de textura solapados, sustituimos la constante simbólica GL NEAREST por GL LINEAR. I lay muchos otros valores de parámetro que pueden especificarse con la función g l T e x P a r a m e t e r , y examinaremos dichas opciones en una seeción posterior. La especificación de patrones de textura OpenGL para una escena es en cierto modo similar a la especificación de vectores normales a la superficie, colores RGB u otros atributos. Necesitamos asociar un patrón con un determinado objeto, pero ahora, en lugar de un único valor de color, tenemos una colección de valores de color Para una especie de texturas unidimensional, los valores de color se referencia!» mediante una única coordenada .v que varía entre 0.0 y 1.0 a lo largo del espacio de texturas (Sección 1 í*. 16). Así, el patrón de textura se aplica a los objetos de una escena asignando valores de coordenadas de textura a las posiciones de los objetos. Podemos seleccionar un valor concreto de las coordenadas s en un espacio de texturas unidimensional mediante la siguiente instrucción: glTexCoordl*
( s C o o r d ) ,•
Los códigos de sufijo disponibles para esta función son b (byte), s (short). i (integer), t (lloat) y d (douhlc). dependiendo del tipo de dato del parámetro s C o o r d que especifica la coordenada de textura. También podemos usar el sufijo v si el valor de la coordenada s se proporciona mediante una matriz. Al igual que sucede con los parámetros de color y otros similares, la coordenada s es un parámetro de estado, que se aplica a todas las posiciones en coordenadas universales que se definan de forma subsiguiente. III valor predeterminado para la coordenada .s es 0.0. Para mapear un patrón lineal de textura sobre una serie de posiciones dentro de una escena definida en coordenadas universales, asignamos las coordenadas s a los puntos extremos de un segmento lineal. Entonces, los colores de textura pueden aplicarse al objeto de diversas formas, y el método predeterminado que OpenGL utiliza consiste en multiplicar cada valor de color de píxel del objeto por el correspondiente valor de color del patrón de textura, Si el color de la linea es blanco (1.0, 1.0, 1.0, 1.01 que es el color predeierminado para los objetos de una escena, la línea sólo se mostrará con los colores de la textura. En el siguiente ejemplo, creamos un patrón de textura lineal de cuatro elementos con colores verde y rojo alternantes. Todo el patrón de textura, de 0.0 a 1.0, se asigna entonces a un segmento de linca recta. Puesto que la línea es blanca, de manera predeterminada, se mostrará dentro de la escena con los colores de la textura.
GLint
k;
GLubyte c e x L i n e
[16];
/*
Definir
elementos
/*
Cada c o l o r d e
dos
/ / Matriz d e
textura
verdes se
•/ for
(k
=
0;
k <= 2;
k
[4*k]
0;
{ texLine
=
2)
t e x t u r a s de 16
para
el
patrón
e s p e c i f i c a en
de
cuatro
elementos. textura. posiciones
de
la matriz.
10.21 Punciones de texturas en OpenGÍ.
texLine
[4*k+l3
B
671
255;
texLine
[4*k+2]
=
0;
texLine
[4*k+3]
=
255;
) /*
D e f i n i r dos
elementos
r o j o s para
el
patrón de
textura.
*/
f o r (k m 1 ; k < = 3 ; k + = 2 )
{ texLine
[4*k]
=
255;
texLine
[4*k+l]
=
0;
texLine
[4*k-*-2]
=
0;
texLine
[4*k+3]
=
255;
} glTexParameteri
(GL_TEXTURE_1D,
GL_TEXTURE_MAG_FILTER,
GL_NEAREST) ;
glTexParameteri
(GL_TEXTURE_1D,
GL_TEXTÜRE_MIN_FILTER,
GL_NEAREST);
glTexImagelD glEnable /*
ÍGL_TEXTURE_1D,
Asignar
4,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
texLine);
el
rango completo de
c o l o r e a de
textura a
un
segmento de
línea.
*/
(GL_LINES);
glTexCoordlf glVertex3£v glTexCoordlf glVertex3fv (
GL_RGBA,
glBegin
glEnd
0,
(0.0); (endPtl); (1.0) ; (endPt2);
) ;
glDisable
(GL_TEXTURE_1D);
El segmento de línea se muestra con secciones verdes y rojas alternativas. Podemos asignar cualquier valor que queramos a las coordenadas si Podemos, por ejemplo, mapear sobre la línea los colores rojo y verde intermedios del patrón de textura con las siguientes instrucciones: glBegin
(GL_LINES) ;
glTexCoordlf glVertex3fv glTexCoordlf glVertex3fv glEnd
(
{0.25); (wcPtl); (0.75); (wcPt2);
) ;
Así, la primera parte de la línea será roja y la segunda mitad verde. También podríamos utilizar valores de s fuera del rango comprendido entre 0 . 0 y 1.0. Por ejemplo, si asignáramos a § el valor - 2 . 0 para un extremo de la linea y el valor 2 . 0 en el otro extremo, el patrón de texturas se mapearía sobre la línea cuatro veces. La línea aparecería entonces con 16 secciones verdes y 16 secciones rojas. Para los valores de coordenada s situados lucra del intervalo unitario, las partes enteras se ignoran, a no ser que especifiquemos que los valores s deben fijarse a 0 o a 1 . 0 cuando se produzca desbordamientos. La Figura 1 0 . 1 1 4 muestra algunos posibles patrones de línea que pueden visualizarse con la matriz que contiene los valores RGB de dos colores verdes y dos colores rojos.
672
CAPITULO 10
Modelos de iluminación y métodos de representación superficial
FIGURA 10.114. Ejemplos de mapeado de un patrón de texturas OpenGL de un único subíndice sobre un segmento de línea blaneo. En los patrones de textura OpenGL hay disponible un amplio rango de parámetros y opciones, pero antes de profundizar en estas características de las rutinas de texturas de OpenGL, vamos a ver primero las funciones básicas necesarias para generar patrones de textura bidimensionales y tridimensionales.
Funciones OpenGL para texturas superficiales Podemos especificar los parámetros para un espacio de texturas RGBA bidimensional utilizando funciones similares a las empleadas en nuestro ejemplo del patrón de texturas unidimensional: glTexImage2D
glEnable
(GL_TEXTURE_2D,
O,
texHeight,
dataFormat,
0,
Gli_RGBA,
texWidth, dataType,
surfTexArray)j
(GL _TEXTURE_2 D } ;
La única diferencia aquí es que debemos especificar tanto una anchura (número de columnas) como una altura (número de filas), para la matriz de texturas de tres subíndices. Tanto la anchura como la altura deben ser una potencia de 2, sin un borde, o 2 más una potencia de 2 en caso de utilizarse un borde. De nuevo, utilizamos componentes de color RGBA, y especificamos en el ejemplo que el patrón no tiene ningún borde y no es una reducción de un patrón de texturas mayor. Por tanto, el tamaño de la matriz almacenada en s u r f T e x A r r a y es 4 x t e x W i d t h X t e x H e i g h t . Para patrones de textura bidimensionales, asignamos a los elementos de la matriz de textura los valores de color de abajo a arriba. Comenzando en la esquina inferior izquierda del patrón de color, especificamos los elementos de la primera fila de la matriz, asignándoles los valores RGBA correspondientes a la fila inferior del espacio de texturas, y especificamos los elementos de la última Illa de la matriz asignándoles los valores RGBA correspondientes a la parte superior del espacio de texturas rectangular (Eigura 10.103). Al igual que con el patrón de texturas lineal, a los píxeles de superficie de una escena puede asignárseles el color de textura más próximo a un color de textura interpolado. Seleccionamos cualquiera de estas opciones con las mismas dos funciones g i T e x P a r a m e t e r que ya empleamos para las texturas unidimensionales. Una función especifica la opción que hay que usar cuando se agranda un patrón de texturas para que encaje en un rango de coordenadas y la otra función especifica la opción que hay que emplear con las reducciones de los patrones. Además, un patrón de textura bidimensional puede estirarse en una dirección y comprimirse en la otra. Por ejemplo, las siguientes instrucciones especifican que las rutinas de iexturado deben mostrar las posiciones de superficie proyectadas utilizando el color de textura más próximo: glTexParameteri
(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER,
GLi_NEAREST) ; g]TexParameteri
(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER,
GLINEAREST) ;
funciones
10.21
de
texturas en
QpenGL
673
Para asignar un color de textura interpolado a los píxeles de las superficies, utilizamos la constante simbólica G L _ L I N E A R en lugar de GLJSIEAREST. Una posición de coordenadas en el espacio de texturas bidimensionales se selecciona mediante: glTexCoord2*
{sCoord,
tCoord);
El espacio de texturas está normalizado, de modo que el patrón se referencia mediante valores de coordenadas comprendidos en el rango de 0.0 a 1.0. Sin embargo, podemos utilizar cualquier valor de coordenada de texturas para replicar un patrón a lo largo de una superficie. Las coordenadas de texturas pueden especificarse en varios formatos, indicándose el formato de los datos mediante un código de sufijo igual a b, s, i, f o d. También agregaremos el sufijo v si las coordenadas de textura se especifican mediante una matriz. Para ilustrar las funciones OpenGL aplicables a un espacio de textura bidimensional, el siguiente segmento de código especifica un patrón 32 por 32 y lo mapea sobre una superficie cuadrilátera. Cada color de textura se especifica mediante cuatro componentes RGBA y el patrón carece de borde.
GLubyte
texArray
/*
Siguiente:
/*
Seleccionar
[32] [32] [4] ; asignar
las
componentes del
color de
l a o p c i ó n d e c o l o r más p r ó x i m o .
textura a
texArray.
*/
glTexParameteri
(GL_TEXTURE_2D,
GL_TEXTURE_MAG__FILTER,
GL_NEAREST);
glTexParameteri
(GL_TEXTURE_2D,
Gli_TEXTORE_MIN_FILTER,
GL_NEAREST) ;
glTexImage2D
(GL_TEXTÜRE_2D,
0 , GLJW3BA,
GL_UNSIGNED_BYTE, glEnable /*
32,
32,
0 , GL_RGBA,
texArray);
(GL_TEXTURE__2D) ;
Asignar el
glBegin
rango completo de c o l o r e s de
textura
(0.0,
0.0);
glVertex3fv
(vertexl);
glTexCoord2f
(1.0,
0.0};
glVertex3cv
(vertex2);
glTexCoord2f
(1.0,
1.0);
glVertex3fv
(vertex3);
glTexCoord2f
(0.0,
1.0);
glVertex3fv
(verteX4);
(
a un
cuadrilátero.
*/
(GL_QUADS);
glTexCoord2f
glEnd
*/
) ;
glDisable
(GL_TEXTURB_2D);
Funciones OpenGL para texturas volumétricas Las funciones para un espacio de texturas tridimensional son simplemente extensiones de las que se emplean para los espacios de texturas bidimensionales. Por ejemplo, podemos especificar una matriz de texturas RGBA de cuatro subíndices y sin ningún borde mediante las funciones: glTexImage3D
(GL_TEXTURE_JD, texDepth,
glEnable
0,
0,
GL_RGBA,
dataFormat,
texWidth,
dataType,
texHeight, volTexArray);
(GL_TEXTURE_3D);
Los colores de textura RGBA se almacenan en v o l T e x A r r a y , que contienen 4 X texWidth X texHeight X t e x D e p t h elementos. La anchura, altura y profundidad de la matriz debe ser una potencia de 2 o una potencia de 2 más 2.
674
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
Con las siguientes instrucciones, podremos mostrar los píxeles utilizando el color de textura más próximo: glTexParameteri
ÍGL_TEXTURE_3D,
GL_TEXTURE_MAG_FILTER,
GL_NEAREST); g l T e x P a r a m e t e r i (GL_TEXTURE_ 3 D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Para colores de textura lincalmenle interpolados, sustituimos el valor GL NEAREST por GL_LINEAR. Las coordenadas de textura tridimensionales se seleccionan mediante glTexCoord3*
ísCoord,
tCoord,
rCoord);
Cada posición seleccionada en el espacio de textura se asocia entonces con una posición de coordenadas espaciales dentro de una escena definida en coordenadas universales.
Opciones de color OpenGL para patrones de texturas Los elementos de un espacio de texturas pueden especificarse de muchas formas distintas. El tercer argumento de las funciones glTexImagelD, glTexImage2D y glTexImagelD se utiliza para especificar el fórmalo general y el número de componentes de color para cada elemento de un patrón. Hay disponibles casi 40 constantes simbólicas para poder realizar estas especificaciones. Por ejemplo, cada elemento de textura puede ser un conjunto de valores RGBA, un conjunto de valores RGB, un único valor alpha, un único valor de intensidad roja, un único valor de luminancia o un valor de luminancia junto con un valor alpha. Además, algunas constantes también especifican el tamaño en bits. La constante OpenGL GL__R3_G3_B2, por ejemplo, especifica un color RGB de un byle (8 bits), con 3 bits asignados a la componente roja, 3 bits asignados a la componente verde y 2 bits a la azul. El parámetro dataFormat de las funciones de textura se utiliza entonces para especificar el formato concreto de ios elementos de textura. Podemos seleccionar una cualquiera de entre once constantes simbólicas para este parámetro, listo nos permite especificar cada elemento de textura como un Índice a una tabla de colores, un único valor alpha, un único valor de luminancia, una pareja de valores luminancia-alpha, un único valor de intensidad para una de las componentes RGB, las tres componentes RGB o las cuatro componentes de una especificación RGBA, en el orden BGRA. Al parámetro dataType se le asigna un valor tal como GL_BYTE, GL_INT, GL_FLOAT o una constante simbólica que especifique tanto el tipo de dato como el lamaño en bits. Podemos seleccionar un valor de entre un conjunto de 20 constantes simbólicas aplicables al parámetro que especifica el tipo de dalo.
Opciones OpenGL para el mapeado de texturas Los elementos de textura pueden aplicarse a un objeto de modo que los valores de textura se combinen con los componentes actuales de color del objeto, o pueden emplearse los valores de textura para sustituir el color del objeto. Para seleccionar un método de mapeado de textura se utiliza la función: glTexEnvi
(GL_TEXTURE ENV,
GL_TEXTURE_ENV_M0DE,
applicationMethod);
Si se asigna al parámetro applicationMethod el valor GL_REPLACE, entonces el color, la luminancia, la intensidad o el valor alpha de textura sustituirán los correspondientes valores que tenga el objeto. Por ejemplo, un patrón de textura de valores alpha sustituirá los valores alpha del objeto. Se utilizan operaciones similares de sustitución con los patrones de textura especificados con un único valor de luminancia o intensidad. Un patrón de valores de intensidad verde sustituirá las componentes verdes del color del objeto. Si se asignad valor GLMODULATE al parámetro applicationMethod, loque se obtendrá es una «modulación» de los valores de color del objeto. Es decir, los valores actuales del objeto se multiplican por los valores de la textura. Los resultados específicos dependerán del formato de los elementos del patrón de textura,
10.21 Funciones de texturas en OpenGL
675
de modo que, por ejemplo, los valores alpha modularán los valores alpha y los valores de intensidad modularán los valores de intensidad. El método de aplicación predeterminado para un patrón de texturas es GL_MODULATE. Si el color de un objeto es blanco (el color predeterminado de los objetos), la operación de modulación producirá el mismo resultado que una operación de sustitución, dependiendo de cómo se hayan especificado los elementos del patrón de texturas. También podemos usar la constante simbólica GL_DECAL para las operaciones de mapeado de texturas, lo que hará que se utilicen los valores alpha ROBA como coeficientes de transparencia. En este caso, el objeto se trata como si fuera transparente con el color de textura en segundo plano. Si el patrón de textura sólo contiene valores RGB, sin ninguna componente alpha, el color de textura sustituirá al color del objeto. Asimismo, en algunos casos, como por ejemplo cuando el patrón de textura sólo contiene valores alpha, este modo de aplicación del mapeado de texturas no está definido. Cuando asignamos la constante GL_BLEND al parámetro a p p l i c a t i o n - M e t h o d , las rutinas de lexturado realizan una mezcla de colores utilizando un color especificado con la función: güTexEnv*
(GL_TEXTURE_ENV,
GL_TEXTURE_ENV_COLOR,
blendingColor);
Agregaremos el sufijo i o f de acuerdo con el tipo de dalo del color de mezcla. Asimismo, se añadirá el sufijo v si el color de mezcla se especifica mediante una matriz.
Envolvimiento de texturas en OpenGL Cuando los valores de coordenadas en un espacio de texturas caen fuera del rango comprendido entre 0 y 1.0, podemos decidir replicar los patrones de escritos en la matriz de texturas utilizando el comando: glTexParameter*
(texSpace,
texWrapCoord,
GL_REPEAT);
Los patrones se replican utilizando únicamente la parte fraccionaria del valor de la coordenada dentro del espacio de texturas. Al parámetro t e x S p a c e se le asigna uno de los valores simbólicos G L _ T E X T U R E _ 1 D , G L _ T E X T U R E _ 2 D o G L _ T E X T U R E _ 3 D y el parámetro t e x W r a p - C o o r d designa una coordenada dentro del espacio de texturas utilizando GLJTEXTURE_WRAP_S, GL_TEXTÜRE_WRAP_T o GL_TEXTURE_WRAP_R. Para hacer que la coordenada de texturas quede lijada en el límite del intervalo unitario cuando se produce un desbordamiento, utilizamos la constante simbólica GL_CLAMP en lugar de GL_REPEAT. Si una coordenada de textura tiene un valor superior a 1.0, con esta opción se le asignará el valor 1.0. De forma similar, si una coordenada tiene un valor inferior a 0.0, con esta opción se le asignaría el valor 0.0. Podemos especificar cualquier combinación de repetición o fijación para las coordenadas de un espacio de texturas concreto. La opción predeterminada para todas las coordenadas es GL_REPEAT.
Copia de patrones de texturas OpenGL desde el búfer de imagen Podemos obtener un patrón original o un subpatrón a partir de los valores almacenados en el búfer de imagen. La siguiente función define un patrón bidimensional para el estado de textura actual utilizando un bloque de valores de pixel RGBA: glCopyTexImage2D
(GL_TEXTURE_2D, texHeight,
0,
GL_RGBA,
xO,
yO,
texWidch,
0!;
Los dos valores 0 en la lista de argumentos indican de nuevo que este patrón no es una reducción y que no tiene un borde. La posición (xO, yO) del búfer de imagen, relativa a la esquina inferior izquierda del búfer, hace referencia a la esquina inferior izquierda de un bloque de colores de píxel de tamaño t e x W i d t h por texHeight. Hay disponible otra función similar para obtener un bloque de colores de píxel como subpatrón de texturas:
676
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial glCopyTexSubImage2D
(GL_TEXTORE_2D,
yTexElement,
xQ,
0,
yo,
xTexElement,
texSubWidth,
texSubHeight);
Este bloque de valores de pixel se almacena en el patrón actual en la posición correspondiente al elemento d e textura especificado ( x T e x E l e m e n t , y T e x E l e m e n t ) . Los parámetros t e x S u b W i d t h y t e x S u b H e i g h t proporcionan el tamaño del bloque de píxeles, cuya esquina inferior izquierda estará en la posición (x0, yO) del búfer de imagen.
Matrices de coordenadas de texturas en OpenGL Al igual que con los dalos de color, los vectores normales a la superficie y los indicadores de las aristas de los polígonos, también podemos especificar las coordenadas de textura en listas que pueden combinarse o asociarse con matrices de vértices (Sección 3.17 y Sección 4.3). glEnableClientState glTexCoordPointer
(GL_TEXTURE_COORD_ARRAY í ;
(nCoords,
dataType,
offset,
texCoordArray);
El parámetro n C o o r d s deberá tener el valor I, 2. 3 o 4, especificando la dimensionalidad del patrón de texturas. El valor predeterminado de 4 se utiliza para referenciar el espacio de texturas según un sistema de coordenadas homogéneas, por lo que la posición en el espacio de texturas se calculará dividiendo los primeros tres valores de coordenadas por el cuatro. Esta forma resulta útil, por ejemplo, cuando el patrón de textura e s una fotografía en perspectiva. Al parámetro d a t a T y p e se le asigna el valor constante GL_SHORT, G L _ I N T , GL_FLOAT (el valor predeterminado) o G L D O U B L E . El desplazamiento en bytes entre las posiciones sucesivas de coordenadas dentro de la matriz t e x C o o r d A r r a y s e especifica mediante el parámetro offset, que tiene un valor predeterminado igual a 0.
Denominación de los patrones de textura OpenGL A menudo, resulta útil emplear varios patrones de textura en una aplicación, de modo que OpeníiL permite crear múltiples patrones de textura nominados. Entonces, simplemente tendremos que indicar qué textura nominada hay que aplicar en cada momento. Este método es mucho más eficiente que invocar la función g l T e x l m a g e cada vez, ya que cada llamada a g l T e x i m a g e requiere volver a crear un patrón, posiblemente a partir de los valores de color contenidos en un archivo de datos. Para asignar un nombre al patrón de texturas, seleccionamos un entero positivo (sin signo) antes de definir el patrón. Como ejemplo, las siguientes instrucciones asignan un nombre al patrón de línea verde y roja de nuestro ejemplo anterior, denominándolo como textura número 3, y luego activan el patrón: g l B i n d T e x t u r e (GL_TEXTUR E__ 1 D , 3) ; g l T e x l m a g e l D (GL_TEXTURE_1D,
0,
GL_RGBA,
GL_ü-USIGNED_BYTE, glBindTexture
(GL_TEXTURE_1D,
4,
Q,
GL_RGBA,
texLine) ¡
i);
La primera instrucción g l B i n d T e x t u r e asigna un nombre al patrón, mientras que la segunda llamada a designa el patrón como estado de textura actual. Si hemos creado múltiples patrones de textura, podríamos llamar de nuevo a g l B i n d T e x t u r e con otro nombre de patrón para activar dicha textura con el fin de aplicarla a algún objeto de la escena. Para un patrón bidimensional o tridimensional, cambiareglBindTexture
mos el primer argumento de la función g l B i n d T e x t u r e a G L _ T E X T U R E _ 2 D o G L _ T E X T U R E _ 3 D . Cuando se
invoca por primera vez el nombre de una textura, se crea un patrón de textura utilizando los valores predeterminados para los parámetros del patrón. Podemos borrar uno o más patrones de textura existentes mediante el comando: glDeleteTextures
(nTextures,
texNamesArray);
10.21 Funciones de texturas en OpenGL
677
El parámetro n T e x t u r e s especifica el número de nombres de patrones enumerados en la matriz texNamesArray. También podemos dejar que sea OpenGL quien seleccione un nombre para el patrón, con el fin de no tener que controlar los nombres que ya han sido utilizados. Por ejemplo, static
GLuint
texName;
glGenTextures
{1*
glBindTexture
(GL_TEXTURE_2D,
texName); texName);
Como ejemplo, el siguiente código obtiene una lista de seis nombres de textura no utilizados y emplea uno de ellos para crear un patrón: s t a t i c GLuint
texNamesArray
[6];
glGenTextures
(1,
glBindTexture
(GL_TEXTURE_2D,
texNamesArray
[3]);
texNamesArray
[3]);
En OpenGL hay disponible un comando de consulta para averiguar si un cierto nombre de textura ya está siendo utilizado en algún patrón existente: glIsTexture
(texName);
Esta función devuelve el valor GL_TRUE si texName es el nombre de un patrón existente, y en caso contrario devuelve el valor G L _ F A L S E . También se devuelve un valor G L _ F A L S E si texName = o o si se produce un error
Subpatrones de textura en OpenGL Una vez definido un patrón de texturas, podemos crear otro patrón, denominado subpatrón, para modificar cualquier parte del patrón original o la totalidad del mismo. Los valores de textura del subpatrón sustituyen los valores especificados en el patrón original. Usualmente, este proceso es más eficiente que volver a crear una textura con nuevos elementos. Por ejemplo, la siguiente función especifica un conjunto de valores de color RGBA que deben sustituir una sección de una textura bidimensional que no tiene ningún borde y que no es una reducción de un patrón de mayor tamaño: glTexSubImage2D
{GL_TEXTURE_2D yTexElement, 0,
r
O,
xTexElement,
GL_RGBA,
dataFormat,
texSubWidth,
dataType,
texSubHeight,
subSurfTexArray);
Los parámetros x T e x E l e m e n t y y T e x E l e m e n t se utilizan para seleccionar una posición de coordenadas entera de un elemento de textura dentro del patrón original, referenciando la posición (0, 0) al elemento de texturas situado en la esquina inferior izquierda del patrón. El subpatrón se pega sobre el patrón original, con su esquina inferior izquierda en la posición ( x T e x E l e m e n t , y T e x E l e m e n t ) . Los parámetros TexSubWidth y T e x S u b H e i g h t proporcionan el tamaño del subpatrón. El número de elementos de color en la matriz subSurf T e x A r r a y para un patrón de textura RGBA es 4 X t e x S u b W i d t h X t e x S u b H e i g h t . Los restantes parámetros son iguales que en la función g l T e x l m a g e , y pueden definirse subpatrones similares para texturas unidimensionales y tridimensionales.
Patrones de reducción de texturas en OpenGL Para tamaños de objetos reducidos, podemos utilizar rutinas OpenGL para crear una serie de patrones de reducción de texturas, que se denominan mipmaps (Sección 10.17). Una forma de crear una secuencia de patrones de reducción consiste en invocar la función g l T e x l m a g e repetidamente utilizando valores enteros cada vez mayores para el segundo argumento (el «número de nivel») dentro de la función. El patrón original
678
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
se referencia mediante el nivel de reducción 0. Un patrón de reducción que tenga la mitad de tamaño que el patrón original tendrá asignado el número de nivel I, el según patrón de reducción a la mitad de tamaño se designará como número de nivel 2, y así sucesivamente para las restantes reducciones. La función c o p y T e x i m a g e también genera un patrón de reducción cuando especificamos el número de nivel l o superior. Alternativamente, podemos dejar que OpenGL genere los patrones de reducción automáticamente. Por ejemplo, podríamos utilizar la siguiente función GLU para obtener los patrones de reducción RGBA para una textura de superficial de 16 por 16: g l u B u i l d 2 D M i p m a p a {Gli_TEXTURE_ 2 D , GL_ R G B A , 1 6 , 1 6 , GL_RGBA, GWJNSIGNED
BYTE,
surfTexArray) ;
Esta función generará un conjunto completo de cuatro patrones, con los tamaños reducidos de 8 por 8,4 por 4. 2 por 2 y 1 por I. También podemos especificar una reducción seleccionada utilizando la función: (GL_TEXTURE_2D, G L R G B A ,
gluBuild2DMipmapLevels GL_RGBA,
GL_UNSIGNED_BYTE,
0,
16,
16,
minLevel,
maxLevel,
surfTexArray);
Esta función genera patrones de reducción para un rango de números de nivel especificados mediante los parámetros m i n L e v e l y m a x L e v e l . En cada caso, los mipmaps se construyen para el patrón de texturas actual, especifico en el nivel número ü. Podemos seleccionar un método para determinar los colores de los píxcles a partir de los patrones de reducción utilizando la función g l T e x P a r a m e t e r y la constante simbólica GL_TEXTURE_MIN_FILTER. Como ejemplo, la siguiente función designa el procedimiento de mapeado para un patrón de texturas bidimens ion al: g l T e x P a r a m e t e r ( GL_TEXTURE_ 2 D, GI._TEXTURE_MIN_FILTER
/
GL_NEAREST_MIPMAP_NEAREST);
Esta función especifica que las rutinas de textura deben utilizar el patrón de reducción que se ajuste de forma más precisa al tamaño de pixel ( M I P M A P N E A R E S T ) . Entonces, a los pixeles se les asignará el color del elemento de textura más próximo (GL__NEAREST) en dicho patrón de reducción. Con la constante simbólica G L _ L I N E A R _ M I P M A P _ N E A R E S T , especificamos una combinación lineal de los colores de textura contenidos en el patrón de reducción más próximo. Con G L _ N E A R E S T _ M I P M A P _ L I N E A R (el valor predeterminado), especificamos un color promedio que se calculará a partir de los elementos de textura más próximos en cada uno de los patrones de reducción que se ajusten mejor al tamaño de pixel. Por su parte. GL_LINEAR_ MIPMAP_LINEAR calcula el color del pixel utilizando una combinación lineal de los colores de textura del conjunto de patrones de reducción que mejor se ajusten en tamaño.
Bordes de texturas en OpenGL Cuando se aplican múltiples texturas, o múltiples copias de una misma textura, a un objeto, pueden aparecer electos de aliasittg en los bordes de los patrones adyacentes cuando se calculan los colores de pixel interpolando línealmenle los colores de textura. Podemos evitar esto incluyendo un borde en cada patrón de texturas, que hará que los colores del borde se ajusten a los colores existentes en la frontera de la textura especificada por el patrón adyacente. Podemos especificar un color de borde para las texturas de diversas fonnas. El valor de color de un patrón adyacente puede copiarse en el borde de otro patrón utilizando la función g l T e x S u b l m a g e , o bien pueden asignarse directamente los colores de borde en la matriz de texturas especificada con la función g l T e x l m a g e , Otra opción consiste en especificar un color de borde utilizando la rutina g l T e x P a r a m e t e r . Por ejemplo, podemos asignar un color de borde a un patrón bidimensional mediante la función: glTexParameterEv
(GLJTEXTURE_2D,
GL_TEXTURE_BORDER_COLOR,
borderColor);
10.21
Funciones de
texturas en
OpenGL
6 7 9
donde al parámetro b o r d e r C o l o r se le asigna un conjunto de cuatro componentes de color RGBA. 1:1 color de borde predeterminado es el negro, (0.0, 0.0, 0.0, 0.0).
Texturas proxy en OpenGL En cualquiera de las funciones g l T e x i m a g e , podemos asignar al primer argumento una constante simbólica denominada proxy de textura. El propósito de esta constante consiste en almacenar la definición del patrón de texturas hasta que veamos si hay suficientes recursos como para poder procesar este patrón. Para un patrón bidimensional, la constante de proxy es GL_PROXY_TEXTURE_2D. y hay disponibles constantes similares para los patrones de textura lineales y volumétricos. Una vez especificado el pro.xy de textura, podemos utilizar g l G e t T e x L e v e l F u n c t i o n para determinar si se pueden emplear valores específicos de los parámetros. Como ejemplo de utilización de un proxy de textura, las siguientes instrucciones consultan el sistema para determinar si puede usarse la altura especificada para un patrón bidimensional: GLint
taxHeight;
g l T e x I m a g e 2 D (GL_PROXY_TEXTURE_ 2 D, 0, GL_RGBA12, 1 6 , 1 6 , 0, GL_RGBA,
GLUNSIGNED BYTE,
NULL);
g l G e t T e x l e v e l P a r a m e t e r i v (GL_PROXY TEXTURE_2D,
0, G L R G B A 1 2 ,
GL_TEXTURE HEIGHT,
itexHeight);
Si el sistema no puede admitir la altura de patrón solicitada (16. en este caso) se devolverá un valor 0 en el parámetro t e x H e i g h t . En caso contrario, el valor devuelto coincidirá con el valor solicitado. Otros parámetros de los patrones pueden consultarse de forma similar utilizando constantes simbólicas tales como GL_TEXTURE_WIDTH, GL_TEXTURE__DEPTH, GL_TEXTURE_BORDER y GL_TEXTURE_BLUE_SIZE. En cada caso, si se devuelve un valor 0 querrá decir que el valor solicitado para el parámetro en la función glTexlmage no puede admitirse. Para valores de datos en coma flotante, tendremos que sustituir el código de sufijo i por el código f. Aunque obtengamos una respuesta afirmativa para una textura propuesta, puede que no sea posible almacenar el patrón en memoria. Esto puede suceder cuando haya otro patrón ocupando la memoria disponible.
Texturado automático de superficies cuádricas OpenGL dispone de rutinas para generar automáticamente las coordenadas de las texturas en ciertas aplicaciones. Esta característica resulta particularmente útil cuando sea dificil delerminar directamente las coordenadas de superficie de un objeto, y hay disponible una función GLU para aplicar estas rutinas de superficies cuádricas. Para mapear un patrón de textura sobre una superficie cuádrica, primero definimos los parámetros para el espacio de texturas y a continuación invocamos la siguiente función y definimos el objeto cuádrico, como se describe en la Sección 8.6: g l u Q u a d r i c T e x t u r e ( q u a d S u r f O b j , GLTRUE)
El parámetro quadSurfObj en esta función es el nombre del objeto cuádrico. Si queremos desactivar el texturadt) de la superficie cuádrica. tendremos que cambiar la constante simbólica GL_TRUE por GL_FALSE.
Coordenadas de textura homogéneas Podemos especificar una posición tetradiinensional en el espacio de texturas mediante: glTexCoordí*
(sCoord,
tCoord,
rCoord,
htexCoord);
Las coordenadas de textura se transforman utilizando una matriz 4 por 4 de la misma manera que se transforman las coordenadas de la escena: cada coordenada se divide por el parámetro homogéneo (Sección 5 . 2 ) .
680 CAPÍTULO 10 Modelos de ilumimn :ión y métodos de representación superficial Así, los valores de las coordenadas de textura s t y /• en la función anterior se dividen por el parámetro homogéneo / / para generar la posición real dentro del espacio de texturas. Las coordenadas homogéneas en el espacio de texturas son útiles cuando se combinan múltiples efectos de perspectiva en una misma imagen. Por ejemplo, una vista en perspectiva de un objeto puede incluir un patrón de texturas producido con una transformación diferente de proyección en perspectiva. El patrón de textura puede entonces modificarse utilizando coordenadas homogéneas de textura para ajustar la perspectiva de la misma. Pueden conseguirse muchos otros efectos utilizando coordenadas de texturas homogéneas para manipular el mapeado de texturas. %
[ex
Opciones adicionales para texturas en OpenGL En OpenGL hay disponibles funciones para realizar muchas otras manipulaciones y aplicaciones de texturas. Si obtenemos un patrón de textura (de una fotografía o de otra fuente) cuyo tamaño no sea una potencia de 2, OpenGL proporciona una función para modificar el tamaño del patrón. En algunas ¡mplemenlaciones de OpenGL, hay disponibles rutinas de multitexturizado para pegar múltiples patrones de textura sobre un objeto. El mapeado de entorno puede simularse en OpenGL creando un mapa de textura con la forma de una superficie esférica y pueden generarse automáticamente coordenadas de textura para patrones de entorno esféricos, así como para otras aplicaciones de las texturas.
10.22
RESUMEN
En general, los objetos son iluminados con energía radiante procedente de las emisiones de luz y de las superficies reflectantes de una escena. Las fuentes luminosas pueden modelarse como objetos puntuales o pueden tener un tamaño finito. Además, las fuentes luminosas pueden ser direccionales, y pueden tratarse como fuentes infinitamente distantes o como fuentes luminosas locales. Normalmente, se suele aplicar una atenuación radial a la luz transmitida, utilizando una función cuadrática inversa de la distancia, y las luces de foco también pueden atenuarse de forma angular. Las superficies reflectantes de una escena son opacas, completamente transparentes o parcialmente transparentes. Los efectos de iluminación se describen en términos de componentes difusa y especular tanto para las reflexiones como para las refracciones. La intensidad de la luz en una posición de la superficie se calcula utilizando un modelo de iluminación, y el modelo básico de iluminación en la mayoría de los paquetes gráficos utiliza aproximaciones simplificadas de las leyes tísicas, estos cálculos de iluminación proporcionan un valor de intensidad luminosa para eada componente RGB de la luz reflejada en una posición de la superficie y para la luz transmitida a través de un objeto transparente. El modelo básico de iluminación admite normalmente múltiples fuentes luminosas como emisores puntuales, pero pueden ser fuentes distantes, fuentes locales o luces de foco. La luz ambiente para una escena se describe mediante una intensidad lija para cada componente de color RGB. intensidad que es la misma para todas las superficies. Las reflexiones difusas de una superficie se consideran proporcionales al coseno de la distancia angular con respecto a la dirección de la normal a la superficie. Las reflexiones especulares se calculan utilizando el modelo de Phong. Por su parte, los efectos de transparencia suelen aproximarse utilizando un coeficiente simple de transparencia para un material, aunque pueden modelarse efectos de refracción más precisos utilizando la ley de Snell. Los efectos de sombra correspondientes a las fuentes luminosas individuales pueden añadirse identificando las regiones de una escena que no son visibles desde la fuente luminosa. Asimismo, los cálculos necesarios para obtener las reflexiones de la luz y los efectos de transmisión para los materiales translúcidos no suelen incluirse en el modelo básico de iluminación, aunque podemos modelarlos utilizando métodos que dispersen las componentes de luz difusa. Los valores de intensidad calculados con un modelo de iluminación se mapean sobre los niveles de intensidad disponibles en el sistema de visualización que se esté utilizando. Los distintos sistemas proporción;)!) una escala de intensidad logarítmica con el fin de suministrar un conjunto de niveles de intensidad que se
10.22 Resumen
681
incrementen con diferenciales de brillo percibido de la misma magnitud. Se aplica una corrección gamma a los valores de intensidad para corregir la no linealidad de los dispositivos de visualización. Con los monitores monocromo, podemos utilizar patrones de semitonos y técnicas de aleatorización para simular un rango de valores de intensidad. Las aproximaciones de semitonos pueden utilizarse también para incrementar el número de niveles de intensidad en aquellos sistemas que sean capaces de mostrar más de dos intensidades por píxel. Los métodos de aleatorización ordenada, de difusión de errores y de difusión de puntos se utilizan para simular un rango de intensidades cuando el número de puntos que hay que mostrar en la escena es igual al número de píxeles del dispositivo de visualización. La representación de superficies en los paquetes gráficos se lleva a cabo aplicando los cálculos del modelo básico de iluminación a procedimientos de linea de exploración que extrapole los valores de intensidad a partir de unos cuantos puntos de la superficie, con el fin de calcular todas las posiciones de píxel proyectadas de la superficie. Con la representación superficial de intensidad constante, también denominada representación plana, se utiliza un color calculado para mostrar todos los puntos de una superficie. La representación superficial plana resulta suficientemente precisa para los poliedros o para las mallas poligonales de aproximación a superficies curvas cuando las posiciones de visualización y de las fuentes luminosas están alejadas de los objetos de una escena. La representación superficial de Gouraud aproxima las reflexiones luminosas producidas en superficies curvas teseladas calculando los valores de intensidad en los vértices de los polígonos e interpolando linealmente dichos valores de intensidad en las caras del polígono. Un procedimiento más preciso, aunque más lento, de representación superficial es el método de Phong. que interpola los vectores normales promediados de los vértices de los polígonos a lo largo de las caras poligonales. Entonces, se utiliza el modelo básico de iluminación para calcular las intensidades superficiales en cada posición de la superficie proyectada, utilizando los valores interpolados para los vectores normales a la superficie. Las técnicas rápidas de representación superficial de Phong utilizan aproximaciones en serie de Taylor para reducir el tiempo de procesamiento dedicado a los cálculos de intensidad. El trazado de rayos es un método para obtener efectos globales de reflexión especular y de transmisión, trazando rayos luminosos a través de una escena hasta las posiciones de píxel. Los rayos de los píxeles se trazan a través de una escena, rebotando de objeto en objeto a medida que se acumulan las contribuciones de intensidad. Para cada píxel se construye un árbol de trazado de rayos y los valores de intensidad se combinan empezando por los nodos terminales del árbol y subiendo hasta las raíz. Los cálculos de intersección entre los objetos y los rayos en el método de trazado de rayos pueden reducirse mediante métodos de subdivisión espacial que comprueban las intersecciones entre los rayos y los objetos únicamente dentro de detenninadas subregiones del espacio total. La técnica de trazado de rayos distribuido emplea múltiples rayos por píxel, asignando aleatoriamente diversos parámetros a los rayos, como la dirección y el tiempo, listo proporciona un método preciso para modelar el brillo y la translucidez de las superficies, las aperturas finitas de cámara, las fuentes luminosas de tamaño finito, los efectos de sombra y el desenfoque de movimiento. Los métodos de radiosidad proporcionan un modelado preciso de los efectos de reflexión difusa, calculando la transferencia de energía radiante entre los diversos parches superficiales de una escena. Sí utiliza una técnica de refinamiento progresivo para acelerar los cálculos de radiosidad, tomando en consideración la transferencia de energía de un parche superficial en cada pasada. Pueden generarse escenas folorrealislas utilizando una combinación de métodos de trazado de rayos y de radiosidad. Un método rápido para aproximar los efectos globales de iluminación es el mapeado de entorno. Con esta técnica, se utiliza una matriz de entorno para almacenar información sobre la intensidad de fondo de una escena. Esta matriz se mapea posteriormente sobre los objetos de una escena basándose en la dirección de visualización especificada. El mapeado de fotones proporciona un modelo preciso y eficiente para los efectos de iluminación global en escenas complejas. Con esta técnica, se generan rayos aleatorios desde las fuentes luminosas y los efectos de iluminación de cada rayo se almacenan en un mapa de fotones, que separa la información de iluminación de la geometría de la escena. La precisión de los efectos de iluminación se incrementa a medida que aumentamos el número de rayos generados.
682
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
Pueden añadirse detalles a las superficies de los objetos utilizando caras poligonales, mapeado de texturas, mapeado de relieve o mapeado del sistema de referencia. Pueden superponerse pequeñas caras poligonales sobre superficies de mayor tamaño con el fin de generar diversos tipos de diseños. Alternativamente, pueden definirse patrones de textura en espacios unidimensionales, bidimensionales y tridimensionales, pudiendo emplearse dichos patrones para añadir una textura a una línea, a una superficie o a un volumen. El mapeado de texturas procedimental utiliza funciones para calcular las variaciones en los efectos de iluminación de los objetos. El mapeado de relieve es un mecanismo para modelar irregularidades de las superficies aplicando una función de relieve que perturba los vectores normales a la superficie. El mapeado del sistema de referencia es una extensión del mapeado de relieve que puede utilizarse para modelar las características de los materiales anisótropos, permitiendo aplicar variaciones horizontales a la superficie, además de las variaciones verticales típicas del mapeado de relieve. La biblioteca básica de OpenGL contiene un amplio conjunto de funciones para especificar fuentes luminosas puntuales, los diversos parámetros del modelo básico de iluminación, el método de representación superficial que hay que utilizar, las rutinas de aproximación de semitonos que deben emplearse y los patrones matriciales de texturas que hay que aplicar a los objetos. Las Tablas 10.2 y 10.3 proporcionan un resumen de estas funciones OpenGL de iluminación, representación superficial y mapeado de texturas. TABLA 10.2. RESUMEN DE FUNCIONES OpenGL PARA ILUMINACIÓN Y REPRESENTACIÓN DE SUPERFICIES. Función
Descripción
glLighc
Especifica un valor de propiedad de una fuente luminosa.
glEnablë
(lightNáme)
Activa una fuente luminosa.
glLightModel
Especifica valores para los parámetros de iluminación globales.
glMaterial
Especifica un valor para un parámetro óptico de una superficie. Especifica un valor para un parámetro atmosférico; los efectos atmosféricos se activan con la función g l E n a b l e .
glColör4E
(R,
G,
B,
A)
Especifica un valor alpha para una superficie con el fin de simular la transparencia. En ia función g l B l e n d F u n c , hay que asignar el valor GL_ S R C _ A L P H A al factor origen de la mezcla y el valor G L _ O N E _ M I N U S _ S R C _ A L P H A al factor de destino de la mezcla.
glShadeModel
Especifica la representación superficial de Gouraud o la representación superficial m o n o c r o m a .
glNormal3 gLEnable
Especifica un vector normal a la superficie. (GL NORMALIZE)
Especifica que las normales a la superficie deben convertirse a vectores unitarios.
g l E n a b l e C H e n t S t a t e (GL J N Û R M A L _ A R R A Y )
Activa las rutinas de procesamiento para una matriz de vectores normales a la superficie.
Créa una lista de vectores normales a la superficie que hay que asoeiar con una m a u ï z de vértiees. glEnable
(GL DTTHER!
Activa las operaciones para aplicar las técnicas de representación superficial mediante patrones de aproximación de semitonos.
Referencias
:
683
TABLA 1 0 . 3 . RESUMEN DE FUNCIONES DE MAPEADO DE TEXTURAS EN OpenGL
Función
Descripción
glTexImagelD
Especifica los parámetros para definir un espacio de texturas unidimensional (el textura se activa con glEnable).
glTexImage2D
Especifica los parámetros para definir un espacio de texturas bidimensional.
gl TexImage3D
Especifica los parámetros para definir un espacio de texturas tridimensional.
glTexParameter
Especifica los parámetros para las rutinas de mapeado de texturas.
glTexCoord
Especifica el valor para una coordenada de textura en un espacio de texturas unidimensional, bidimensional, tridimensional o tetradimensional.
glTexEnv
Especifica los parámetros de entorno de las texturas, como el color del mezcla para el mapeado de texturas.
giCopyTexlmage
Copia un bloque de colores de pixel del búfer de imagen para utilizarlo como patrón de textura.
gl CopyTexSublmage
Copia un bloque de colores de píxel del búfer de imagen para utilizarlo como subpalrón de textura.
glTexCoordPointer
Especifica las coordenadas de textura en una lista asociada con una lista de vértices.
glBindTexture
Asigna un nombre al patrón de texturas y se utiliza también para activar un patrón nominado.
glDeleteTextures
Elimina una lista de texturas nominadas.
glGenTextures
Genera automáticamente nombres para las texturas.
glisTexture
Comando de consulta para determinar si ya existe una textura nominada.
glTexSublmage
Crea un subpalrón de textura.
gluBuild*Mipmaps
Generación automática de patrones de reducción de texturas para espacios de texturas unidimensionales, tridimensionales o tridimensionales.
gluBuild*MipmapLevela
Generación automática de patrones de reducción de texturas para un nivel especificado en un espacio de texturas unidimensionales, bidimensionales o tridimensionales.
glGetTexLevel Parame t er
Consulta el sistema para determinar si puede admitirse un determinado valor de un parámetro de textura.
gluQuadricTexture
Activa o desactiva el texturado para superficies cuádricas.
REFERENCIAS Los modelos básicos de iluminación y las técnicas de representación superficial se explican en üouraud (I97I) y Phong (1975), Freeman (1980), Bishop y Wiemer (1986), Birn (2000), Akenine-Móller y Haines (2002) y Olano, Hart, Heidrich y McCool (2002). Los algoritmos de implementación para los modelos de ilu-
684
CAPÍTULO 10 Modelos de iluminación y métodos de representación superficial
minación y los métodos de representación se presentan en Glassner < 1990), Arvo (199I), Kirk (1992). I ieckberl (1994), Paeth (1995) y Sakaguchi, Kent y Cox (2001). Los métodos de aproximación por semitonos se traían en Velho y Gomes (199I). Para obtener más información sobre los mecanismos de aleatorización ordenada, difusión de errores y difusión de puntos, consulte Knulh (1987). Los procedimientos de trazado de rayos se tratan en Whitted (1980), Amanalides (1984), Cook, Porter y Carpenter (1984), Kay y Kajiya (1986), Arvo y Kirk (1987), Quek y Hearn (1988), Glassner (1989), Shirley (1990 y 2000) y Koh y Hearn (1992). Los algoritmos relativos a los métodos de radiosidad pueden consultarse en Goral, Torrance, Greenberg y Battaile (1984), Cohén y Greenberg (1985), Cohén. Chen, Wallace y Greenberg (1988), Wallace, Elmquisl y Haines (1989), Chen, Rushmeier, Miller y Turner (1991), Dorsey, Sillion y Greenberg (1991), Sillion, Arvo,Westin y Greenberg (1991), He, Heynen, Phillips, Torrance, Salesin y Greenberg (1992), Cohén y Wallace (1993), Lischinski, Tampieri y Greenberg (1993). Schoeneman, Dorsey, Smits, Arvo y Greenberg (1993) y Sillicon y Puech (1994). Los algoritmos de mapeado de fotones se explican en Jensen (2001). Los métodos y aplicaciones de mapeado de texiuras se analizan en Williams (1983), Segal, Korobkin, van Widenfelt, Foran y Haeberli (1992) y Demers (2002). En Glassner (1995) podrá encontrar una explicación general sobre los temas de propagación de la energía, ecuaciones de transferencia, procesos de representación y percepción humana de la luz y del color. En Woo, Neider, Davis y Shreiner (1999) se presentan ejemplos adicionales de programación utilizando las funciones de iluminación y representación de OpenGL. También hay disponibles ejemplos de programación para las funciones de iluminación, representación y texturado de OpenGL en el sitio web lulorial de Nate Robins: hlip://www.csArtcdiedu/~narobins/apeng/.htmi, Por último, en Shreiner (2000) puede encontrar un listado completo de las funciones de iluminación y representación de OpenGL.
EJERCICIOS 10.1
Escribir una rutina para implementar la Ecuación 10.12 para reflexión difusa utilizando una única fuente de iluminación puntual y un método de representación constante para las caras de un tetraedro. La descripción del objeto se hará mediante tablas de polígonos, incluyendo los vectores normales a la superficie para cada una de las caras poligonales. Otros parámeiros adicionales de entrada incluyen la intensidad de luz. ambiente, la intensidad de la fuente luminosa y los coeficientes de reflexión superficial. Toda la infonriación de coordenadas puede especificarse directamente en el sistema de referencia de visualización.
10.2
Modifique la rulina del Ejercicio 10.1 para representar las caras poligonales de una superficie esférica teselada.
10.3
Modifique la rutina del Ejercicio 10.2 para mostrar la superficie esférica utilizando un método de representación superficial de (¡ouraud.
10.4
Modifique la rulina del Ejercicio 10.3 para mostrar la superficie esférica utilizando un método de representación superficial de Phong.
10.5
Escribir una rulina para implementar la Ecuación 10.17 para las reflexiones difusa y especular utilizando una única fuente de iluminación puntual y mecanismo de representación superficial de Gouraud para las caras poligonales de una superficie esférica teselada. La descripción del objeto se hará mediante tablas de polígonos, incluyendo los vectores normales a la superficie para cada una de las caras poligonales. Los valores adicionales que se suministrarán c o m o entrada incluyen la intensidad de luz ambiente, la intensidad de la fuente luminosa, los coeficientes de reflexión superficial y el parámetro de reflexión especular. Toda la información de coordenadas puede especificarse directamente en el sistema de referencia de visualización.
10.6
Modifique la rutina del ejercicio anterior para mostrar las caras poligonales utilizando un método de representación superficial de Phong..
10.7
Modifique la rutina del ejercicio anterior para incluir una función de atenuación lineal de la intensidad.
10.8
Modillque la rutina del ejercicio anterior para incluir en la escena dos fuentes luminosas.
Ejercicios 10.9
685
Modifique la rutina del ejercicio anterior de modo que la superficie esférica se visualice a través de un panel de cristal.
10.10 Explique las diferencias que cabria esperar ver en la apariencia de las rellexiones especulares modeladas con (N • H)"\ comparadas con las rellexiones especulares modeladas con (V * R)"-*. 10.11
Verifique que 2a = 0 en la Figura 10.22 cuando todos los vectores son coplanares, pero que, en general, 2a * 0.
10.12 Explique cómo pueden combinarse los diferentes métodos de detección de superficies visibles con un modelo de intensidad para la visualización de un conjunto de poliedros con superficies opacas. 10.13 Explique cómo pueden modificarse los diversos métodos de detección de superficies visibles para procesar objetos transparentes. ¿Hay algún método de detección de superficies visibles que no pueda manejar las superficies transparentes? 10.14 Especifique un algoritmo, basándose en uno de los métodos de detección de superficies visibles, que permita identificar las áreas de sombra sobre una escena iluminada por una fuente puntual distante. 10.15 ¿Cuántos niveles de intensidad pueden mostrarse mediante aproximaciones de semitono utilizando cuadrículas de píxeles de tamaño n por n, si cada píxel puede visualizarse con m intensidades diferentes? 10.16 ¿Cuántas combinaciones de color distintas pueden generarse mediante aproximaciones de semitonos en un sistema RGB de dos niveles con una cuadrícula de 3 por 3 píxeles? 10.17 Escriba una rutina para mostrar un conjunto dado de variaciones de intensidad superficial, utilizando aproximaciones de semitono con cuadriculas de 3 por 3 píxeles y dos niveles de intensidad (o y I) por píxel. 10.18 Escriba una rutina para generar matrices de aleatorización ordenada utilizando la relación de recurrencia de la Ecuación 10.48. 10.19 Escriba un procedimiento para mostrar una matriz dada de valores de intensidad utilizando el método de aleatorización ordenada. 10.20 Escriba un procedimiento para ¡mplementar el algoritmo de difusión de errores para una matriz dada m por // de valores de intensidad. 10.21 Escriba un programa para implementar el algoritmo básico de trazado de rayos para una escena que contenga una única esfera situada por encima de un cuadrado de tierra con un patrón ajedrezado. La escena debe iluminarse con una única fuente puntual situada en la posición de visualización. 10.22 Escriba un programa para implementar el algoritmo básico de trazado de rayos para una escena que contenga cualquier disposición especificada en esferas y caras poligonales iluminadas por un conjunto dado de fuentes luminosas puntuales. 10.23 Escriba un programa para implementar el algoritmo básico de trazado de rayos utilizando métodos de subdivisión espacial para cualquier disposición especificada de esferas y caras poligonales iluminadas por un conjunto dado de fuentes luminosas puntuales. 10.24 Escriba un programa para implementar las siguientes características del mecanismo de trazado de rayos distribuido: muestra de píxel con 16 rayos por píxel ajustados mediante fluctuación, direcciones de rellexión distribuidas (brillo), direcciones de refracción distribuidas (translucidez) y fuentes luminosas de tamaño finito. 10.25 Diseñe un algoritmo para modelar el desenfoque de movimiento de un objeto móvil utilizando trazado de rayos distribuido. 10.26 Implcmente el algoritmo básico de radiosidad para representar las superficies interiores de un rectángulo cuando una de las caras interiores del rectángulo es una fuente luminosa. 10.27 Diseñe un algoritmo para implementar el método de radiosidad basado en refinamiento progresivo. 10.28 Escriba una rutina para transformar un mapa de entorno en la superficie de una esfera. 10.29 Escriba un programa para mapear un patrón de textura detenninado sobre cualquier cara de un cubo. 10.30 Modifique el programa del ejercicio anterior de modo que el patrón sea mapeado sobre una cara de un tetraedro.
686
CAPÍTULO 10
Modelos de iluminación y métodos de representación superficial
10.31
Modifique el programa del ejercicio anterior de modo que el patrón sea mapeado sobre una sección especificada de una superficie esférica.
10.32
Hseriba un programa para mapear un palrón de texturas unidimensional sobre una cara especificada de un cubo, en forma de una banda diagonal.
10.33 Modifique el programa del ejercicio anterior de modo que la textura unidimensional sea mapeada sobre la superficie de una esfera, dados dos puntos de la superficie esférica. 10.34 Dada una superficie esférica, escriba el procedimiento de mapeado de relieve para simular la superficie rugosa de una naranja. 10.35
Escriba una rutina de mapeado de relieve para producir variaciones en las normales a la superficie de acuerdo con cualquier función de relieve especificada.
10.36 Escriba un programa OpenGL para mostrar una escena que contenga una esfera y un tetraedros iluminados por dos fuentes luminosas. Una de ellas es una fuente local de color rojo y la otra es una fuente de luz blanca distante. Especifique los parámetros de superficie tanto para la reflexión difusa como especular con representación superficial de Gouraud y aplique una función cuadrática de atenuación de la intensidad. 10.37 Modifique el programa del ejercicio anterior de modo que la única fuente local de color rojo se sustituya por dos fuentes de tipo foco: una roja y otra azul. 10.38 Modifique el programa del ejercicio anterior para añadir una atmósfera llena de humo a la escena. 10.39 Modifique el programa del ejercicio anterior de modo que la escena se visualice a través de un panel de cristal semitransparente. 10.40 Escriba un programa OpenGL completo para mostrar un conjunto de líneas diagonales utilizando diversos patrones de textura unidimensional, como en a Figura 10.114. 10.41 Escriba un programa utilizando un patrón de texturas bidimensional de OpenGL con el fin de mostrar un patrón ajedrezado blanco y negro sobre un fondo azul. 10.42 Modifique el programa del ejercicio anterior de modo que el palrón ajedrezado tenga cuadrados rojos y azules y el fondo sea de color blanco. 10.43 Escriba un programa utilizando un patrón de textura bidimensional de OpenGL para mostrar un rectángulo blanco con un conjunto de bandas diagonales rojas equiespaciadas. Defina como color de fondo el azul. 10.44 Modifique el programa del ejercicio anterior para mapear el palrón de textura sobre la superficie de una esfera. 10.45
Modifique el programa del ejercicio anterior para mapear el patrón de textura sobre la superficie de la tetera GLL'T.
!
!
i
CAPÍTULO
11
Métodos interactivos de entrada e interfaces gráficas de usuario
Entrada interactiva dentro del entorno de realidad virtual denominado CAVE de NCSA, que está formado por tres paredes verticales, un suelo, un lecho y un sistema estereoscópico de proyección. (Cortesía de National Centerfor Snpercomputing Applications, Universidad de Illinois en Urbana-Champaign.)
11.1
Datos de entrada gráficos
11.5
Entornos de realidad virtual
11.2
Clasificación lógica de los dispositivos de entrada
11.6
Funciones OpenGL para dispositivos de entrada interactiva
11.3
Funciones de entrada para datos gráficos
11.7
Funciones de menú OpenGL
11.4
Técnicas interactivas de construcción de imágenes
11.8
Diseño de una inlerfaz gráfiea de usuario
11.9
Resumen
Aunque podemos construir programas y proporcionar datos de entrada utilizando los métodos e instrucciones de programa explicados en los capítulos anteriores, a menudo resulta útil poder especificar interactivamente las entradas gráficas. Durante la ejecución de un programa, por ejemplo, puede que queramos cambiar el punto de vista o la ubicación de un objeto de una escena apuntando una posición de la pantalla, o bien puede que queramos variar los parámetros de una animación utilizando selecciones en un menú. En las aplicaciones de diseño, las coordenadas de los puntos de control para la construcción de splines se seleccionan interactivamente y a menudo se construyen imágenes utilizando métodos de dibujo interactivo. Son diversos los tipos de datos utilizados por los programas gráficos y se han desarrollados numerosos métodos de entrada interactiva para procesar dichos datos. Además, las interfaces de los sistemas utilizan ahora ampliamente los gráficos interactivos, incluyendo ventanas de visualización, iconos, menús y un ratón u otros dispositivos de control del cursor.
11.1 DATOS DE ENTRADA GRÁFICOS Los programas gráficos utilizan diversos tipos de datos de entrada, como posiciones de coordenadas, valores de atribulo, especificaciones de cadenas de caracteres, valores de transformación geométrica, condiciones de visualización y parámetros de iluminación. Muchos paquetes gráficos, incluyendo los estándares ISO y ANSÍ, proporcionan un amplio conjunto de funciones de entrada para procesar tales dalos. Pero los procedimientos de entrada requieren de la interacción con los gestores de ventanas y con dispositivos hardware específicos. De ahí que algunos sistemas gráficos, particularmente aquellos que proporcionan principalmente funciones independientes del dispositivo, incluyen a menudo un número relativamente pequeño de procedimientos interactivos para el tratamiento de datos de entrada. Una organización bastante común para los procedimientos de entrada de un paquete gráfico consiste en clasificar las funciones de acuerdo con el tipo de los datos que cada función tiene que procesar. Este esquema permite introducir cualquier clase de datos mediante cualquier dispositivo físico, como por ejemplo un teclado o un ratón, aunque la mayoría de los dispositivos de entrada suelen manejar mejor algunos tipos de datos que otros.
11.2 CLASIFICACIÓN LÓGICA DE LOS DISPOSITIVOS DE ENTRADA Cuando clasificamos las funciones de entrada de acuerdo con el tipo de los datos, los dispositivos utilizados para proporcionar los datos especificados se denominan dispositivo lógico de entrada para dicho tipo de dalos. Las clasificaciones estándar para los datos de entrada lógicos son:
690
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
LOCALIZADOR
- Un dispositivo para especificar una posición de coordenadas.
TRAZO
- Un dispositivo para especificar un conjunto de posiciones de coordenadas.
CADENA
- Un dispositivo para especificar entrada textual.
EVALUADOR
- Un dispositivo para especificar un valor escalar.
ELECCIÓN
- Un dispositivo para elegir una opción de menú.
SELECTOR
- Un dispositivo para seleccionar un componente de una imagen.
Dispositivos localizadores La selección interactiva de un punto descrito por sus coordenadas se suele llevar a cabo situando el cursor de la pantalla en una determinada ubicación dentro de una escena, aunque también podrían utilizarse en determinadas aplicaciones otros métodos, como por ejemplo opciones de menú. Podemos utilizar un ratón, m joystick, una trackball, una spacehalf, un ratón de bola, un dial, un cursor de mano o un lápiz digitalizador para el posicionamiento del cursor dentro de la pantalla. Y también pueden emplearse diversos botones, teclas o conmutadores para indicar las opciones de procesamiento para la ubicación seleccionada. Los teclados se emplean para los datos de localización de diversas maneras. Un teclado de propósito general suele tener cuatro teclas de control de cursor que mueven el cursor hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha de la pantalla. Con otras cuatro teclas adicionales, podemos también mover el cursor diagonalmente. El movimiento rápido del cursor se consigue manteniendo apretada la tecla de cursor seleccionada. En ocasiones, los teclados incluyen un joystick, wwjoydisk, una trackball o un ratón de bola para posicionar un cursor en pantalla. En algunas aplicaciones, puede que resulte también conveniente utilizar un teclado para escribir valores numéricos u otros códigos que indiquen los valores de las coordenadas. También se han utilizado otros dispositivos, como los lápices luminosos, para introducir interactivamente coordenadas en un sistema. Pero los lápices luminosos registran las posiciones de pantalla detectando la luz emitida por los fósforos de la misma, lo que requiere procedimientos especiales de implementación.
Dispositivos de trazo Esta clase de dispositivos lógicos se utiliza para introducir una secuencia de coordenadas y los dispositivos físicos empleados para generar las entradas de tipo localizador se utilizan también como dispositivos de trazo. El movimiento continuo de un ratón, de una trackball, de un joystick o de un cursor de mano se traduce en una serie de coordenadas de entrada. La table gráfica es uno de los dispositivos de trazo más comunes. Puede usarse la activación de botones para colocar la tableta en modo «continuo». A medida que se mueve el cursor por la superficie de la tableta, se genera un flujo de valores de coordenadas. Este procedimiento se utiliza en los sistemas de dibujo para generar imágenes utilizando diversos trazos de pincel. Los sistemas de ingeniería también utilizan este procedimiento para trazar y digitalízar planos.
Dispositivos de cadena de caracteres El principal dispositivo físico utilizado para la introducción de cadenas de caracteres es el teclado. Las cadenas de caracteres en las aplicaciones infográficas se utilizan normalmente para etiquetar los dibujos o gráficos. Pueden usarse también otros dispositivos lisíeos para generar patrones de caracteres en aplicaciones especiales. Pueden dibujarse caracteres individuales en la pantalla utilizando un dispositivo de trazo o un dispositivo localizador. A continuación, un programa de reconocimiento de patrones interpreta los caracteres utilizando un diccionario almacenado de patrones predefinidos.
Dispositivos evaluadores Podemos emplear las entradas de evaluación en los programas gráficos para especificar valores escalares en las transformaciones geométricas, parámetros de visualización y parámetros de iluminación. En algunas apli-
11.2 Clasificación lógica de los dispositivos de entrada 691
eaeiones, las entradas de tipo escalar se utilizan también para establecer parámetros físicos tales como la temperatura, la tensión o factores de carácter mecánico. Un dispositivo lisico tipie*) utilizado para proporcionar entradas de evaluación son los paneles de diales de control. Las posiciones de los diales se calibran para generar valores numéricos dentro de un rango predefinido. Una serie de potenciómetros rotatorios convierten la rotación del dial en una tensión correspondiente, que a continuación se traduce en un número comprendido dentro de un rango escalar predefinido, como por ejemplo entre — 10.5 y 25.5. En lugar de utilizar diales, en ocasiones se emplean potenciómetros deslizantes para convertir movimientos lineales en valores escalares. Puede utilizarse como dispositivo evaluador cualquier teclado que disponga de un conjunto de teclas numéricas, aunque los diales y los potenciómetros deslizantes son más eficientes para la introducción rápida de valores. Los juvxficks, las Iraekballs, las tabletas y otros dispositivos interactivos pueden adaptarse para introducir valores interpretando la presión o el movimiento del dispositivo en relación con un rango escalar. Para una determinada dirección de movimiento, como por ejemplo de izquierda a derecha, pueden introducirse valores escalares crecientes; el movimiento en la dirección opuesta reduce el valor escalar de entrada. Los valores seleccionados suelen presentarse en pantalla para que el usuario pueda verificarlos. Otra técnica para proporcionar entradas de evaluación consiste en mostrar representaciones gráficas de deslizadores, botones, diales rotatorios y menús en el monitor de vídeo. La figura 11.1 ilustra algunas posibilidades para la representación de este tipo de controles. li\ posicionamieñtd del cursor mediante un ratón, joys/ick, spaceball u otro dispositivo permite seleccionar un valor en uno de esos controles virtuales. Como mecanismo de realimentación para el usuario, los colores seleccionados se muestran mediante barras de color y el valor escalar seleccionado se indica en una pequeña ventana próxima a cada control.
Dispositivos de elección Los menús se utilizan normalmente en los programas gráficos para seleccionar opciones de procesamiento, valores de parámetro y formas de los objetos que haya que utilizar para construir una imagen. Los dispositi-
FIGURA 11.1. Representación de controles gráficos para la introducción de datos de evaluación. Hn esta imagen, se proporcionan representaciones de controles deslizantes y de diales para la selección de los valores de los parámetros .vi y .v2 de una supcivlipse, además de para la introducción de componentes de color K(ilJ, ángulos de rotación y parámetros de escala. Alternativamente, puede posieionarse un pequeño círculo sobre la rueda de colores con el fin de seleccionar simultáneamente las tres componentes R(iH. También pueden utilizarse las teclas de Hecha del teclado y determinados botones con el fin de realizar pequeños cambios en un valor escalar seleccionado.
692
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
vos de elección comúnmente utilizados para seleccionar una opción de menú son los dispositivos de posicionamiento del cursor, como por ejemplo un ratón, una trackhult, el teclado, un panel de control o un panel de botones. A menudo se utilizan las teclas de función de un teclado o paneles de botones independientes para introducir las selecciones de menú. Cada botón o tecla de función se programa para seleccionar una operación o valor concreto, aunque en ocasiones se incluyen en los dispositivos de entrada botones o teclas preconfigurados. Para la selección en pantalla de las opciones de menú mostradas, se utiliza un dispositivo de posicionamiento del cursor. Cuando se selecciona una posición (.v,y) del cursor en pantalla, dicha posición se compara con las extensiones de coordenadas de cada uno de los elementos de menú mostrados. De esta forma, se seleccionará un elemento de menú que tenga límites verticales y horizontales . r , . r , y y v de los valores de coordenadas si las coordenadas introducidas satisfacen las desigualdades: m j n
X
< V ^
X
. V
< V < V
m a x
mm
m a x
(//
/)
Para los menús de mayor tamaño en los que se muestre un número relativamente pequeño de opciones, se utiliza comúnmente un panel táctil. La posición seleccionada de la pantalla se compara con las extensiones de coordenadas de las opciones de menú individuales, con el fin de determinar el proceso que hay que ejecutar. Otros métodos alternativos para la realización de elecciones dentro de una aplicación incluyen el teclado y los dispositivos de entrada de voz. Un teclado estándar puede utilizarse para escribir comandos u opciones de menú. Para este método de introducción de elecciones, resulta útil disponer de algún tipo de formato abreviado; los elementos de menú pueden estar numerados o tener nombres cortos identificativos. Puede utilizarse un esquema de codificación similar con los sistemas de entrada vocal. La entrada vocal resulta particularmente útil cuando el número de opciones es pequeño (20 o menos).
Dispositivos de selección Los dispositivos de selección se emplean para seleccionar una parte de una escena que haya que transformar o evitar de alguna manera. Pueden utilizarse diversos métodos distintos para seleccionar un componente de una escena visualizada, y cualquier mecanismo de entrada que se utiliza para este propósito se clasificará como un dispositivo de selección. Normalmente, las operaciones de selección se realizan posicionando el cursor en la pantalla. Utilizando un ratón, un joystirk o un teclado, por ejemplo, podemos realizar las selecciones posicionando el cursor en la pantalla y presionando un botón o una tecla para registrar las coordenadas del píxel. Esta posición de la pantalla puede entonces usarse para seleccionar un objeto completo, una faceta de una superficie teselada, una arista de un polígono o un vértice. Otros métodos de selección incluyen los esquemas de resalte, los mecanismos de selección de objetos por su nombre o una combinación de algunos de estos métodos. Utilizando la técnica de posicionamicnto del cursor, un procedimiento de selección podría mapear una posición de pantalla seleccionada sobre una ubicación en coordenadas universales utilizando las transformaciones inversas de visualización y geométrica que hubieran sido especificadas para la escena. Entonces, la posición en coordenadas universales puede compararse con la extensión de coordenadas de los objetos. Si la posición seleccionada se encuentra dentro de la extensión de coordenadas de un único objeto, habremos identificado el objeto seleccionado. Entonces, puede usarse el nombre del objeto, sus coordenadas u otra información relativa al mismo para aplicar las operaciones deseadas de transformación o de edición. Pero sí la posición seleccionada se encuentra dentro de la extensión de coordenadas de dos o más objetos, será necesario realizar comprobaciones adicionales. Dependiendo del tipo de objeto que haya que seleccionar y de la complejidad de una escena, puede que se requieran varios niveles de búsqueda para identificar el objeto seleccionado. Por ejemplo, si estamos tratando de seleccionar una esfera cuya extensión de coordenadas se solapa con la de algún otro objeto tridimensional, la posición seleccionada podría compararse con las extensiones de coordenadas de las facetas superficiales individuales de los dos objetos. Si esta comprobación no arrojara resultados concluyentes, podrían comprobarse las extensiones de coordenadas de los segmentos de línea individuales.
11.2 Clasificación lógica de los dispositivos de entrada 6 9 3
Cuando las comprobaciones de extensión de coordenadas no permitan identificar unívocamente el objeto seleccionado, pueden calcularse las distancias desde la posición seleccionada hasta los segmentos de linea individuales. La Figura 1 1 . 2 ¡lustra la selección de una posición que se encuentra dentro de las extensiones de coordenadas de dos segmentos de linea. Para un segmento de línea bidimensional cuyas coordenadas de los extremos sean (.r,, Vj) y (x ,y ), el cuadrado de la distancia perpendicular desde una posición seleccionada (.v, y) hasta la línea se calcula como: 2
2
|A (.v-. )-AyU-. )f y
V |
y |
1
Ax'+Ay
"
donde Av = x ~x¡ y Av = y ~y\- Se han propuesto también otros métodos, como la comparación de las distancias a los puntos extremos, para simplificar las operaciones de selección de líneas. Los procedimientos de selección pueden simplificarse si no se llevan a cabo las comprobaciones de extensión de coordenadas para las facetas de superficie y los segmentos de línea de un objeto. Cuando la posición de selección se encuentre dentro de las extensiones de coordenadas de dos o más objetos, los procedimientos de selección pueden simplemente devolver una lista de todos los objetos candidatos. Otra técnica de selección consiste en asociar una ventana de selección con una posición seleccionada del cursor. La ventana de selección estará centrada en la posición del cursor, como se muestra en la Figura 1 1 . 3 y se utilizarán procedimientos de recorte para determinar qué objetos se interseetan con la ventana de selección. Para la selección de líneas, podemos asignar valores muy pequeños a las dimensiones w y h de la ventana de selección, de modo que sólo intersecte un segmento de línea con la ventana de selección. Algunos paquetes gráficos implementan la selección tridimensional reconstruyendo una escena utilizando las transformaciones de visualización y proyección y empleando la ventana de selección como ventana de recorte. No se muestra ninguna imagen correspondiente a esta reconstrucción, si no que simplemente se aplican los procedimientos de recorte para determinar qué objetos se encuentran dentro del volumen de selección. Entonces, puede devolverse una lista de información para cada objeto contenido en el volumen de selección, con el fin de procesar los distintos objetos. Esta lista puede contener información tal como el nombre del objeto y su rango de profundidad, pudiendo emplearse el rango de profundidad para seleccionar el objeto más cercano dentro del conjunto de objetos contenidos en el volumen de selección.También pueden utilizarse técnicas de resalle para facilitar la selección. Una forma de hacer esto consiste en resaltar sucesivamente aquellos objetos cuyas extensiones de coordenadas se solapen con una posición de selección (o ventana de selección). A medida que se resalta cada objeto, el usuario puede ejecutar una acción de «rechazo» o «aceptación» utilizando los botones del teclado. La secuencia se detendrá cuando el usuario acepte como selección el objeto resallado. La selección también podría llevarse a cabo simplemente resaltando sucesivamente todos los objetos de la escena sin seleccionar una posición del cursor. Esta secuencia de resalle puede iniciarse mediante un botón o tecla de función, pudiendo emplearse un segundo botón para detener el proceso cuando esté resaltado el objeto deseado. Si hubiera que ir pasando de esta manera a través de una lista muy grande de objetos, pueden 2
2
(•y V
FIGURA 11.2. Distancias desde una posición seleccionada a dos segmentos de linea distintos.
FIGURA 11.3.
Una ventana de selección con centro en
(x ^y ), anchura w y altura //. p
p
694
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
utilizarse botones adicionales para acelerar el proceso de resalte. Un botón iniciaría un resalle rápido sucesivo de estructuras, un segundo bolón se activaría para detener el proceso y un tercer botón se emplearía para ir lentamente hacia airas en el proceso de resalte. Finalmente, puede presionarse un botón de parada para completar el procedimiento de selección. Si los componentes de una imagen pueden seleccionarse por su nombre, podria emplearse la entrada de teclado para seleccionar un objeto. Este procedimiento es muy sencillo pero menos interactivo. Algunos paquetes grálicos permiten asignar nombres a ios componentes de una imagen a diversos niveles, hasta llegar al nivel de las primitivas individuales. Pueden usarse nombres descriptivos para ayudar al usuario durante el proceso de selección, pero esta técnica tiene sus desventajas: generalmente es más lenta que la selección interactiva en pantalla y el usuario probablemente necesite que se presenten indicaciones en pantalla para recordar los diversos nombres de las estructuras.
11.3 FUNCIONES DE ENTRADA PARA DATOS GRÁFICOS Los paquetes gráficos que utilizan la clasificación lógica de los dispositivos de entrada proporcionan diversas funciones para seleccionar dispositivos y clases de datos. Estas funciones permiten al usuario especificar las siguientes opciones: •
El modo de interacción de entrada para el programa gráfico y los dispositivos de entrada. Puede que sean el programa o los dispositivos los que inicien la introducción de los datos, o bien pueden operar ambos simultáneamenie.
•
La selección de un dispositivo físico que proporcione la entrada dentro de una clasificación lógica concreta (por ejemplo, una tableta utilizada como dispositivo de trazo).
•
La selección del tiempo y el dispositivo de entrada para un conjunto concreto de valores de dalos.
Modos de entrada Algunas funciones de entrada en un sistema gráfico interactivo se utilizan para especificar cómo deben interacluar el programa y los dispositivos de entrada. Un programa podría requerir las entradas en un momento concreto del procesamiento (modo de solicitud) o un dispositivo de entrada podría proporcionar de manera independiente datos de entrada actualizados (modo de muestreo), o el dispositivo podría almacenar de manera independiente todos los dalos recopilados (modo de sucesos). En el modo de solicitud, el programa de aplicación es quien inicia la introducción de los datos. Cuando se solicitan valores de entrada, el procesamiento se suspende hasla que se reciben los valores requeridos. Este modo de entrada se corresponde con la operación lipica de entrada en un lenguaje de programación general. El programa y los dispositivos de entrada operan de manera alternativa. Los dispositivos se quedan en un estado de espera hasta que se realiza una solicitud de entrada, en cuyo momento el programa espera hasta que se entregan los datos. En el modo de muestreo, el programa de aplicación y los dispositivos de entrada operan de manera independiente. Los dispositivos de entrada pueden estar operando al mismo tiempo que el programa procesa otros datos. Los nuevos valores obtenidos desde los dispositivos de entrada sustituyen a los valores de datos introducidos previamente. Cuando el programa requiera nuevos datos, nuicstreará los valores actuales que se hayan almacenado a partir de la entrada del dispositivo. En el modo de sucesos, los dispositivos de entrada son quienes inician la introducción de datos en el programa de aplicación. De nuevo, el programa y los dispositivos de entrada operan concurrentemente, pero ahora los dispositivos de entrada suministran dalos a una cola de entrada, también llamada cola de sueesos. Todos los datos de entrada se almacenan. Cuando el programa requiere nuevos datos, los extrae de la cola de datos.
11.4 Técnicas interactivas de construcción de imágenes
695
Normalmente, puede haber varios dispositivos operando al mismo tiempo en los modos de muestreo y de sucesos. Alguno de ellos pueden estar operando en modo de muestreo mientras que otros operan en modo de sucesos. Por el contrario, en el modo de solicitud, sólo puede haber un dispositivo en cada momento suministrando las entradas. Otras funciones de la biblioteca de entrada se utilizan para especificar los dispositivos físicos correspondientes a las distintas clases lógicas de datos. Los procedimientos de entrada en un paquete interactivo pueden implicar un procesamiento relativamente complicado para algunos tipos de entrada. Por ejemplo, para obtener una posición en coordenadas universales, los procedimientos de entrada deben procesar una ubicación de pantalla suministrada como entrada, aplicándole las transformaciones de visualización y otras transformaciones hasta llegar a la descripción original en coordenadas universales de la escena. Y este procesamiento también implica obtener información de las rutinas de gestión de las ventanas de visualización.
Realimentación mediante eco Normalmente, puede solicitarse a un programa interactivo de entrada que proporcione un eco de realimentación de los datos de entrada y de los parámetros asociados. Cuando se solicita un eco de los datos de entrada, éstos se muestran dentro de un área de pantalla especificada. La realimentación mediante eco puede incluir, por ejemplo, el tamaño de la ventana de selección, la distancia de selección mínima, el tipo y el tamaño de un cursor, el tipo de resalte que habría que emplear durante las operaciones de selección, el rango (mínimo y máximo) de las entradas de evaluación y la resolución (escata) de las entradas de evaluación.
Funciones de retrollamada En los paquetes gráficos independientes de los dispositivos, puede proporcionarse un conjunto limitado de funciones de entrada en una biblioteca auxiliar. Los procedimientos de entrada pueden entonces gestionarse como funciones de retrollamada (Sección 2.9) que interactúen con el software del sistema. Estas funciones especifican qué acciones debe tomar un programa cuando tenga lugar un suceso de entrada. Los sucesos de entrada típicos son el movimiento del ratón, la posición de un botón del ratón o la pulsación de un botón del teclado.
11.4 TÉCNICAS INTERACTIVAS DE CONSTRUCCIÓN DE IMÁGENES Los paquetes gráficos suelen incorporan diversos métodos interactivos como ayuda para la construcción de imágenes. Puede que se proporcionen rutinas para posicionar objetos, aplicar restricciones, ajustar el tamaño de los objetos y diseñar formas y patrones.
Métodos básicos de posicionamiento Podemos seleccionar interactivamente un punto de coordenadas con algún dispositivo señalado que registre una ubicación en pantalla. Cómo se usa la posición dependerá de la opción seleccionada de procesamiento. El punto de coordenadas puede ser el extremo de un segmento de línea o utilizarse para posicionar algún objeto: por ejemplo, la ubicación de pantalla seleccionada podría hacer referencia a una nueva posición que designe el centro de una esfera. O bien, la ubicación puede utilizarse para especificar la posición de una cadena de texto, que podría comenzar en dicha ubicación o estar centrada en ella. Como ayuda adicional de posicionamiento, los valores numéricos correspondientes a las posiciones seleccionadas pueden suministrarse como eco en la pantalla. Utilizando como guia los valores de coordenada suministrados como eco, el usuario podría realizar pequeños ajustes interactivos en los valores de coordenadas utilizando diales, teclas de cursor u otros dispositivos.
696 CAPÍTULO 11 Métodos interactivos de entrada e interfaces gráficas de usuario
Arrastre de objetos Olra técnica interactiva de posicionamiento consiste en seleccionar un objeto y arrastrarlo hasta una nueva ubicación. Utilizando un ratón, por ejemplo, posicionamos el cursor sobre el objeto, pulsamos un botón del ratón, movemos el cursor a una nueva posición y liberamos el botón. Entonces, el objeto se mostrará en la nueva ubicación del cursor. Usualmente, el objeto también se suele mostrar en las posiciones intermedias a medida que se mueve el cursor por la pantalla.
Restricciones Se denomina restricción a cualquier procedimiento destinado a alterar los valores de coordenadas introducidos con el fin de obtener una orientación o alineación particulares de un objeto. Por ejemplo, puede restringirse un segmento de línea de entrada para que sea horizontal o vertical, como se ilustra en las Figuras 11.4 y 11.5. Para ¡mplementar este tipo de restricción, comparamos los valores de coordenada de entrada de los dos puntos extremos. Si la diferencia en los valores y de los dos extremos es menor que la diferencia en los valores A\ se mostrará una línea horizontal, mientras que en caso contrario se mostrará una línea vertical. La restricción horizontal-vertical resulta útil, por ejemplo, al construir diagramas de red y elimina la necesidad de posicionar de manera precisa las coordenadas de los extremos. Pueden aplicarse otros tipos de restricciones a las coordenadas de entrada con el fin de producir diversas clases de alineaciones. Pueden restringirse las líneas para que tengan una pendiente concreta, como por ejemplo 45°, y las coordenadas de entrada pueden restringirse para que caigan a lo largo de una serie de trayectorias predefinidas, como por ejemplo arcos circulares.
Cuadrículas Otro tipo de restricción es una cuadrícula rectangular que puede mostrarse en alguna parte de la pantalla. Si está activada la restricción de cuadrícula, las coordenadas de entrada se redondean a la intersección de cuadrícula más próxima. La Figura 11.6 ilustra el procedimiento de dibujo de una línea utilizando una cuadrícula. Cada una de las posiciones de cursor en este ejemplo se desplaza hasta el punto de intersección de la cuadrícula más cercano, trazándose una línea entre esas dos posiciones de cuadrícula. Las cuadrículas facilitan la construcción de los objetos, ya que puede unirse fácilmente una línea con otra previamente dibujada, seleccionando cualquier posición cerca de la intersección de cuadrícula correspondiente a uno de los extremos de la línea previa. Normalmente, el espaciado entre las líneas de cuadrícula puede ajustarse, y también suele ser posible utilizar cuadrículas parciales o cuadrículas con di lérente espaciado en las diferentes áreas de la pantalla.
Métodos de banda elástica Los segmentos de línea y otras formas básicas pueden construirse y posieionarse utilizando métodos de banda elástica que permiten ampliar o contraer interactivamente los tamaños de los objetos. La Figura 11.7 ilustra uno de estos métodos de banda elástica para la especificación interactiva de un segmento de línea. En primer lugar, se selecciona una posición fija de la pantalla para uno de los extremos de la línea. Después, a medida que se mueve el cursor, la línea se muestra desde esa posición inicial hasta la posición actual del cursor. El segundo extremo de la línea será introducido cuando se pulse un bolón o una tecla. Utilizando un ratón, construimos una línea de banda elástica mientras pulsamos una de las teclas del ratón; al liberarla, la visualización de la línea será completada. Podemos utilizar métodos de banda elástica para construir rectángulos, círculos y otros objetos. La Figura 11.8 ilustra la construcción de un rectángulo mediante un método de banda elástica y la Figura 11.9 muestra la construcción de un círculo. Podemos implcmentar estos mecanismos de construcción de banda elástica de diversas maneras; por ejemplo, la forma y el tamaño de un rectángulo pueden ajustarse moviendo de manera independiente únicamente la arista superior del rectángulo, o la arista inferior o una de las aristas laterales.
11.4 Técnicas interactivas de construcción de imágenes
Se .selecciona la posición del primer exlremo
Se selecciona la posición del segundo exiremo según un trayecto horizontal aproximado
Se selecciona la posición del primer exlremo cerca de una intersección de la cuadrícula
697
FIGURA 11.4. Restricción horizontal de lineas.
Se selecciona una posición cerca de una segunda intersección de la cuadrícula
FIGURA 11.6. Construcción de un segmento de línea en el que los extremos están restringidos de forma que sólo pueden colocarse en las posiciones de intersección de la cuadrícula.
Selección del primer extremo de la línea
A medida que el cursor se mueve. una línea se extiende a partir del punto inicial
La línea sigue la posición del cursor hasta que se selecciona el segundo extremo
FIGUFÍA 11.7. Método de banda elástica para la construcción y posicionamiento de un segmento de línea recta.
698
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
en
Selección de la posición correspondiente a una esquina del rectángulo
El rectángulo se extiende a medida que se mueve el cursor
Selección de la posición final correspondiente a la esquina opuesta del reciáncnli»
FIGURA 11.8. Método de banda elástica para la construcción de un rectángulo.
r
Selección de la posición correspondiente al centro del círculo
El círculo se extiende a medida que el cursor se mueve
Selección del nidio final del círculo
FIGURA 11.9. Construcción de un círculo utilizando un método de banda eláslica.
Campo de gravedad En la construcción de figuras, en ocasiones surge la necesidad de conectar líneas en las posiciones de algunos extremos que no se encuentran situados en las intersecciones de la cuadrícula. Puesto que el posicionamiento exacto del cursor de pantallas sobre el punto de conexión puede resultar difícil, los paquetes gráficos pueden incluir procedimientos que conviertan cualquier posición de entrada situada cerca del segmento de línea a una posición sobre una línea utilizando un área de campa de gravetkulalrededor de la línea. Cualquier posición seleccionada dentro del campo de gravedad de una línea se moverá («gravitará») hasta la posición más cercana situada sobre la línea. En la Figura 11.10 se ilustra mediante una región sombreada el área del campo de gravedad situado alrededor de una línea. Los campos de gravedad alrededor de los extremos de la línea están agrandados para hacer que le resulte más fácil al diseñador conectar las lineas por los extremos. Las posiciones seleccionadas en una de las áreas circulares del campo de gravedad se verán atraídas hasta el extremo correspondiente a dicha área. El tamaño de los campos de gravedad se selecciona de forma que sea lo suficientemente grande como para ayudaren el posicionamiento, pero lo suficientemente pequeño como para reducir las posibilidades de solapamienlo con otras líneas. Si se muestran muchas líneas, las áreas de gravedad pueden solaparse y puede resultar difícil
FIGURA 11.10. Campo de gravedad alrededor de una línea. Cualquier punto seleccionado en el área sombreada se desplaza a una posición sobre la línea.
11.3 Entornos de realidad virtual
699
especificar los punios correctamente. Normalmente, los sistemas no muestran en pantalla las fronteras de estos campos de gravedad.
Métodos interactivos de dibujo Las opciones para la realización de bocetos y dibujos son de distintos tipos. Pueden generarse lineas rectas, polígonos y círculos utilizando los métodos explicados en las secciones previas. También pueden proporcionarse opciones de dibujo de curvas utilizando formas curvas estándar, como arcos circulares y splines, o empleando procedimientos de trazado a mano alzada. Las splines se construyen interactivamente especificando un conjunto de puntos de control o un boceto a mano alzada que proporcione la forma general de la curva. Entonces, el sistema hará encajar el conjunto de puntos con una curva polinómica. En el dibujo a mano alzada, las curvas se generan siguiendo la trayectoria de un lápiz sobre una tableta gráfica o el trayecto del cursor de pantalla sobre un monitor de video. Una vez visualizada una curva, el diseñador puede alterar la forma de la curva ajustando las posiciones de puntos seleccionados situados a lo largo del trayecto curvo. Los paquetes de dibujo suelen también incluir opciones para el ajuste de las anchuras de las líneas, de los estilos de las líneas y de otros atributos. Estas opciones se ¡mplementan mediante los métodos analizados en la Sección 4.5. En muchos sistemas hay también disponibles distintos estilos de pincel, patrones de pincel, combinaciones de colores, formas de objetos y patrones de textura superficial; todas estas opciones suelen ser muy comunes en los sistemas que funcionan como estaciones de trabajo para dibujo artístico. Algunos sistemas de dibujo varían el ancho de la línea y los trazos de pincel de acuerdo con la presión que la mano del artista ejerce sobre el lápiz. La Figura 1 1 . 1 1 muestra un sistema de ventanas y menús utilizado con un paquete de dibujo que permite a un artista seleccionar variaciones de una forma de objeto especificada, así como seleccionar diferentes texturas superficiales y condiciones de iluminación para la escena.
11.5 ENTORNOS DE REALIDAD VIRTUAL En la Figura 1 1 . 1 2 se ilustra un entorno típico de realidad virtual. La entrada interactiva se lleva a cabo en este entorno mediante un clcclroguanlc (Sección 2.4), que es capaz de agarrar y desplazar los objetos que se muestran en una escena virtual. La escena generada por la computadora se muestra mediante un sistema de visiocasco (Sección 2 . 1 ) en forma de proyección estereográfica. Una serie de dispositivos de seguimiento calculan la posición y orientación del visiocasco y del electroguantc en relación con las posiciones de los objetos de la escena. Con este sistema, un usuario puede moverse a través de la escena y reordenar las posiciones de los objetos con su electroguante.
FIGURA 11.11. Una captura de pantalla que muestra un tipo de inlerfaz de un paquete para dibujo artístico. (Cortesía de Thomson Digital Imagc.)
FIGURA 11.12. Utilizando un visiocasco estéreo, denominado BOOM (Fake Space Labs, Inc.) y un electroguante Dataglove(VPL, Inc.), un investigador manipula interactivamente una serie de sondas dentro del turbulento flujo que existe alrededor de un avión Harrier a reacción. El software ha sido desarrollado por Steve Bryson; y los datos han sido proporcionados por Harrier. (Cortesía de Sam Uselton. NASA Ames Research Center.) Otro método para generar escenas virtuales consiste en mostrar proyecciones estereográficas sobre un monitor de barrido, visualizando las dos imágenes estereográficas en ciclos de refresco alternativos. Entonces, la escena puede observarse mediante unas gafas estereográficas. De nuevo, la manipulación interactiva de los objetos puede llevarse a cabo con un electroguantc, utilizándose un dispositivo de seguimiento para monitorizar la posición y orientación del guante en relación con la posición de los objetos de la escena.
11.6 FUNCIONES QpenGL PARA DISPOSITIVOS DE ENTRADA INTERACTIVA La entrada interactiva desde cualquier tipo de dispositivo en un programa OpenGL se gestiona mediante las rutinas GLUT (Utility Toolkit), porque estas rutinas necesitan comunicarse con un sistema de gestión de ventanas. En GLUT, disponemos de I unciones para aceptar la entrada procedente de dispositivos estándar, como el teclado o el ratón, así como de tabletas, ratones de bola tridimensionales, cajas de botones y diales. Para cada dispositivo, especificamos un procedimiento (la función de retrollamada) que será el que haya que invocar cuando tenga lugar cualquier suceso de entrada en ese dispositivo. Estos comandos GLUT se insertan en el procedimiento m a i n junto con las demás instrucciones GLUT. Además, puede usarse una combinación de funciones de la biblioteca básica y de la biblioteca GLU con la función de ratón de GLUT para capturar entradas.
Funciones de ratón GLUT Utilizamos la siguiente función para especificar («registrar») un procedimiento que será el que haya que llamar cuando el puntero del ratón se encuentre dentro de una ventana de visualización y un botón del ratón sea presionado o liberado: glutMouseFunc
(mouseFcn);
11.6 Funciones OpenGL paro dispositivos de entrada interactiva
701
Este procedimiento de retrollamada para control del ratón, al que hemos denominado mouseFcn, tiene cuatro argumentos: v o i d mouseFcn
(GLint
button,
GLínt
action,
GLint
GLirtt
xMouse,
yMouse)
Al parámetro b u t t o n se le asigna una constante simbólica ü L U T que denota uno de los tres botones del ratón, mientras que al parámetro a c t i o n se le asigna una constante simbólica que especifica qué acción del botón podemos utilizar para disparar el suceso de activación del ratón. Los valores permitidos para b u t t o n son G L U T L E F T B U T T O N , GLUTJv1IDDLE_BUTTON y G LUT_R IG HT_B UTTON (si sólo disponemos de un ratón de dos botones, usaremos únicamente las designaciones correspondientes al botón izquierdo y al botón derecho; con un ratón de un único botón, el único valor que podemos asignar al parámetro b u t t o n es GLUT_LEFT_BUTTON). Al parámetro a c t i o n se le pueden asignar las constantes GLUT_D0WN o GLUT_UP, dependiendo de si queremos iniciar una acción cuando pulsemos el botón del ratón o cuando lo liberemos. Cuando se invoca el procedimiento mouseFcn, se devuelve la ubicación del cursor del ratón dentro de la venlana de visualización. en forma de una pareja de coordenadas ( x M o u s e , y M o u s e ) . Esta ubicación es relativa a la esquina superior izquierda de la ventana de visualización, de modo que xMouse será la distancia en píxeles desde el borde izquierdo de la ventana de visualización e y M o u s e será la distancia en píxeles desde el borde superior de la ventana de visualización. Activando un botón del ratón mientras el cursor se encuentra dentro de la ventana de visualización, podemos seleccionar una posición para mostrar una primitiva, como por ejemplo un único punto, un segmento de línea o un área de relleno. También podemos utilizar un ratón como dispositivo de selección, comparando la posición en pantalla devuelta con las extensiones de coordenadas de los objetos visualizados en la escena. Sin embargo, OpenGL proporciona otras rutinas para utilizar el ratón como dispositivo de selección, y hablaremos de esas rutinas en una sección posterior. Como ejemplo simple de utilización de la rutina g l u t M o u s e F u n c , el siguiente programa dibuja un punto rojo, con un tamaño de punto igual a 3, en la posición del cursor dentro de la ventana de visualización; para dibujar el punto, debemos presionar el botón izquierdo del ratón. Puesto que el origen de coordenadas para las funciones primitivas OpenGL es la esquina inferior izquierda de la ventana de visualización, será necesario invertir el valor y M o u s e devuelto en el procedimiento m o u s e P t P l o t . #include GLsizei
void
init
=
400,
winHeight
-
300;
//
Tamaño
//
de
inicial
de
la
ventana
viaualización.
(void)
{ glClearColor
{0.0,
0.0,
1.0,
1.0)
// //
glMatrixMode gluOrtho2D
Establecer
azul
como
color ventana
visualización.
(GL_PROJECTION);
(0.0,
200.0,
0.0,
150.0);
} void
displayFcn
(void)
{ glClear glColor3f
(GL_COLOR_BUFFER_BIT); (1.0,
glPointSize )
0.0,
(3.0);
0.0);
// // //
Borrar
ventana
Establecer Definir
de
visualización.
r o j o como
tamaño
de
c o l o r de punco.
punto
3.0.
de
702
CAPÍTULO
11
Métodos
v o i d winReehapeFcn
interactivos de entrada e interfaces gráficas de usuario
(GLint
newWidth,
GLint
newHeight)
{ /*
Reinicial izar
glViewport
(0,
glMatrixMode
0,
/*
de
newWidth,
(
winHeight
*/
);
{0.0,
=
y visor
newHeight);
GLdouble
(newWidth),
R e i n i c i a l i z a r parámetros
winWidth
proyección
(GL_PROJECTION);
glLoadldentity gluOrtho2D
parámetros
de
0.0,
GLdouble
(newHeight));
tamaño v e n t a n a d e v i s u a l i z a c i ó n .
*/
newWidth; =
newHeight;
} void plotPoint
(GLint
x,
GLint
y)
( glBegin
(GL__P0INTS);
glVertex2i glEnd
{
(x,
y);
);
} void mousePtPlot if
(button
mm
plotPoint glFlush
(
(GLint
button,
GLint
GLUT_LEFT_BUTTON (xMouse,
winHeight
action, action
-
GLint ==
xMouse,
GLint
yMouae)
GLUT_DOWN)
yMouse);
) ;
} void
main
(int
arge,
char**
argv)
f
glutlnit
(&argc,
argv);
glutlnitDisplayMode
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow
init
(
(100,
(winWidth, ("Mouse
Plot
|
GLUT_RGB);
100); winHeight); Points");
) ;
glutDisplayFunc
(displayFcn);
glutReshapeFunc
(winReshapeFcn);
glutMouseFunc glutMainLoop
(mousePtPlot); (
);
l VA siguiente ejemplo de programa utiliza la entrada de ratón para seleccionar la posición de un extremo de un segmento de línea recta. Hn el programa se conectan segmentos de línea seleccionados para ilustrar la construcción interactiva de una polilinea. Inicialmente. deben seleccionarse con el botón izquierdo del ratón dos ubicaciones dentro de la ventana de visualización para generar el primer segmento de línea. Cada una de las posiciones subsiguientes que se seleccione agrega otro segmento a la polilinea. En la Figura 11.13 se proporciona una salida de ejemplo de este programa.
11.6 Fundones OpenCL pora dispositivos de entrado interactivo
703
FIGURA 11.13. Una salida de ejemplo del procedimiento interactivo p o l y l i n e de control con el ratón.
ttinclude
< G L / g l u t . h>
GLsizei
winWidth
GLint endPtCtr =
class
scrPt
=
400,
winHeight
=
300;
0,-
//
Tamaño
inicial
//
Inicializar
//
extremos
ventana v i s u a l i z a c i ó n .
contador
de
de
puntos
líneas.
{
public: GLint
y;
}; void
init
(void)
{ glClearColor
(0.0,
0.0,
1.0,
1.0)
// //
glMatrixMode glu0rtho2D
Establecer
azul
como
color
ventana
visualización.
(GL_PROJECTION); (0.0,
200.0,
0.0,
150.0);
}
' /
void
displayFcn
(void)
{ glClear
(GL_COLOR_BUFFER_BIT);
} v o i d winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
{ /*
Reinicializar
glViewport
(0,
glMatrixMode
/*
newWidth,
de
winHeight
a
y
visor
*/
newHeight);
(
(0.0,
) ; GLdouble
(newWidth),
R e i n i c i a l i z a r parámetros de
winWidth
proyección
(GL_PRCJECTION);
glLoadldentity glu0rtho2D
0,
parámetros
0.0,
tamaño d e
GLdouble
(newHeight));
la ventana de v i s u a l i z a c i ó n .
newWidth; » nawHeight;
¿£%£É^^
*/
de
704
CAPITULO 11
void
Métodos interactivos de entrada e interfaces gráficas de usuario
drawLineSegment
glBegin
(scrPt
endPtl,
scrPt
glVertex2i
(endPtl.x,
endPtl.y);
glVertex2i
(endPt2.x,
endPt2.y);.
glEnd
endPt2)
(
ft
^^^^^^^^^^^^^^^^^^^^^^^^^^ void polyline
static *f
(GLint b u t t o n ,
scrPt
(ptCtr if
endPtl,
= = 0 }
(button
GLint
action,
xMouse,
GLint
yMouee)
endPtZ;
{
«
GLUT_LEFT_BUTTON
endPtl.x
=
xMouse,-
endPtl.y
=
winHeight
ptCtr
1;
=
GLint
-
&&
action
==
GLUT_DOWN)
{
yMouse;
else if
(button
==
exit
GLUT_RIGHT_BUTTON)
//
Salir del
programs,
(0);
else if
(button
==
GLUT_LEFT_BUTTON & & a c t i o n
==
GLUT_DOWN)
{
e n d P t 2 . x = xMouse; endPt2.y
=
winHeight
drawLineSegment endPtl
=
-
yMouse;
(endPtl,
endPt2);
endPt2;
else if
(button exit
glFlush
v o i d main
(
==
GLUT_RIGHT_BUTTON)
//
Salir
(0);
) ;
(int
argc,
char**
argv)
f glutlnit
(fitargc,
argv)
glutlnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow
(100,
(winWidth, ("Draw
i n i t ( ); (displayFcn);
glutReshapeFunc
(winReshapeFcn);
glutMainLoop
(polyline); {
) ;
GLUT_RGB);
winHeight);
Interactive
glutDisplayFunc glutMouseFunc
|
100); Polyline");
del
programa.
11.6 Funciones OpenGL puro dispositivos de entrada interactiva
705
Otra rutina de ratón de GLUT que podemos utilizar es: glutMotionFunc
(fcnDoSomething);
Esta rutina invoea f c n D o S o m e t h i n g euando se mueve el ratón dentro de la ventana de visualización con uno o más botones activados. La función que se invoca en este caso tiene dos argumentos: void
fcnDoSomething
(GLint
xMouse,
GLint
yMouse)
donde ( x M o u s e , y M o u s e ) es la ubicación del ratón en la \ cotana de visualización, relativa a la esquina superior izquierda, cuando se mueve el ratón con un botón pulsado. De forma similar, podemos realizar alguna acción cuando movamos el ratón dentro de la ventana de visualización sin presionar un botón: glutPassiveMotionFunc
(fcnDoSomethingElse);
De nuevo, la ubicación del ratón se devuelve a f c n D o S o m e t h i n g E l s e como la posición de coordenadas ( x M o u s e , y M o u s e ) , relativa a la esquina superior izquierda de la ventana de visualización.
Funciones de teclado GLUT Con la entrada de teclado, utilizamos la siguiente función para especificar el procedimiento que haya que invocar cuando se pulse una tecla: glutKeyboardFunc
(keyFcn);
El procedimiento especificado tiene tres argumentos: v o i d keyFcn
(GLubyte
key,
GLint
xMouse,
GLint
yMouse)
Al parámetro k e y se el asigna un valor de tipo carácter o el correspondiente código ASCII. La ubicación del ratón dentro de la ventana de visualización se devuelve como la posición ( x M o u s e , y M o u s e ) , relativa a la esquina superior izquierda de la ventana de visualización. Cuando se pulsa una tecla designada, podemos utilizar la ubicación del ratón para iniciar alguna acción, independientemente de si hay o no pulsado algún botón del ratón. En el siguiente código, presentamos un procedimiento simple de dibujo de curvas utilizando la entrada de teclado. Se genera una curva a mano alzada moviendo el ratón dentro de la ventana de v isualización mientras se mantiene apretada la tecla «c». Esto hace que se muestre una secuencia de puntos rojos en cada una de las posiciones registradas del ratón. Moviendo lentamente el ratón, podemos obtener una línea curva continua. Los botones del ratón no tienen ningún efecto en este ejemplo. En la Figura 11.14 se proporciona una salida de ejemplo del programa.
FIGURA 11.14. Una salida de ejemplo que muestra un dibujo a mano alzada generado mediante el procedimiento curveDrawing.
706
CAPÍTULO 11
#include
GLsizei void
Métodos interactivos de entrada e interfaces gráficas de usuario
winWidth
init
=
400,
winHeight
=
300;
//
Tamaño
inicial
ventana visualización.
(void)
{ glClearColor
(0.0,
0.0,
1.0,
1.0);
//
Establecer
azul
como
color
ventana
visualización. glMatrixMode gluOrtho2D
(GL_PROJECTION>;
(0.0,
200.0,
0.0,
150.0);
} void
displayFcn
(void)
{ glClear
(GL_COLOR_j3UFFER_BIT} ;
glColor3f
(1.0,
glPointSize
0.0,
(3.0);
0.0);
//
//
//
Borrar
ventana
Establecer
Especificar
rojo
tamaño
de
de
como
punto
visualización. color de
punto.
3.0.
} void
winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
( /*
Reinicializar
glViewport
(0,
glMatrixMode
0,
/*
de
newWidth,
(
(0.0,
=
winHeight
y
visor
*/
newHeight);
); GLdouble
(newWidth),
R e i n i c i a l i z a r parámetros de
winWidth
proyección
(GL_PROJECTION);
glLoadldentity gluOrtho2D
parámetros
0.0,
tamaño d e
GLdouble
(newHeight));
la ventana de v i s u a l i z a c i ó n .
newWidth; •
newHeight;
} void
plotPoint
(GLint
x,
GL.int
y)
{ glBegin
(GL_POINTS);
glVertex2i glEnd
(
(x,
y);
);
} /* a
Mover
el
cursor
mano a l z a d a .
void
mientras
se
(GLubyte
curvePlotKey,
{ x
GLint
y
switch
*
xMouse;
•
winHeight
-
yMouse;
(curvePlotKey)
case
la
tecla
c
activa
el
dibujo
de
*/
curveDrawing
GLint
pulsa
'C:
plotPoint
(x,
y);
GLint
xMouse,
GLint
yMouse)
curvas
*/
de
11.6 Funciones OpenCL paro dispositivos de entrada interactiva
707
break; default: break;
}
g l P l u s h ( ) ,-
v o i d main
(int
argc,
char**
argv)
{ glutlnit (fcargc, a r g v ) ; g l u t l n i t D i s p l a y M o d e (GLUT_SINGLE glutlnitWindowPosition glutlnitWindowSize glutCreateWindow init
(
(100,
GLUT_RGB);
100);
(winWidth, ("Keyboard
|
winHeight);
Curve-Drawing
Example");
);
glutDisplayFunc
(displayFcn);
glucReshapeFunc
(winReshapeFcn);
glucKeyboardFunc glutMainLoop
(
(curveDrawing)
) ;
}
Puní las teclas de función, teclas de Hecha y otras teclas de propósito especial, podemos utilizar el comando: glucSpecialFunc
(specialKeyFcn);
El procedimiento especificado tiene ios mismos tres argumentos: void
specialKeyFcn
(GLint
s p e c i a l K e y , GLint xMouse, GLint yMouse)
pero ahora al parámetro s p e c i a l K e y se le asigna una constante simbólica GLUT de valor entero. Para seleccionar una tecla de función, utilizamos una de las constantes G L U T _ K E Y _ F l a GLUT_KEY_F12. Para las teclas de cursor, usamos constantes del estilo de G L U T _ K E Y J J P y G L U T _ K E Y _ R I G H T . Otras teclas pueden designarse mediante GLUT_KEY_PAGE_DOWN. GLUT_KEY_HOME y otras constantes similares para las teclas de RePág, Fin e Insert. Las teclas de retroceso, Supr y Esc pueden designarse mediante la rutina g l u t K e y b o a r d F u n c utilizando sus códigos A S C I I , que son 8, 127 y 27, respectivamente. El siguiente fragmento de código es un programa interactivo que ilustra el uso del ratón, el teclado y las teclas de función. La entrada de ratón se utiliza para seleccionar una ubicación para la esquina inferior izquierda de un cuadrado rojo. La entrada de teclado se emplea para cambiar la escala del cuadrado y podemos obtener un nuevo cuadrado con cada clic del botón izquierdo del ratón. ftinclude #inclue GLsizei
=
GLint e d g e L e n g t h •
400, 10;
winHeight
=
300; // //
//
Tamaño
Longitud el
inicial
de
cuadrado.
arista
ventana v i s u a l i z a c i ó n . inicial
para
708
CAPÍTULO 11
void
init
Métodos interactivos de entrada e interfaces gráficas de usuario
{void)
{ glClearColor
(0.0,
0.0,
1.0,
1.0)
//
Establecer
azul
como
color
ventana
de
visualización. glMatrixMode gluOrtho2D
(GL_PROJECTION);
(0.0,
200.0,
0.0,
150.0);
} void
displayFcn
(void)
{ glClear
(GL_COLOR_BUFFER_BIT);
glColor3f
(1.0,
0.0,
0.0);
//
//
Borrar
ventana
Establecer
rojo
de
como
visualización. color
de
relleno.
} void
winReshapeFcn
(GLint
newWidth,
GLint
newHeight)
( /*
R e i n i c i a l i z a r parámetros
glViewport
(0,
glMatrixMode
0,
/*
{
(0.0,
=
winHeight
y
visor
*/
); GLdouble
{newWidth),
R e i n i c i a l i z a r parámetros de
winWidth
proyección
newHeight);
(GL_PROJECTION);
glLoadldentity gluOrtho2D
de
newWidth,
0.0,
tamaño d e
GLdouble la ventana
{newHeight)); de v i s u a l i z a c i ó n .
*/
newWidth; =
newHeight;
} /*
Mostrar un cuadrado r o j o con un
void
fillSquare
{GLint b u t t o n ,
GLint
tamaño s e l e c c i o n a d o d e action,
GLint
xMouse,
arista. GLint
*/
yMouse)
{ GLint /*
xl,
yl,
Usar
*
la
x2,
botón
y2;
izquierdo
esquina
inferior
del
ratón
izquierda
para del
s e l e c c i o n a r una
p o s i c i ó n para
cuadrado.
*/ if
(button
== GtiUT_LEFT_BUTTON &&
action
==
GLUT_D0WN)
{ xl
-
xMouse;
yl
=
winHeight
-
yMouse;
x2
-
xl
+
edgeLength;
y2
=
yl
+
edgeLength;
glRecti
(xl,
yl,
x2,
y2);
} else if
{button
==
salir. exit glFlush
{
(0); );
QLUT_RIGHT_BUTTON)
//
Utilizar
botón derecho
del
r a t ó n para
11.6 Funciones OpenGL pura dispositivos de entrada interactiva
/*
Utilizar teclas
void enlargeSquare
2,
y 4
3
(GLubyte
para
agrandar
sizeFacto'r,
el
cuadrado.
GLint xMouse,
709
*/
GLint yMouse)
i switch
(sizeFactor)
{ case
'2 ' :
edgeLength
*=
2;
*=
3;
break; 1
case
'3 :
edgeLength break; case
•4 ' :
edgeLength * = 4 ; b r e a k ,default: break
/*
Utilizar
void
t e c l a s de
reduceSquare
función
(GLint
F2
y
F4
reductionKey,
para GLint
los
f a c t o r e s de
xMouse,
GLint
{ switch
(reductionKey)
l case
GLUT_KEY_F2:
edgeLength
/=*
2;
break; case
GLUT_KEY_F3:
edgeLength
/=
4;
break; default: break;
) v o i d main
(int
argc,
char**
argv)
{ glutlnit
(&argc,
argv);
glutlnitDisplayMode
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow init
(
(100,
(winWidth, ("Display
Squares
(displayFcn);
glutReshapeFunc glutMouseFunc
(winReshapeFcn); (fillSquare);
glutKeyboardFunc glutSpecialFunc glutMainLoop
(
(enlargeSquare); (reduceSquare);
) ;
GLUT_RGB);
winHeight);
);
glutDisplayFunc
|
100); of
Various
Sizes");
reducción
yMouse)
1/2
y
1/4.
/
710
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
Funciones GLUT para tabletas gráficas Usualmente, la tableta se acliva solamente cuando el cursor del ratón se encuentra dentro de la ventana de visualización. Entonces, puede registrarse un suceso de botón para la entrada de la tableta gráfica mediante: glutTabletButtonFunc
(tabletFcn) ;
y los argumentos para la función invocada son similares a los del caso del ratón: void tabletFcn (GLint tabletButton, GLint a c t i o n , GLint xTablet, GLint yTablet) Podemos designar un botón de la tableta mediante un identificador entero tal como I, 2, 3. etcétera, y la acción correspondiente al botón se especifica, de nuevo, mediante GLUT_UP O GLUT_DOWN. Los valores devueltos x T a b l e t e y T a b l e t son las coordenadas de la tableta. Podemos determinar el número de botones de la tableta disponibles mediante el comando: glutDeviceGet fGLUT_NCJM_TABLET_BUTTONS) ; l*l movimiento de un cursor o un lápiz en la tableta se procesa mediante la siguiente función: glutTabletMotionFunc
ítabletMotionFcn);
donde la función invocada tiene la forma: void tabletMotionFcn
(GLint xTablet, GLint yTablet)
Los valores devueltos x T a b l e t e y T a b l e t proporcionan las coordenadas sobre la superficie de la tableta.
Funciones GLUT para una spaceball Podemos utiliza la siguiente función para especificar una operación que debe llevarse a cabo cuando se active un botón de la spaceball para una ventana de visualización seleccionada: glutSpaceballButtonFunc
(spaceballFcn);
La función de rctrollamada tiene dos parámetros: void spaceballFcn (GLint spaceballButton, GLint action) Los botones de la spaceball se identifican mediante los mismos valores enteros que para una tableta, y al parámetro a c t i o n se le asigna el valor GLUT_UP o GLUT_DOWN. Podemos determinar el número de botones de la spaceball disponibles mediante una llamada a g l u t D e v i c e G e t utilizando el argumento GLUT_NUM_ SPACEBAL)L__BUTTONS. MI movimiento de traslación de una spaceball cuando el ratón se encuentra en la ventana de visualización se registra mediante la llamada de función: glutSpaceballMotionFunc
(spaceballTranlFcn);
Las distancias de traslación tridimensional se pasan a la función invocada, como por ejemplo: void spaceballTranslFcn
(GLint t x , GLint ty, GLint t-z)
Estes distancias de traslación están normalizadas en el rango comprendido entre —1000 y ÍOOÜ. De forma similar, una rotación de la spaceball se registra mediante: glutSpaceballRotateFunc
(spaceballRotFcn);
Los ángulos de rotación tridimensionales estarán entonces disponibles también para la función de retrollamada: void spaceballRotFcn (GLint thetaX, GLint thetaY, GLint thetaZ)
11.6 Fundones OpenGl. para dispositivos de entrada interactiva
711
Funciones GLUT para cajas de botones La entrada procedente de una caja de bolones se obtiene mediante la siguiente instrucción: glutButtonBoxFunc
(buttonBoxFcn);
La activación de un botón puede pasarse a la función invocada mediante los correspondientes parámetros: void
buttonBoxFcn
{GLint
button,
GLint
action);
Los botones se identifican mediante valores enteros y la acción realizada por el botón se especifica como: GLUT_UP O GLUT_DOWN.
Funciones GLUT para diales La rotación de un dial puede registrarse mediante la siguiente rutina: glutDialsFunc
(dialsFcn);
En este caso, utilizamos la función de retrollamada para identificar el dial y obtener el ángulo de rotación: void
dialsFcn
(GLint
dial,
GLint
degreeValue);
Los diales se designan mediante valores enteros y la rotación del dial se devuelve como un valor entero que especifica los grados.
Operaciones de selección en OpenGL En un programa OpenGL, podemos seleccionar objetos interactivamente apuntando a las posiciones de pantalla. Sin embargo, estas operaciones de selección en OpenGL no son particularmente sencillas. Básicamente, realizamos la selección utilizando una ventana de selección especificada, con el fin de generar un nuevo volumen de visualización. Asignamos identificadores enteros a los objetos de una escena y los identificadores de aquellos objetos que intercepten con el nuevo volumen de visualización se almacenarán en una matriz que actúa como búfer de selección. Así, para utilizar las funciones de selección OpenGL, necesitamos implementar los siguientes procedimientos dentro del programa: •
Crear y visualizar una escena.
•
Seleccionar una posición en pantalla y, dentro de la función de retrollamada del botón, llevar a cabo los siguientes pasos: •
Configurar un búfer de selección.
•
Activar las operaciones de selección (modo de selección).
•
Inicializar una pila de nombres de identificación para los identificadores de los objetos.
•
Guardar la matriz actual de las transformaciones de visualización y geométrica.
•
Especificar una ventana de selección para la entrada del ratón.
•
Asignar identificadores a los objetos y volver a procesar la escena utilizando el nuevo volumen de visualización (la información de selección se almacenará entonces en el búfer de selección).
•
Restaurar la matriz original de transformación de visualización y geométrica.
•
Determinar el número de objetos que se ban seleccionado y volver al modo de representación normal.
•
Procesar la información de selección.
También podemos utilizar una modificación de estos procedimientos para seleccionar objetos sin necesidad de utilizar el ratón para la entrada interactiva. Esto se lleva a cabo especificando los vértices del nuevo volumen de visualización, en lugar de designar una ventana de selección.
712
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
Podemos definir una matriz que aetúe como búfer de selección mediante el comando: glSelectBuffer
(pickBufESize,
pickBuffer);
Kl parámetro p i c k B u f f e r designa una matriz de enteros con p i c k B u f f S i z e elementos. La función g l S e l e c t B u f f e r debe invocarse antes de activar las operaciones OpenGL de selección (modo de selección). Para cada objeto seleccionado mediante una única entrada de selección se registrará la correspondiente información dentro del búfer de selección, en forma de valores enteros. En el búfer de selección pueden almacenarse varios registros de información, dependiendo del tamaño y de la ubicación de la ventana de selección. Cada registro del búfer de selección contiene la información siguiente: (1)
La posición del objeto en la pila, que es el número de idenlilicadores que hay en la pila de nombres, incluyendo la propia posición del objeto seleccionad*).
(2)
La profundidad mínima del objeto seleccionado.
(3)
La profundidad máxima del objeto seleccionado.
(4)
La lista de identificadores contenida en la pila de nombres, desde el primer identilicador (el de la parte inferior) basta el identilicador correspondiente al objeto seleccionado.
Los valores enteros de profundidad almacenados en el búfer de selección son los valores originales, comprendidos en el rango de 0 a 1.0, multiplicados por 2 — 1. Las operaciones de selección OpenGL se activan mediante: 3 2
glRenderMode
(GL_SELECT);
I sto hace que el sistema se configure en modo de selección, lo que significa que se procese la escena a través de la pipeline de visualización, pero el resultado no se almacena en el búfer de imagen. En lugar de ello, se almacena en el búfer de selección un registro de información para cada objeto que hubiera sido visualizado en el modo normal de representación. Además, este comando devuelve el número de objetos seleccionados, que será igual al número de registros de información contenidos en el búfer de selección. Para volver al modo de representación normal (el predeterminado) invocamos la rutina g l R e n d e r M o d e utilizando el argumento GL_RENDER. Una tercera opción es el argumento G L F E E D B A C K , que almacena las coordenadas de los objetos y otras informaciones en un búfer de realimentación sin visualizar los objetos. Este modo de realimentación se utiliza para obtener información acerca de los tipos de las primitivas, los atributos y otros parámetros asociados con los objetos de una escena. Utilizamos la siguiente instrucción para activar la pila de nombres basados en identificadores enteros para las operaciones de selección: glInitNames
(
);
La pila de identificadores está inicialmente vacía y sólo puede utilizarse en el modo de selección. Para almacenar un valor entero sin signo en la pila, podemos invocar la siguiente función: glPushName
(ID) ;
listo coloca el valor del parámetro ID en la parte superior de la pila y empuja el nombre previamente colocado en la primera posición hasta la siguiente posición de la pila. También podemos simplemente sustituir la posición superior de la fila utilizando: g1LoadName
(ID);
pero no podemos emplear este comando para almacenar un valor en una pila vacía. Para eliminar el elemento superior de la pila de identificadores, se utiliza el comando: glPopName
(
);
Para definir una ventana de selección dentro de un visor especificado se utiliza la siguiente función (¡LU:
I l.fi Funciones OpenCi para dispositivos de entrado interactiva gluPickMatrix
íxPick,
yPick,
widthPick,
heightPick,
713
vpArray);
LOS parámetros x P i c k e y P i c k proporcionan la ubicación en coordenadas de pantalla de doble precisión correspondiente al centro de la ventana de selección, siendo esas coordenadas relativas a la esquina interior izquierda del visor. Cuando se introducen estas coordenadas mediante la entrada de ratón, las coordenadas del ratón se especifican de forma relativa a la esquina superior izquierda, por lo que será necesario invertir el valor yMouse de entrada. Los valores de doble precisión para la anchura y la altura de la ventana de selección se especifican mediante los parámetros w i d t h P i c k y h e i g h t P i c k . El parámetro v p A r r a y designa una matriz de enteros que contiene las coordenadas y el tamaño del visor actual. Podemos obtener los parámetros del visor utilizando la función g l G e t i n t e g e r v (Sección 6.4). Esta ventana de selección se utiliza entonces como ventana de recorte para construir un nuevo volumen de visualización para las transformaciones de \ isualización. La información relativa a los objetos que intersecten este nuevo volumen de visualización se almacenará en el búfer de selección. Vamos a ¡lustrar las operaciones de selección OpeníiL en el siguiente programa, que visualiza los tres rectángulos de color que se muestran en la Figura 1 1 . i 5. Para este ejemplo de selección, utilizamos una ventana de selección 5 por 5, proporcionando el centro de la ventana de selección mediante la entrada de ratón. Por tanto, necesitaremos invertir el valor yMouse de entrada utilizando la altura del visor, que es el cuarto elemento de la matriz v p A r r a y . Asignamos al rectángulo rojo el valor II) = 30, al rectángulo azul el identificador ID = l() y al rectángulo verde el identitlcador ID = 20. Dependiendo de la posición de entrada del ratón, podemos no seleccionar ningún rectángulo, seleccionar uno, seleccionar dos o seleccionar los tres a la vez. Los ident i Picadores de los rectángulos se introducen en la pila de identificadores según su orden de color: rojo, azul, verde. Por tanto, cuando procesemos un rectángulo seleccionado, podemos utilizar su identificado!-0 su número de posición dentro de la pila. Por ejemplo, si el número de posición en la pila, que es el primer elemento en el registro de selección, es 2, entonces habremos seleccionado el rectángulo azul y habrá dos idenlillcadores de rectángulo especificados al final del registro. Alternativamente, podríamos utilizar la última entrada del registro, que será el identillcador del objeto seleccionado. En este programa de ejemplo, simplemente enumeramos el contenido del búfer de selección. Los rectángulos están definidos en el plano .vv, de modo que todos los valores de profundidad son 0. En el Ejemplo 11.1 se proporciona una muestra de la salida para una posición de entrada del ratón que se encuentre cerca de la frontera entre los rectángulos rojo y verde. No proporcionamos ningún mecanismo para terminar el programa, por lo que puede procesarse cualquier número de entradas de ratón.
FIGURA 11.15. Los tres rectángulos de color mostrados por el programa de selección de ejemplo.
714 CAPÍ TU LO 11 Métodos interactivos de entrada e interfaces gráficas de usuario
#include
ttinclude
const /*
GLint
pickBuffSize
Establecer
GLsizei void
tamaño
winWidth
init
=
=
32;
inicial
400,
ventana
winHeight
visualización.
=
*/
400;
(void)
{ /*
Especificar
glClearColor
blanco
(1.0,
como
1.0,
color
1.0,
de
la ventana
de v i s u a l i z a c i ó n .
*/
1.0);
I /*
Definir
void
3
rects
if
rectángulos
(mode
glColor3f glRecti
(30);
(1.0, (40,
(mode
identificadores
asociados.
*/
(150,
Rectángulo
azul.
1.0);
260,
260);
GL_SELECT)
glPushName glRecti
rojo.
260);
//
0.0,
130,
=«
glC0lor3f
150,
(10);
(0.0,
(mode
Rectángulo
0.0);
GL_SELECT)
glPushName glRecti
//
0.0,
130,
==
glColor3f
if
sus
GLJ3ELECT)
==
glPushName
if
y
(GLenum mode)
(20);
(0.0,
(40,
40,
//
Rectángulo
1.0,
0.0);
260,
130);
verde.
} /*
Imprimir el
void
contenido del
processPicks
(GLint
búfer
nPicks,
de
s e l e c c i ó n para
GLuint p i c k B u f f e r
[
cada
selección del
ratón.
*/
])
( GLint
j,
k;
GLuint
ObjID,
printf
("
printf
*ptr;
Number o f H
objects picked
»
%d\n"
;
( \n );
ptr
=
pickBuffer;
/*
P r o p o r c i o n a r como s a l i d a
todos
los
elementos
*/ for
(j
nPiaks);
M
<= 0;
objID printf
=
j
< nPicks;
j++)
(
*ptr; ("
Stack p o s i t i o n
=
%d\n",
objID);
en
cada
r e g i s t r o de selección.
11.6 Funciones OpenGL poro dispositivos de entrada interactiva 715
ptr+ + ; printf
("
Min
depth
=
%g,",
float
("
Max
depth
=
%g\n",
(*ptr/0x7fffffff});
ptr+ + ; printf ptr++ printf for
float
(*ptr/0x7fffffff>)/
;
("
Stack
(k «
0;
printf
IDs
k <
í"
are:
objID;
\n"); k+ + )
{
%d ' ' , * p t r ) ;
ptr+*;V
} printf
("\n\n");
}
} void pickRects GLuint
(GLint b u t t o n ,
pickBuffer
GLint
vpArray
if
GLUT_LEFT_BUTTON
l=
GLint xMouse,
GLint
yMouse)
[pickBuffSize] ;
GLint n P i c k s , (button
action,
[4]; ||
action
l=
GLUT_D0WN)
return; glSelectBuffer glRenderMode glInitNames de
(pickBuffSize,
pickBuffer);
(GL_SELECT); (
//
//
) ;
//
Designar
Activar
las
tnicializar
la
el
büfer
de
operaciones pila
de
de
selección. selección.
identificadores
objetos. /*
Guardar
matriz
de
visualización
glMatrixMode
(GL_PROJECTION> ;
glPushMatrix
(
(
/*
parámetros
* una
los
ventana
* utilizando * elemento
de la
de
*/
);
glLoadldentity Obtener
actual.
); para el
selección altura
del
5
por
visor,
visor 5
e
actual.
invertir
que
es
el
Definir el
v a l o r yMouse
de
entrada
cuarto
vpArray.
*/ glGetlntegerv
(GL_VTBWPORT,
gluPickMatrix
(GLdouble 5.0,
gluOrtho2D rects /*
(0.0,
300.0,
(GL_SELECT); Restaurar
glMatrixMode glPopMatrix
//
la matriz
vpArray);
(xMouse), 5.0, 0.0,
í ;
(vpArray
[3]
- yMouse),
300.0);
Procesar
los
rectángulos
de visualización
(GL_PROJECTION); í
GLdouble
vpArray);
en el
original.
*/
modo d e s e l e c c i ó n .
716 CAPITULO 11 Métodos interactivos de entrada e interfaces gráficas de usuario
glFlush /*
(
);
Determinar
*
al
el
modo d e
nPickS
=
número
glRenderMode
processPicks
(nPicks,
glutPostRedisplay
void
displayFcn
glClear rects glFlush
de
objetos
seleccionados
volver
{
(GL_RENDER) ; pickBuffer);
//
Procesar
los
objetos
seleccionados.
) ;
(void)
ÍGL_COLOR_BÜFFER_BIT);
(GL__RENDER) ; (
y
representación normal.
//
Visualizar
los
rectángulos.
);
} v o i d winReshapeFcn
/*
Reinicializar
glViewport
(0,
glMatrixMode
gluOrtho2D
newWidth,
parámetros
0,
newWidth,
de
(
winHeight
v o i d main
y
visor.
*/
300.0,
0.0,
300.0);
(GL_MODELVIEW); tamaño d e
la
newWidth; =
(int
glutlnit
proyección
newHeight);
R e i n i c i a l i z a r parámetros de =
newHeight)
) ;
(0.0,
glMatrixMode
winWidth
GLint
(GL_PROJECTION>;
glLoadldentity
/*
(GLint
newHeight;
argc,
char**
(&argc,
argv)
argv);
g l u t l n i t D i s p l a y M o d e (GLUT__SINGIJE | GLUT__RGB) ; glutlnitWindowPosition glutlnitWindowSize glutCreateWindow
(100,
100) ;
(winWidth, ("Example
winHeight);
Pick
init ( ); glutDisplayFunc
(displayFcn);
glutReshapeFunc
(winReshapeFcn);
glutMouseFunc
glutMainLoop
( p i o k R e c t s ) ,-
(
);
Program");
ventana de v i s u a l i z a c i ó n .
*/
11.7 Funciones de menú OpenGL
717
Ejemplo 11.1 Salida d e ejemplo del p r o c e d i m i e n t o p i c k r e c t s Number o f
objects picked
5
2
Stack p o s i t i o n
5
Min d e p t h
5
Max d e p t h 5
Stack
are:
IDs
0,
1 0
30 Stack p o s i t i o n
5
Min d e p t h 5
Max d e p t h 5
Stack
IDs
30
20
10
0,
3 0
are:
11.7 FUNCIONES DE MENÚ OpenGL Además de las rutinas correspondientes a los dispositivos de entrada, GLUT contiene diversas funciones para añadir menús emergentes simples a los programas. Con estas funciones, podemos especificar y acceder a diversos menús y a sus submenús asociados. Los comandos GLUT de menú se incluyen en el procedimiento main junto con las demás funciones GLUT.
Creación de un menú GLUT Podemos crear un menú emergente mediante la instrucción: glutCreateMenu
(menuFcn);
donde el parámetro menuFcn es el nombre de un procedimiento que haya que invocar cuando se seleccione una entrada del menú. Este procedimiento tiene un argumento, que será el valor entero correspondiente a la posición de una opción seleccionada: void menuFcn (GLint menuItemNumber) El valor entero pasado mediante el parámetro menuItemNumber se utiliza entonces en la función menuFcn para realizar algún tipo de operación. Cuando se crea un menú, se le asocia con la ventana de visualizaron actual. Una vez designada la función de menú que haya que invocar cuando se seleccione un elemento del menú, deberemos especificar las opciones que haya que enumerar dentro del menú. Podemos hacer esto con una serie de instrucciones que indiquen el nombre y la posición de cada opción. Estas instrucciones tienen la forma general: glutAddMenuEntry
(charString,
menuItemNumber);
El parámetro c h a r S t r i n g especifica el texto que hay que visualizar en el menú, mientras que el parámetro menuItemNumber indica la ubicación de dicha entrada dentro del menú. Por ejemplo, las siguientes instrucciones crean un menú con dos opciones: glutCreateMenu
(menuFcn);
718 CAPÍTULO 11 Métodos i ut eroe ti vos de entrado e interfaces gráficas de usuario glutAddMenuEntry
("First
Menú
ítem",
glutAddMenuEntry
( " S e c o n d Menú í t e m " ,
1); 2 ) ;
A continuación, debemos especificar el botón del ratón que hay que utilizar para seleccionar una opción del menú. Esto se realiza mediante: glutAttachMenu
(button);
donde al parámetro b u t t o n se le asigna una de las tres constantes simbólicas GLUT que hacen referencia a los botones izquierdo, central y derecho del ratón. Para ilustrar la creación y utilización de un menú GLUT, el siguiente programa proporciona dos opciones para visualizar el relleno interior de un triángulo. Inicialmente. el triángulo está definido con dos vértices blancos, un vórtice rojo y un color de relleno determinado por la interpolación de los colores de los vértices. Utilizamos la función g l s h a d e M o d e l (Secciones 4.14 y 10.20) para seleccionar un relleno del polígono que puede ser un color homogéneo o una interpolación (representación de Gouraud) de los colores de los vértices. En este programa creamos un menú que nos pennite elegir entre las dos opciones utilizando el botón derecho del ratón, cuando el cursor del ratón se encuentre dentro de la ventana de visualización. Este menú emergente se muestra con la esquina superior izquierda situada en la posición del cursor del ratón, como se ilustra en la Figura 11.16. Las opciones de menú se resaltarán cuando situemos el cursor del ratón sobre ellas. La opción resaltada puede entonces seleccionarse liberando el botón derecho. Si se selecciona la opción «Salid-Color FUI», el triángulo se rellenará con el color especificado para el último vértice (que es el rojo). Al final del procedimiento de visualización del menú, f i l l O p t i o n , incluimos un comando g l u t P o a t R e d i s p l a y (Sección 6.4) para indicar que es necesario redibujar el triángulo cuando se visualice el menú.
«include
GLsizei
winWidth
GLfloat
red
=
=
1.0,
400,
winHeight
green
=
1.0,
=
400;
/'/
blue
=
1.0;
Tamaño //
inicial
Color
ventana visualización.
inicial
del
triángulo:
blanco. GLenum
fillMode
=
GL_SMOOTH;
//
Relleno
inicial
del
polígono:
interpolación
de
colores. void
init
(void)
glClearColor
(0.6,
0.6,
0.6,
1.0);
//
Establecer gris
como
color ventana de
visualización. glMatrixMode gluOrtho2D
(GL_PROJECTION);
(0.0,
300.0,
0.0,
300.0);
} void
fillOption
switch
(GLint
selectedOption)
(selectedOption)
{
case
1:
fillMode
=*
GL_FLAT;
case
2:
fillMode
=
GL_SM00TH;
I glutPoatRedisplay
(
) ;
} void
displayTriangle
(void)
break; break;
//
Representación plana //
de
superficies,
R e p r e s e n t a c i ó n de Gouraud.
11.7 Funciones de menú OpenGL
glClear
{GL_COLOR_BUFFER_BIT);
glShadeModel glColor3f
(fillMode);
(red,
green,
blue);
//
Establecer
método
//
Establecer
color para
de
//
Asignar
r e l l e n o para los
primeros
triángulo. dos v é r t i -
ces . glBegin
(GLJTRIANGLES) ;
glVertex2i
(280,
glVertex2i
(red,
glVertex2i (
glFlush
20);
(160,
glColor3f glEnd
280); 0.0,
(20,
0.0);
rojo
como
color
del
último vértice.
100);
); {
)i
}
void
reshapeFcn
(GLint
newWidth,
GLint
newHeight)
{ glViewport
(0,
glMatrixMode
0,
gluOrtho2D
(
newHeight);
);
(0.0,
displayTriangle (
newWidth,
(GL_PR0JECTI0N);
glLoadldentity
glFlush
GLEloat (
(newWidth),
0.0,
GLfloat
(newHeight));
);
);
) v o i d main
(int
glutlnit
arge,
char
(&argc,
(GLUT_SINGLE
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow (
(200,
|
GLUT_RGB);
200);
(winWidth, ("Menu
winHeight);
Example");
);
glutDisplayFunc glutCreateMenu
/*
**argv)
argv);
glutlnitDisplayMode
iñit
719
(displayTriangle); (fillOption);
//
Crear
menú
glutAddMenuEntry
("Solid-Color
glutAddMenuEntry
("Color-Interpolation
Seleccionar opción de
glutAttachMenu glutReshapeFunc glutMainLoop
(
Fill",
(reshapeFcn); );
1); Fill",
menú u t i l i z a n d o e l
(GLUT_RIGHT_BUTTON);
emergente. 2);
botón derecho del
ratón.
*/
720
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
FIGURA 11.16. Menú OpenGL emergente mostrado por el programa de ejemplo de gestión de menus.
Creación y gestión de múltiples menús GLUT Cuando se crea un menú, se lo asocia con la ventana de visualización actual (Sección 6.4). Podemos crear múltiples menús para una misma ventana de visual i/ación y también crear diferentes menús para las diferentes ventanas. A medida que se crea cada menú, se le asigna un idenlificador entero, comenzando con el valor l para el primer valor creado. El identificado!* entero correspondiente a un menú es devuelto por la rutina g l u t C r e a t e M e n u , y podemos registrar dicho valor mediante una instrucción como la siguiente: menuID
=
glutCreateMenu
(menuFcn);
El menú recién creado se convertirá en el menú actual para la ventana de visualización actual. Para activar un menú en la ventana de visualización actual, se utiliza la instrucción: glutSetMenu
(menuID);
Este menú se convertirá entonces en el menú actual, que emergerá dentro de la ventana de visualización cuando se pulse el botón del ratón que se haya asociado a dicho menú. Podemos eliminar un menú mediante el comando: glutDestroyMenu
(menuID);
Si el menú especificado es el menú actual de una ventana de visualización, entonces dicha ventana no tendrá ningún menú asignado como menú actual, aun cuando existan otros menús. Para obtener el identificador del menú actual de la ventana de visualización actual se utiliza la siguiente función: currentMenuID
=
glutGetMenu
(
);
Se devolverá un valor 0 si no hay ningún menú para esta ventana de visualización o si el menú actual anterior ha sido eliminado mediante la función g l u t D e s t r o y M e n u .
Creación de submenús GLUT Podemos asociar un submenú con un menú creando primero un submenú mediante g l u t C r e a t e M e n u , junto con una lista de subopciones, y luego especificando el submenú como opción adicional dentro del menú prin-
11.7 Funciones de menú OpenGL
721
cipal. Podemos añadir el submenú a la lista de opciones de un menú principal (o de otro submenú) utilizando una secuencia de instrucciones tal como: submenuID = glutCreateMenu glutAddMenuEntry
glutCreateMenu
(submenuFcn);
("First
Submenu
Item"
i);
(menuFcn);
glutAddMenuEntry
glutAddSubMenu
("First Menu
1);
Item",
("Submenú Option",
submenuID);
La función g l u t A d d S u b M e n u puede también utilizarse para añadir el submenú al menú actual. Vamos a ilustrar la creación de un submenú en el siguiente programa. Este programa, que es una modificación del programa anterior de gestión de menús, muestra un submenú que proporciona tres opciones de color (azul, verde y blanco) para los primeros dos vértices del triángulo, lil menú principal se visualizará ahora con tres opciones, y la tercera de ellas incluye un símbolo de flecha para indicar que aparecerá un submenú desplegable cuando se resalte dicha opción, como se muestra en la Figura H . I 7 . Se incluye una función g l u t P o s t R e d i s p l a y tanto al final de la función correspondiente al menú principal, como de la función correspondiente al submenú.
Sotid-Cotor FUI Color-Interpolation Fill Blue Color ft >. Qreen White
FIGURA 11.17. Fl menú emergente principal OpenGL y el correspondiente submenú mostrados por el programa de ejemplo de definición de submenús. «include
GLsizei
winWidth
GLfloat
red
=
=
1.0,
400, green
winHeight =
1.0,
GLenum r e n d e r i n g M o d e = GL__SMOOTH; void
init
(void)
=
400;
blue
=
// 1.0;
Tamaño // //
inicial
Valores Método
de
ventana visualización. color
inicial
de
iniciales. relleno.
CAPÍTULO 11 Métodos interactivos de entrada e interfaces gráficas de usuario
{ glClearColor
(0.6,
0.6,
0.6,
1.0);
//
Establecer
// glMatrixMode gluOrtho2D
void
switch
300.0,
(GLint
0.0,
300.0);
renderingOption)
(renderingOption)
{
1:
renderingMode
~
GL^FLAT;
case
2:
renderingMode
=
GL_SMOOTH;
glutPoBtRedisplay
(
break; break;
) ;
Establecer valores de seleccionada.
void
c o l o r ventana
visualización.
case
Milli /*
como
(GL_PROJECTION); (0.0,
mainMenu
gris
color de
acuerdo con
la opción del
submenu
*/
colorSubMenu
(GLint
colorOption)
{ switch
(colorOption)
case
{
1:
red
=
m
0.0;
green
0.0;
0.0;
green
«•
1.0;
green
•
blue
=
1.0;
1.0;
blue
=
0.0;
1.0;
blue
=
1.0 ;
break ; case 2 : red
•
break ; case 3 : red
=
{ glutPostRedisplay
(
);
) void
displayTriangle
(void)
{ glClear
(GL_COLOR_BUFFER_BIT);
glShadeModel
(renderingMode);
//
// glColor3f
(red,
green,
blue);
//
// glBegin
(280,
20);
glVertex2i
(160,
280);
glColor3f
(1.0,
0.0,
c e .
glVertex2i (
glFlush
}
Establecer dos
método
de
relleno
para
triángulo. el
color
de
los
primeros
vértices.
(GLJTRIANGLES);
glVertex2i
glEnd
Establecer el
) ; (
Í ;
(20,
100);
0.0);
//
Seleccionar
rojo
como
color
del
último
vérti-
11.7 funciones de menú OpenGL
void
reshapeFcn
(GLint
newWidth,
GLínt
723
newHeight)
! glViewport
(0,
glMatrixMode
0,
(
void
main
(
);
(0.0,
displayTriangle glFlush
newHeight);
(GL_PROJECTION);
glLoadldentity gluOrtho2D
newWidth,
GLfloat (
(newWidth),
0.0,
GLfloat
{newHeight});
);
);
tint
argc,
char
**argv)
{ GLint subMenu; glutlnit
//
(&argc,
{GLUT_SINGLE
glütlnitwindowPosition glutlnitWindowSize glutCreateWindow (
submenu,
|
GLUT_RGB);
2 0 0 ) ,-
(winWidth,
winHeight);
Example");
);
=
(displayTriangle)¡
glutCreateMenu
(colorSubMenu);
glutAddMenuEntry
("Blue",
glutAddMenuEntry
("Green",
2);
glutAddMenuEntry
("White",
3) ,-
glutCreateMenu
(mainMenu);
1);
//
C r e a r menú
glutAddMenuEntry
("Solid-Color
glutAddMenuEntry
("Color-Interpolation
glutAddSubMenu /*
(200,
("Submenu
glutDisplayFunc subMenu
el
argv);
glutlnitDisplayMode
init
i d e n t i f i c a d o r para
("Color",
Fill",
glutReshapeFunc glutMainLoop
{
emergente.
1); Fill",
2).,-
subMenu);
S e l e c c i o n a r o p c i ó n d e l menú c o n e l
glutAttachMenu
principal
botón derecho del
ratón.
*/
(GLUT_RIGHT_BUTTON); (reshapeFcn); ) ;
Modificación de los menús GLUT Si queremos cambiar el botón del ratón utilizado para seleccionar una opción del menú, primero tenemos que cancelar la asociación actual de botón y luego asociar el botón nuevo. Podemos cancelar una asociación de botón para el menú actual mediante: glutDetachMenu
(mouseButton);
724
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
Al parámetro m o u s e B u t t o n se le asigna la constante GLUT que identifique el botón izquierdo, derecho o central que hubiera sido previamente asociado con el menú. También pueden modificarse las opciones definidas dentro de un menú existente. Por ejemplo, podemos borrar una opción del menú actual mediante la función: glucRemoveMenuItem
(itemNumber);
donde al parámetro i t e m N u m b e r se le asigne el valor entero de la opción de menú que haya que borrar, Otras rutinas GLUT nos permiten modificar los nombres o el estado de los elementos de un menú existente. Por ejemplo, podemos utilizar estas rutinas para cambiar el nombre con el que se visualiza una opción de menú, para cambiar el número de elemento asignado a la opción o para transformar una opción en un submenú.
11.8 DISEÑO DE UNA INTERFAZ GRÁFICA DE USUARIO Casi todas las aplicaciones software suelen incluir hoy en día una interfaz gráfica, compuesta por ventanas de visualización, iconos, menús y otras características que sirven para ayudar al usuario a aplicar el software a un problema concreto. Se incluyen diálogos interactivos especializados para que las opciones de programación puedan seleccionarse utilizando términos familiares dentro de un determinado campo, como por ejemplo el diseño arquitectónico y de ingeniería, el dibujo, los gráficos empresariales, la geología, la economía, la química o la física. Otras consideraciones que suelen tenerse en cuenta al diseñar una interfaz de usuario son la adaptación a los diversos niveles de experiencia de los usuarios, la coherencia, el tratamiento de errores y la realimentación. s
El diálogo con el usuario Ln cualquier aplicación, el modelo de usuario sirve como base para el diseño del procedimiento de diálogo en que se basa la aplicación, escribiéndose qué es lo que el sistema debe hacer y qué operaciones hay disponibles. Lse modelo indica el tipo de los objetos que pueden mostrarse y la manera en que se los puede manipular. Por ejemplo, si el sistema va a ser usado como herramienta para el diseño arquitectónico, el modelo describe cómo puede utilizarse el paquete software para construir y visualizar vistas de edificios posicionando las paredes, las puertas, las ventanas y otros componentes. Un paquete de diseño de interiores podría incluir un conjunto de tipos de muebles, junto con las operaciones para colocar y eliminar diferentes objetos en un determinado plano de una vivienda. Y un programa de diseño de circuitos proporciona símbolos eléctricos o lógicos y las operaciones de colocación necesarias para añadir o borrar elementos de un diagrama. Toda la información del procedimiento de diálogo con el usuario se presenta en el lenguaje de la aplicación. En un paquete de diseño arquitectónico, esto quiere decir que todas las interacciones se describirán exclusivamente en términos arquitectónicos, sin hacer referencia a estructuras de datos concretas, a témiinos de infografía o a otros conceptos que puedan no resultar familiares para un arquitecto.
Ventanas e iconos La Figura 11.18 muestra ejemplos de interfaces gráficas típicas. Se utilizan representaciones visuales tanto para los objetos que hay que manipular en la aplicación como para las acciones que hay que realizar sobre los objetos de la aplicación. Además de las operaciones estándar de gestión de las ventanas de visualización, como son las de apertura, cierre, posicionamicnto y cambio de tamaño, también hacen falta otras operaciones para trabajar con los deslizadores, botones, iconos y menús. Algunos sistemas pueden soportar múltiples gestores de ventanas con el fin de utilizar diferentes estilos de ventana, cada uno con su propio gestor, que podrían estar estructurados de forma especial para una aplicación concreta.
11.8 Diseño de una interfaz gráfica de usuario
1 Si
725
1 3 »
oca ra (a)
(b)
FIGURA 11.18. Ejemplos de disposiciones de pantalla que utilizan ventanas de visualización, menus e iconos. (Cortesía de (a) Intergraph Corporation; (b) Visual Numerics, Inc.; (c) Sun Microsystems.) Los iconos que representan objetos tales como paredes, puertas, ventanas y elementos de circuito se suelen denominar iconos de aplicación. Los iconos que representan acciones, como por ejemplo rotar, magnificar, cambiar de escala, recortar o pegar, se denominan iconos de control o iconos de comando.
Adaptación a los distintos niveles de experiencia Usualmente, las interfaces gráficas interactivas proporcionan diversos métodos para la selección de acciones. Por ejemplo, podría especificarse una opción apuntando a un icono, accediendo a un menú desplegable o emergente o escribiendo un comando en el teclado. Esto permite que el paquete sea utilizado por usuarios con distintos niveles de experiencia. Para los usuarios menos experimentados, una interfaz con unas pocas operaciones fácilmente comprensibles y con mensajes informativos detallados resulta más efectiva que otra con un conjunto de operaciones grande y exhaustivo. Un conjunto simplificado de menús y de opciones es fácil de aprender y de recordar y el usuario puede concentrarse en la aplicación en lugar de hacerlo en los detalles de la interfaz. Las operaciones simples de tipo apuntar y hacer clic son a menudo las más sencillas para los usuarios poco experimentados de un paquete de aplicación. Por tanto, las interfaces suelen proporcionar algún tipo de mecanismo para enmascarar la complejidad del paquete software, de modo que los principiantes puedan utilizar el sistema sin verse abrumados por un exceso de detalles. Los usuarios experimentados, por el contrario, lo que normalmente desean es velocidad. Esto significa menos mensajes indicativos y más entrada desde el teclado o mediante múltiples clics de los botones del ratón. Las acciones se seleccionan mediante teclas de función o mediante la combinación simultánea de varias teclas normales, ya que los usuarios experimentados son capaces de recordar estos atajos utilizados para acceder a las acciones más comunes.
726
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
De forma similar, las facilidades de ayuda pueden diseñarse con distintos niveles de modo que los principiantes puedan embarcarse en un diálogo detallado, mientras que los usuarios más experimentados pueden reducir o eliminar los mensajes indicativos. Las facilidades de ayuda también pueden incluir una o más aplicaciones de ejemplo, que proporcionen a los usuarios una introducción a las capacidades y ai modo de utilización del sistema.
Coherencia Una consideración de diseño importante en una interfaz es la coherencia. Una cierta forma de icono debe tener siempre el mismo significado, en lugar de utilizarse para representar diferentes acciones u objetos dependiendo del contexto. Otros ejemplos de coherencia que podríamos citar son colocar los menus en las mismas posiciones relativas, de modo que el usuario no tenga que andar buscando una opción concreta; utilizar siempre la misma combinación de teclas para una acción y emplear siempre la misma codificación de color, de modo que un cierto color no tenga diferentes significados en las distintas situaciones.
Minimization de la memorización Las operaciones de la interfaz deben estar también estructuradas de modo que sean fáciles de comprender y de recordar. Los formatos de comando extraños, complicados, incoherentes y abreviados conducen a la confusión y a una reducción en las capacidades de aplicar el software de manera efectiva. Por ejemplo, una tecla o botón utilizados para todas las operaciones de borrado son más fáciles de recordar que un conjunto de diferentes teclas que se empleen para diferentes tipos de procedimientos de borrado. Los iconos y sistemas de ventana también pueden organizarse para reducir las necesidades de memorización. Los diferentes tipos de información pueden separarse en diferentes ventanas, de modo que el usuario pueda identificar y seleccionar fácilmente los elementos. Los iconos deben diseñarse de manera que sus formas sean fácilmente reconocibles y estén relacionadas con los objetos y acciones de la aplicación. Para seleccionar una acción concreta, el usuario debe poder seleccionar el icono que «recuerde» a esa acción.
Cancelación de acciones y tratamiento de errores Otra característica común de las interfaces es algún tipo de mecanismo para deshacer una secuencia de operaciones, lo que permite al usuario explorar las capacidades del sistema, sabiendo que los efectos de un error pueden corregirse. Normalmente, los sistemas pueden hoy en día deshacer varias operaciones, permitiendo así al usuario reinicializar el sistema en alguna acción especificada. Para aquellas acciones que no pueden deshacerse, como por ejemplo cerrar una aplicación sin guardar los cambios, el sistema suele pedir al usuario que confirme la operación solicitada. Además, unos adecuados mensajes de diagnóstico y de error ayudan al usuario a determinar la causa de los errores. Las interfaces pueden tratar de minimizar los errores anticipando ciertas acciones que pudieran conducir a un error, y puede proporcionarse una advertencia a los usuarios si están solicitando acciones ambiguas o incorrectas, como por ejemplo tratar de aplicar un procedimiento a múltiples objetos de aplicación.
Realimentación Otra característica importante de las interfaces es que deben responder a las acciones de los usuarios, particularmente en el caso de los usuarios no experimentados. A medida que se introduce cada acción, debería darse algún tipo de respuesta. En caso contrario, el usuario puede comenzar a preguntarse qué es lo que el sistema está haciendo y si debe volver a introducir los datos. La realimentación puede proporcionarse de muchas formas, como por ejemplo resaltando un objeto, mostrando un icono o un mensaje o visualizando una opción de menú seleccionada en un color distinto. Cuando el procesamiento de una acción solicitada sea largo, la visualización de un mensaje parpadeante, de un reloj,
j
II»
Resumen
727
de un reloj de arena o de algún otro indicador de progreso tiene una importancia crucial. También puede ser posible que el sistema muestre resultados parciales a medida que se completan, de modo que la imagen final se construye de elemento en elemento. El sistema podría también permitir a los usuarios introducir otros comandos u otros datos mientras se está procesando una instrucción. Se utilizan diseños estándar de ciertos símbolos para determinados tipos de realimentación. Para indicar un error, se utiliza a menudo un aspa, una cara con las cejas fruncidas o un puño con el pulgar hacia abajo, mientras que para indicar que se está procesando una acción suele empicarse algún lipo de símbolo relacionado con el tiempo o alguna señal parpadeante que indique que el sistema «está trabajando». Este tipo de realimentación puede ser muy efectiva con un usuario experto, pero es posible que los principiantes necesiien una realimentación más detallada que no sólo indique claramente qué es lo que el sistema está haciendo, sino también lo que el usuario debe introducir a continuación. La claridad es otro aspecto de gran importancia en la realimentación. Las respuestas deben ser claramente comprensibles, pero no tan detalladas que interrumpan la concentración del usuario. Con las teclas de función, la realimentación puede proporcionarse en forma de un clic audible o iluminando la tecla que ha sido pulsada. La realimenlación sonora tiene la ventaja de que no ocupa espacio de pantalla y no distrae la atención del usuario del área de trabajo. También puede utilizarse un área de mensajes lija, de modo que el usuario siempre sepa dónde buscar los mensajes, aunque en otras ocasiones pueden que sea ventajoso colocar los mensajes de realimenlación en el área de trabajo, cerca del cursor. Los mensajes de realimenlación pueden también mostrarse en diferentes colores, para distinguirlos de los restantes objetos visualizados. La realimenlación de eco resulta útil en muchas ocasiones, particularmente para la entrada desde teclado, de modo que puedan detectarse rápidamente los errores. Las entradas de bolones y diales pueden proporcionarse de la misma como eco. Los valores escalares seleccionados con diales o con reguladores virtuales (representados en pantalla) suelen mostrarse como eco en la pantalla para que el usuario pueda comprobar la precisión de los valores introducidos. La selección de puntos de coordenadas puede también proporcionarse como eco mediante un cursor o un símbolo que aparezca en la posición seleccionada. Para proporcionar un eco más preciso de las posiciones seleccionadas, los valores de las coordenadas podrían también mostrarse en la pantalla.
11.9 RESUMEN La entrada de los programas gráficos puede provenir de muchos tipos distintos de dispositivos hardware, pudiendo haber más de un dispositivo proporcionando la misma clase general de datos de entrada. Las funciones de entrada de los paquetes gráficos se suelen diseñar para que sean independientes del hardware, adoptando una clasificación lógica de los dispositivos de entrada. Entonces, los dispositivos se especifican tic acuerdo con el tipo de entrada gráfica. Los seis tipos de dispositivos lógicos utilizados en los estándares ISO y ANSII son los dispositivos localizadores, de trazado, de cadena, evaluadores, de elección y de selección. Los dispositivos localizadores introducen una única posición de coordenadas. Los dispositivos de trazado proporcionan como entrada un flujo de coordenadas. Los dispositivos de cadena proporcionan como entrada cadenas de texto. Los dispositivos evaluadores se utilizan para introducir valores escalares. Los dispositivos de elección se utilizan para elegir opciones de menú. Por su parte, los dispositivos selectores permiten seleccionar componentes de la escena. Los paquetes gráficos independientes de los dispositivos incluyen un conjunto limitado de funciones de entrada que se definen en una biblioteca auxiliar. Para las funciones de entrada se utilizan comúnmente tres modos distintos. El modo de solicitud coloca la entrada bajo control del programa de aplicación. El modo de muestren permite que los dispositivos de entrada y el programa operen concurrentemenle. El modo de sucesos permite que los dispositivos de entrada inicien la introducción de datos y controlen el procesamiento de los mismos. Una vez elegido un modo para una clase de dispositivo lógico y el dispositivo físico concreto que hay que utilizar para introducir dicha clase de dalos, se utilizan las funciones de entrada para introducir los valores de ios datos dentro del programa. Un pro-
728
CAPÍTULO 11
Métodos interactivos de entrada e interfaces gráficas de usuario
grama de aplicación puede introducir simultáneamente varios dispositivos de entrada físicos que operen en diferentes modos. Los métodos interactivos de construcción de imágenes se utilizan comúnmente en diversas aplicaciones, incluyendo los paquetes de diseño y de dibujo. Estos métodos proporcionan a los usuarios la capacidad de especificar las posiciones de los objetos, restringir los objetos para que adopten orientaciones o alineaciones predefinidas y dibujar o pintar interactivamente objetos en una escena. Se utilizan métodos tales como las cuadrículas, los campos de gravedad y los métodos de banda elástica corno ayuda durante el posicionamiento y durante la realización de otras operaciones de generación de imágenes. Las interfaces gráficas de usuario son ahora una característica estándar de las aplicaciones software. El software se basa en un procedimiento de diálogo diseñado a partir del modelo del usuario, que describe el propósito y la función del paquete de aplicación. Todos los elementos de ese procedimiento de diálogo se presentan en el lenguaje de la aplicación. Los sistemas de ventanas proporcionan una interlaz típica, con procedimientos para manipular las ventanas de visualización, los menús y los iconos. Pueden diseñarse sistemas de gestión de ventanas generales que soporten múltiples gestores de ventanas. Las principales preocupaciones a la hora de diseñar un procedimiento de diálogo con el usuario son la facilidad de uso, la claridad y la flexibilidad. Específicamente, las interfaces gráficas se diseñan tratando de mantener la coherencia en las interacciones con el usuario y de adaptarse a los diferentes niveles de experiencia de los distintos usuarios. Además, las interfaces se diseñan para tratar de reducir los esfuerzos de memorización por parte del usuario, para proporcionar una realimentación suficiente y para proporcionar unas capacidades adecuadas de cancelación de acciones y de tratamiento de errores. En GLUT (Utility Toolkil), hay disponibles funciones de entrada para dispositivos interactivos tales como ratones, tabletas, spaceballs, cajas de botones y cajas de diales. Además, GLUT proporciona una función para aceptar una combinación de valores de entrada procedentes de un ratón y un teclado. Las operaciones de selección pueden realizarse utilizando funciones de la biblioteca GLU y de la biblioteca básica OpenGL. También podemos mostrar menús emergentes y submenús utilizando un conjunto de funciones de la biblioteca GLUT. En las Tablas 11.1 y 1 1 . 2 se proporciona un resumen de las funciones de entrada y de menús de OpenGL. TABLA 11,1. RESUMEN DE FUNCIONES DE ENTRADA 0p< Función
Descripción
glutMouseFunc
Especifica una función de retrollamada para el ratón que será invocada cuando se pulse un botón del ratón.
glutMotionFunc
Especifica una función de retrollamada para el ratón que será invocada cuando se mueva el cursor del ratón mientras está pulsado un botón.
glutPassiveMotionFunc
Especifica una riinción de retrollamada para el ratón que será invocada cuando se mueva el cursor del ratón sin presionar un botón.
g 1 u t K e y b o a r d Func
Especifica una función de retrollamada para el teclado que será invocada cuando se pulse una tecla estándar.
glutSpecialFunc
Especifica una función de retrollamada para el teclado que será invocada cuando se pulse una tecla de propósito especial (por ejemplo, una tecla de función).
glutTablecBuctonFunc
Especifica una función de retrollamada para una tableta que será invocada cuando se pulse un bolón de la table mientras el cursor del ratón se encuentra en una ventana de visualización. Continúa
11.9 Resumen
TABLA 11.1.
729
RESUMEN DE FUNCIONES DE ENTRADA OpenGL, (Cont.)
Función
Descripción
glutTabletMotionFunc
Especifica una función de reirollamada para una tableta que será invocada c u a n d o se mueva el cursor o el lápiz de la tableta mientras el cursor del ratón se encuentra en una ventana de visualización.
glutSpaceballButtoxiFunc
Especifica una función de retrollamada para una spaceball que será invocada c u a n d o se pulse un botón de la spaceball mientras el cursor del ratón se encuentra en una ventana de visualización, o bien utilizando algún otro m é t o d o de activación de ventanas de visualización.
glutSpaceballMotionFunc
F.spccillca una función de retrollamada para una
spaceball que será invocada spaceball para una
c u a n d o se produzca un m o v i m i e n t o de traslación de la ventana de visualización activada. glutSpaceballRotateFunc
Especifica una función de retrollamada para una c u a n d o s e produzca un m o v i m i e n t o giratorio de
spaceball que será invocada la spaceball para una venta-
na de visualización activada. glutButtonBoxFunc
Especifica una función de retrollamada para cajas de botones que será invocada cuando se pulse un botón.
glutDialsFunc
Especifica una función de retrollamada para un dial que será invocada cuando se gire un dial.
glSelectBuffer
Especifica el tamaño y el nombre del búfer de selección.
glRenderMode
Activa las operaciones de selección utilizando el argumento G L _ S E L E C T . Esta función también se utiliza para activar el m o d o de representación normal o el m o d o de realimentación.
glInitNames
A c t i v a la pila de nombres idcntificadores de los objetos.
glPushName
Introduce un identillcador de un objeto en la pila de identificadores.
giLóadName
Sustituye el identillcador situado en la parte superior de la pila por otro valor especificado.
glPopName
Elimina el elemento superior de la pila de identificadores.
gluPickMatrix
Define una ventana de selección y construye un nuevo volumen de visualiz a c i ó n para las operaciones de s e l e c c i ó n .
Función glutcreateMenu
Descripción £
r e a
u n
m
c
n
u
emergente y especifica e l procedimiento que habrá que invocar cuan-
do se s e l e c c i o n e un elemento del menú; se asigna un identillcador entero al menú creado. glutAddMenuEntry
Especifica una opción que hay que incluir en un menú emergente.
glutAttachMenu
Especifica el botón del ratón que se utilizará para seleccionar las opciones de menú.
Continúa
730
CAPÍTULO 11
TABLA 11.2.
Métodos interactivos de entrada e interfaces gráficas de usuario
RESUMEN DE FUNCIONES DE MENÚ OpenGL {Cont.)
" lÉÉ
Función
Descripción
glutSetMenu
Especifica el menú actual para la ventana de visuali/aeión actual.
glutDestroyMenu
Especifica el identificador de un menú que se quiere eliminar.
glutGetMenu
Devuelve el identificador del menú actual asociado a la ventana actual.
glutAddSubMemí
Rspecilica un submenú que hay que incluir en otro menú, debiendo haberse definido el submenú indicado mediante la ruina glutCreateMenu.
glutDetaehMenu
Cancela la asociación especificada de botón de ratón para el menú actual.
glutRemoveMenuItem
Borra una opción especificada en el menú actual.
REFERENCIAS La evolución del concepto de los dispositivos de entrada lógicos (o virtuales) se analiza en Wallace (1076) y en Rosenthal, Micbener, Pfaff, Kessener y Sabin (1982). Puede encontrar implemcntaciones para diversos procedimientos de entrada en Glassner (1990), Arvo (1991), Kirk (1992), Heckbert (1994) y Paeth (1995). También puede encontrar ejemplos tradicionales de programación utilizando la entrada de ratón y de teclado en Woo, Neider, Davis y Shreiner (1999). Para ver una lista completa de funciones de la biblioteca básica OpenGL y de la biblioteca GLU, consulte Shreiner (2000). Las funciones de entrada y de menús de GLUT se tratan con detalle en Kilgard (1996). Puede encontrar directrices para el diseño de interfaces de usuario en Shneiderman (1986), Apple (1987), Bleser (1988), Brown y Cunningham (1989), Digital (1989), OSE/MOT1E (1989) y Laurel (1990). Para obtener información sobre el sistema XWindow, consulte Young (1990) y Culler, Gilly y Reilly (1992).
EJERCICIOS 11.1
Diseñe un algoritmo que permita situar objetos en la pantalla utilizando un dispositivo localizador. May que presentar un menú de objetos con fonnas geométricas al usuario, el cual seleccionará un objeto y la posición donde hay que colocarlo. El programa debe permitir la colocación de un número arbitrario de objetos, hasta que se proporcione una señal de «terminación».
11.2
Amplíe el algoritmo del ejercicio anterior para poder cambiar la escala de los objetos y girarlos antes de colocarlos. Las opciones de transformación y los parámetros de transformación deben presentarse al usuario como opciones de menú.
I \ .3
Detina un procedimiento para dibujar interactivamente objetos utilizando un dispositivo de trazado.
11.4
Explique los métodos que podrían emplearse en un procedimiento de reconocimiento de patrones para hacer corresponder los caracteres de entrada con una biblioteca almacenada de formas.
11.5
Escriba una rutina que muestre una escala lineal y un deslizador en la pantalla y que permita seleccionar valores numéricos posicionando el deslizador a lo largo de la escala. Debe proporcionarse como eco el valor numérico seleccionado, dentro de un recuadro que se muestre cerca de la escala lineal.
11.6
Escriba una rutina que muestre una escala circular y un puntero o un deslizador que puedan moverse por el círculo con el fin de seleccionar ángulos (en grados). Debe proporcionarse como eco el valor angular seleccionado, dentro de un recuadro que se muestre cerca de la escala circular.
Ejercicios
731
11.7
Escriba un programa de dibujo que permita a los usuarios crear una imagen mediante un conjunto de segmentos lineales dibujados entre puntos especificados. Las coordenadas de los segmentos de linea individuales se seleccionarán mediante un dispositivo localizador.
11.8
Escriba un programa de dibujo que permita crear imágenes mediante segmentos de linea recta dibujados entre puntos especificados. Defina un campo de gravedad alrededor de cada línea de la imagen, como ayuda para conectar las nuevas lincas con las líneas existentes.
11.9
Modifique el programa de dibujo del ejercicio anterior para poder restringir las líneas horizontal o verticalmente.
11.10 Escriba un programa de dibujo que pueda mostrar un patrón de cuadrícula opcional, de modo que las posiciones de pantalla seleccionadas se ajusten para que coincidan con intersecciones de la cuadrícula. El programa debe proporcionar capacidades de dibujo de líneas, seleccionándose los extremos de las líneas mediante un dispositivo localizador. lili
Escriba una rutina que permita al diseñador crear una imagen dibujando lincas rectas mediante un método de banda elástica.
11.12
Diseñe un programa de dibujo que permita construir líneas rectas, rectángulos y círculos utilizando métodos de banda elástica.
11.13 Escriba un procedimiento que permita al usuario seleccionar componentes de una escena bidimensional. Las extensiones de coordenadas de cada objeto deben almacenarse y utilizarse para identificar el objeto seleccionado a partir de la posición del cursor suministrada como entrada. 11.14
Desarrolle un procedimiento que permita al usuario diseñar una imagen a partir de un menú de formas básicas visualizadas, arrastrando cada forma seleccionada hasta su posición de destino mediante un dispositivo de selección.
11.15 Diseñe una implementación de las funciones de entrada para el modo de solicinid. 11.16 Diseñe una implementación de las funciones de entrada para el modo de muestreo. 11.17 Diseñe una implementación de las funciones de entrada para el modo de sucesos. 11.1X
Diseñe un procedimiento para implemenlar funciones de entrada para los modos de solicitud, muestreo y sucesos.
Il.lv
Amplíe el programa OpenGL de dibujo de puntos de la Sección 11.6 para incluir un menú que permita al usuario seleccionar el tamaño del punto y el color del punto.
11.20 Amplíe el programa OpenGL de polilineas de la Sección 11.6 para incluir un menú que permita al usuario seleccionar los atributos de la línea: tamaño, color y anchura. 11.21
Modifique el programa del ejercicio anterior para que se pueda elegir un patrón de textura para la polilínea,
11.22 Escriba un programa OpenGL interactivo para mostrar un rectángulo de 100 por 100 píxeles en cualquier posición que se suministre como entrada, dentro de una ventana de visualización. La posición de entrada será el centro del rectángulo. Incluya un menú de opciones de color para mostrar el rectángulo con un color homogéneo. 11.23 Modifique el programa del ejercicio anterior de modo que se rechace la posición de entrada si no se puede mostrar todo el rectángulo dentro de la ventana de visualización. 11.24 Modifique el programa del ejercicio anterior para incluir un menú de opciones de textura para el rectángulo. Utilice como mínimo dos patrones de textura. 11.25 Diseñe un programa OpenGL interactivo para mostrar una cadena de caracteres de entrada en cualquier posición dentro de una ventana de visualización. La posición de entrada será la posición de inicio del texto, 11.26 Escriba un programa OpenGL interactivo para posicionar un único objeto bidimensional en cualquier posición dentro de una ventana de visualización. El objeto se seleccionará de entre un menú de formas básicas, que deberá incluir (como mínimo) un cuadrado, un círculo y un triángulo. 11.27 Modifique el programa del ejercicio anterior para permitir que se visualice cualquier composición de los anteriores objetos bidimensionales, seleccionándose cada objeto del menú hasta que se elija la opción de menú que permita abandonar el programa.
732 CAPÍTULO 11 Métodos interactivos de entrada e interfaces gráficas de usuario 11-28
Modifique el programa del ejercicio anterior para permitir cambiar la escala de los objetos o girarlos. Las operaciones de transformación geométrica deberán enumerarse en un menú.
11.29 Escriba un programa OpenGL interactivo para posicionar un único objeto tridimensional dentro de una ventana de visualización. E] objeto se seleccionará en un menú de sólidos GLUT alámbricos, compuesto por ejemplo de una esfera, un cubo y un cilindro, y deberá estar centrado el objeto en la posición que se indique como entrada. 11.30 Modifique el programa del ejercicio anterior para poder visualizar los objetos en modo sólido o alámbrico. Para la visualización de objetos sólidos, incluya una fuente de luz puntual en la posición de visualización y utilice los parámetros predeterminados de iluminación y de sombreado superficial. 11.31
Escriba un programa para implementar las operaciones de selección OpenGL para una escena tridimensional que contenga varios objetos. Para cada selección, cree una pequeña ventana de selección y traiga al frente el objeto más distante contenido dentro de dicha ventana de selección.
11.32 Escriba un programa OpenGL interactivo para mostrar una curva de líézier cúbica bidimensional. Las posiciones de los cuatro puntos de control se seleccionarán mediante el ratón. 11.33 Modifique el programa del ejercicio anterior para mostrar una curva de Bézier cuyo grado será seleccionable, pudiendo ser de grado tres, cuatro o cinco. 11.34
Escriba un programa OpenGL interactivo para mostrar una B-spline cúbica bidimensional. Los parámetros de la spiine se proporcionarán como entrada y los puntos de control se seleccionarán con el ratón.
11.35
Escriba un programa OpenGL interactivo para mostrar un parche superficial cúbico de Bézier. Las coordenadas x ey de los puntos de control podrán seleccionarse con el ratón y la coordenada z puede proporcionarse como una altura por encima de un plano de tierra.
11.36 Seleccione alguna aplicación gráfica con la que esté familiarizado y defina un modelo de usuario que pueda servir como base para el diseño de una interfaz de usuario para las aplicaciones gráficas utilizadas en dicha área. 11.37
Enumere las posibles facilidades de ayuda que pueden proporcionarse en una interfaz de usuario y explique que tipos de ayuda son más apropiados para los distintos niveles de experiencia de los usuarios.
11.38 Resuma los métodos utilizados para el tratamiento de errores y para la cancelación de operaciones. ¿Qué métodos son adecuados para un principiante? ¿Qué métodos son mejores para un usuario experimentado? 11.39 Enumere los posibles formatos de presentación de meniis a un usuario y explique en qué circunstancias puede ser apropiado para cada uno 11.40 Explique las alternativas de realimentación existentes en relación con los diversos niveles de experiencia de los usuarios. 11.41
Enumere las funciones que debe proporcionar un gestor de ventanas para gestionar la disposición de pantalla cuando existen múltiples ventanas solapadas.
11.42
Diseñe un paquete de gestión de ventanas.
11.43 Diseñe una interfaz de usuario para un programa de dibujo. 11.44 Diseñe una interfaz de usuario para un paquete de modelado jerárquico de dos niveles.
À
Modelos y aplicaciones del color
Una escena de llores generada por computadora, modelada con diversas combinaciones de color y una forma básica de pétalo. (Cortesía de Przemyslaw Pntsinkiemcz, Universiíy of Catgary. M ¡987.)
12.1
Propiedades de la luz
12.6
Eos modelos de color CMY y CMYK
12.2
Modelos de color
12.7
El modelo de color IISV
12.3
Primarios estándar y diagrama cromático
12.8
El modelo de color HLS
12.4
III modelo de color RGB
12.9
Selección y aplicaciones del color
12.5
El modelo de color YIQ y los modelos relacionados
12.10 Resumen
Nuestras explicaciones sobre el color hasta este momento se han concentrado en el modelo de color RGB, que es el que se utiliza para generar las imágenes en los monitores de vídeo. Hay varios otros modelos de color que también son útiles en las aplicaciones infográficas. Algunos de los modelos se utilizan para describir la salida de color a través de impresoras y trazadoras gráficas. Otros se emplean para transmitir y almacenar información de color y otros, en fin, se usan para proporcionar a los programas una interfaz más intuitiva para el manejo de los parámetros de color.
12.1
P R O P I E D A D E S DE LA LUZ
Como hemos indicado en los capítulos anteriores, la luz exhibe muchas características distintas y podemos describir las propiedades de la luz en diferentes formas en diferentes contextos. Físicamente, podemos caracterizar la luz como energía radiante, pero también necesitamos otros conceptos si queremos describir nuestra percepción de la luz.
El espectro electromagnético En términos físicos, el colores una radiación electromagnética dentro de una estrecha banda de frecuencias. Algunos de los otros grupos de frecuencias del espectro electromagnético son los de las ondas de radio, las microondas, las ondas infrarrojas y los rayos X. La Figura 12.1 muestra los rangos de frecuencia aproximados para estos distintos tipos de radiación electromagnética. Cada valor de frecuencia dentro de la región visible del espectro electromagnético se corresponde con un color espectral distinto. En el extremo de baja frecuencia (aproximadamente 3.8 X 1 0 hercios) se encuentran los colores rojos, mientras que en el extremo de alta frecuencia (aproximadamente 7.9 x 1 0 hercios) encontramos los colores violetas. En la realidad, el ojo humano también es sensible a algunas frecuencias de las bandas infrarroja y ultravioleta. Los colores espectrales van variando desde las tonalidades de rojo, a través del naranja y el amarillo (en el extremo de baja frecuencia), pasando luego por el verde, el ayul y el violeta (en el extremo alto). En el modelo ondulatorio de la radiación electromagnética, la luz puede describirse como un campo electromagnético que oscila de manera transversal y se propaga a través del espacio. Los campos eléctricos y magnéticos oscilan en direcciones perpendiculares entre sí y á la dirección de propagación. Para cada color espectral, la frecuencia de oscilación de la magnitud del campo está dada por la frecuencia/ La Figura 2.2 ilustra las oscilaciones variables en el tiempo de la magnitud del campo eléctrico dentro de un plano. El tiempo entre dos posiciones consecutivas de la onda que tienen la misma amplitud se denomina período T — \/f de la onda. Y la distancia que la onda viaja entre el comienzo de una oscilación y el comienzo de la siguiente se denomina longitud de onda A. Para un color espectral (una onda monocromática), la longitud de onda y 14
14
736
CAPÍTULO 12
Modelos y aplicaciones de! color
i
X
I
I
cid
3
*i i-
lo'
O
10
IO
,J
IÓ
M
I0
16
10'
12Ü
Frecuencia (hercios)
FIGURA 12.1. Espectro electromagnético.
FIGURA 12.2. Variación en el tiempo de la amplitud en el campo eléctrico de una frecuencia de una onda electromagnética con polarización plana. El tiemp comprendido entre dos picos consecutivos de amplitud o dos mínimos consecutivos de amplitud se denomina período de la onda. la frecuencia son inversamente proporcionales entre sí, siendo la constante de proporcionalidad la velocidad de la luz c: c = Xf
(ill)
La frecuencia para cada color espectral es una constante para todos los materiales, pero la velocidad de la luz y la longitud de onda dependen de cada material. En el vacío, la velocidad de la luz es muy aproximadamente c = 3 X 1 0 cm/sec. Las longitudes de onda de la luz son muy pequeñas, por lo que las unidades de luz utilizadas para designar los colores espectrales suelen proporcionarse en cmgslroms (1 Á = 10~ cm) o en nanometros (Inm = 1 0 ~ cm). Un término equivalente para el nanometro es el de milimicra. La luz en el extremo de baja frecuencia del espectro (roja) tiene una longitud de onda de aproximadametne 780 nanometros (nm), mientras que la longitud de onda del otro extremo del espectro (violeta) es de unos 380 nm. Puesto que las unidades de longitud de onda son algo más cómodas de utilizar que las de frecuencia, los colores espectrales se suelen escenificar en términos de su longitud de onda en el vacío. 1 0
8
7
Una fuente luminosa como el Sol o como una bombilla doméstica emite todas las frecuencias dentro del rango visible para producir luz blanca. Cuando la luz blanca incide sobre un objeto opaco, algunas de las frecuencias son rellejadas y otras son absorvidas. La combinación de frecuencias presentes en la luz reflejada determina lo que nosotros percibimos como color del objeto. Si las bajas frecuencias son las predominantes en la luz reflejada, describiremos el objeto como rojo. En este caso, decimos que la luz percibida tiene una
12.1 Propiedades de la luz
737
frecuencia dominante (o longitud de onda dominante) en el extremo rojo del espectro. La frecuencia dominante se denomina también tono, o simplemente color, de la luz.
Características psicológicas del color Necesitamos otras propiedades, además de la frecuencia, para caracterizar nuestra percepción de la luz. Cuando observamos una fuente luminosa, nuestros ojos responden al color (o frecuencia dominante) y a otras dos sensaciones básicas. Una de estas es lo que denominamos brillo, que se corresponde con la energía luminosa total y puede cuantificarse como la luminancia de la luz (Sección 10.3). La tercera característica percibida se denomina pureza o saturación de la luz. La pureza describe hasta qué punto una determinada radiación luminosa nos parece un color espectral puro, como por ejemplo el rojo. Los colores pálidos y los colores pastel tienen una baja pureza (baja saturación) con lo que parecen casi blancos. Otro término, la cromaricidad, se utiliza para referirse conjuntamente a las dos propiedades que describen las características de un color: pureza y frecuencia dominante (tono). La radiación emitida por una fuente luminosa blanca tiene una distribución de energía que puede representarse en el rango de frecuencias visibles como se muestra en la Figura 12.3. Cada componente de frecuencia dentro del rango que va del rojo al violeta contribuye más o menos en la misma cantidad a la energía total, y el poder de la fuente se describe como blanco. Cuando hay presente una frecuencia dominante, la distribución de energía de la fuente toma una forma como la de la Figura 12.4. Este haz luminoso los describiríamos como de color rojo (la frecuencia dominante), con un valor relativamente alto de pureza. La densidad de energía de la componente dominante de la luz está etiquetada como E en esta figura, y las contribuciones de las otras frecuencias producen una luz blanca con densidad de energía E . Podemos calcular el brillo de la fuente como el área comprendida bajo la curva, que nos da la densidad total de energía emitida. La pureza (saluración) depende de la diferencia entre E y E , Cuanto mayor sea la energía E de la frecuencia dominante, comparada con la componente de luz blanca E mayor será la pureza de la luz. Tendremos una pureza del 100 por cien cuando E = 0 y una pureza del 0 por cien cuando E = E^. D
w
n
w
D
w>
w
w
FIGURA 12.3.
Distribución de enfila de una lúcmc de lu/
blanca.
Energía
Rojo
Viólela Frecuencia dominante
Frecuencia
FIGURA 12.4. Distribución de energía para una fuente luminosa con una frecuencia dominante cerca del extremo rojo del rango de frecuencias.
738
CAPÍTU LO 12 Modelos y aplicaciones del color
12.2 MODELOS DE COLOR Cualquier mélodo ulili/ado para explicar las propiedades o el comportamiento del color dentro de un contexto concreto se denomina m o d e l o de color. No hay un único modelo que pueda explicar lodos los aspectos del color, por lo que se utilizan diferentes modelos como ayuda para describir las diferentes características del color.
Colores primarios Cuando combinamos la luz de dos o más fuentes con diferentes frecuencias dominantes, podemos variar la cantidad (intensidad) de luz de cada fuente para generar un. rango de colores adicionales. Esto representa un posible método para formar un modelo de color. Los tonos que elijamos para las fuentes se denominan colores p r i m a r i o s y la g a m a de colores del modelo será el conjunto de todos los colores que podemos producir a partir de los colores primarios. Dos primarios que se combinen para generar el color blanco se denominan colores c o m p l e m e n t a r i o s . Como ejemplos de parejas de colores complementarios podemos citar el rojo y el cian, el verde y el magenta y el azul y el amarillo. No existe ningún conjunto finito de colores primarios reales que puedan combinarse para producir todos los posibles colores visibles. Sin embargo, tres primarios resultan suficientes para la mayoría de los propósitos y los colores que no están presentes en la gama de colores correspondientes a un conjunto especificado de primarios pueden, de lodos modos, describirse utilizando extensiones a los métodos. Dado un conjunto de tres colores primarios, podemos caracterizar cualquier cuarto color utilizando procesos de mezcla de colores. Así, una mezcla de uno o dos de los primarios con el cuarto color puede utilizarse para que se ajuste a alguna combinación de los restantes primarios. En este sentido ampliado, podemos considerar que un conjunto de tres colores primarios puede describir todos los colores. La Figura I2.5 muestra un conjunto defunciones ajuste de color para tres primarios y la cantidad de cada uno que hace falta para producir cualquier color espectral. Las cuerdas dibujadas en la Figura 12.5 se han obtenido promediando las opiniones de un gran número de observadores. Los colores en la vecindad de 500 nm sólo pueden generarse «restando» una cierta cantidad de luz roja de una combinación de luz azul y luz verde. Esto significa que un color situado en torno a 500 nm sólo puede describirse combinando dicho color con una cierta cantidad de luz roja con el fin de producir la combinación azul-verde especificada en el diagrama. Así, un monitor color RGB no puede mostrar colores en la vecindad de 500 nm.
Conceptos intuitivos del color Un artista crea una pintura en color mezclando pigmentos coloreados con pigmentos blancos y negros con el fm de formar las diversas sombras, tintas y tonos de la escena. Comenzando con el pigmento de un «color 0.4--
700
FIGURA 12.5. Tres funciones de ajuste de color para mostrar frecuencias espectrales dentro del rango aproximado que va de 400 nm a 700 nm.
12.3 Primarios
estándar y diagrama
cromático
739
puro» («tono puro»), el artista añade pigmento negro para generar distintas sombras de dicho color. Cuanto más pigmento negro añada, más oscura será la sombra del color. De forma similar, las diferentes tintas del color se obtienen añadiendo pigmento blanco al color original, haciéndolo más claro cuanta mayor cantidad de blanco se añada. Los tonos del color se obtienen añadiendo pigmento tanto blanco como negro. Para muchas personas, estos conceptos de color son más intuitivos que describir un color mediante un conjunto de tres números que nos den las proporciones relativas de los colores primarios. Generalmente, es mucho más fácil pensar en crear un color rojo pastel añadiendo blanco a un rojo puro y generar un color azul oscuro añadiendo negro a un azail puro. Por esto, los paquetes gráficos que proporcionan paletas de color a los usuarios suelen utilizar dos o más modelos de color. Uno de los modelos proporciona una interfaz de color intuitiva para el usuario y el otro describe los componentes de color para ios dispositivos de salida.
12.3 PRIMARIOS ESTÁNDAR Y DIAGRAMA CROMÁTICO Puesto que no puede combinarse ningún conjunto finito de puntos luminosos para mostrar todos los colores posibles, en 1931 la CIH (Commission Internationale de TÉclairage, Comisión Internacional de Iluminación) definió tres primarios estándar. Estos tres primarios son colores imaginarios, que se definen matemáticamente con funciones positivas de ajuste de color (Figura 12.6) que especifican la cantidad de cada primario necesaria para describir cualquier color espectral. Esto proporciona una definición internacional estándar para todos los colores, y los primarios del CIÉ eliminan el ajuste de color con valores negativos y otros problemas asociados con la selección de un conjunto de primarios reales.
El modelo de color XYZ El conjunto de primarios CIÉ se suele denominar modelo de color XYZ, donde los parámetros X, Y y Zrepresentan la cantidad de cada primario CIÉ necesaria para producir el color seleccionado. Así, un color se describe con el modelo XYZ de la misma forma en que describimos un color utilizando el modelo RGB. En el espacio de color tridimensional XYZ, representamos cualquier color C(X) como: C(X) = (X, Y,Z)
(12.2)
donde A', Y y Z se calculan a partir de las funciones de ajuste de color (figura 12.6):
= i 0.5 -
700
X(nm)
FIGURA 12.6. Las tres funciones de ajuste de color para los primarios de Ja CTE.
740 CAPÍTU LO 12 Modelos y aplicaciones del color
El parámetro k en estos cálculos tiene el valor de 683 lumens/vatio. donde el lumen es una unidad de medida para la radiación luminosa por unidad de ángulo sólido desde una fuente luminosa puntual «estándar» (que antiguamente se denominaba candela). La función / (X) representa la radiancia espectral, que es la intensidad luminosa seleccionada en una dirección concreta, y la función de ajuste de color f se elige de tal de manera que el parámetro y es la luminancia (Ecuación 10.26) de dicho color. Los valores de luminancia se ajustan normalmente para que ocupen el rango de 0 a 100.0, donde 100.0 represenUí la luminancia de la luz blanca. Cualquier color puede representarse en el espacio de color XYZ como una combinación aditiva de los primarios utilizando los vectores unitarios X, Y, Z. Así, podemos escribir la Ecuación 12.2 de la forma: Y
C(X) = XX + YX + ZX
(¡2.4)
Valores XYZ normalizados Al hablar de las propiedades del color, resulta conveniente normalizar los valores de la Ecuación 12.3 con respecto a la suma É + Y + Z, que representa la energía luminosa total. Así, los valores normalizados se calculan de la forma siguiente:
x =
x~vhz'
y
=
T r h z '
Z=
~X+Y+Z'
{ L L 5 )
Puesto que x + y + z = 1, cualquier color puede representarse simplemente con los valores x Q y. Asimismo, hemos efectuado la normalización con respecto a la energía total, por lo que los parámetrosxey dependen sólo del tono y de la pureza y se denominan valores de cromaticidad. Sin embargo, los valores* e^ no nos permiten por sí solos describir completamente todas las propiedades del color, y no podemos obtener los valores X, Y y Z. Por tanto, una descripción completa de un color se suele proporcionar mediante los tres valores x,y y la luminancia Y. Los valores restañes del modelo de la CÍE se calculan entonces mediante las fórmulas X = -Y, y
¿ = ~y »
U2.6)
donde z = I - x — y. Utilizando las coordenadas de cromaticidad (x y% podemos representar todos los colores en un diagrama bidimensional. }
Diagrama cromático de la CIÉ Cuando dibujamos los valores normalizados x ty para los colores del espectro visible, obtenemos la curva con forma aproximada de parábola mostrada en la Figura 12.7. Esta curva se denomina diagrama cromático CIÉ. LOS puntos de la curva son los colores espectrales (colores puros). La línea que une los puntos espectrales correspondientes al rojo y al violeta, denominada línea púrpura, no forma parte del espectro. Los puntos interiores representan todas las posibles combinaciones de colores visibles. El punto C del diagrama corresponde a la posición de la luz blanca. En realidad, este punto se dibuja para una fuente luminosa blanca conocida con el nombre iluminante C, que se utiliza como aproximación estándar para la luz diurna promedio. Los valores de luminancia no están disponibles en el diagrama cromático, debido a la normalización. Distintos colores con diferente luminancia pero con la misma cromaticidad se representarán mediante el mismo punto. El diagrama cromático resulta útil para: •
Comparar las barras de colores correspondientes a diferentes conjuntos de primarios.
•
Identificar colores complementarios.
•
Determinar la pureza y la longitud de onda dominante de un color especificado.
12.3 Primarios estándar y diagrama cromático
v
741
g Colores espectrales
C O A
0.8
540
0.7 f-(Verde)
/
\/ \560
0.6
\ [ 500
(Amarillo) \
0.5 UCián)
0.4
1
N.600
0.3 0.2
^ > 700 (Rojo)
\
í (Linca púrpura) 0.1 0
\40O(Violeta) 1 \v 1 1 l 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7 .v
FIGURA 12.8. Gamas de colores definidos en el diagrama cromático para un sistema de primarios de dos colores y de tres colores.
FIGURA 12.7. Diagrama cromatico CIÉ para los colores espectrales comprendidos entre 400 nm y 700 nm.
Gamas de colores Podemos identificar las gamas de colores en el diagrama cromático como segmentos de línea recta o regiones poligonales. Todos los colores situados en la línea recta que une las posiciones C, y C en la Figura I2.8 pueden obtenerse mezclando las cantidades apropiadas de dichos colores C y C . Si se utiliza una mayor proporción de C | , el color resultante estará más próximo a C que a C . La gama de colores para tres puntos, como por ejemplo C C y C en la Figura I2.8, es un triángulo con sus vértices situados en las posiciones de dichos tres colores. Estos tres primarios pueden generar únicamente los colores situados dentro del triángulo o en sus aristas de contorno. Así, el diagrama cromático nos ayuda a comprender porqué ningún conjunto de tres primarios puede combinarse de forma aditiva para generar todos los colores, ya que ningún triángulo del diagrama puede abarcar todos los colores del mismo. Podemos comparar cómodamente mediante el diagrama cromático las gamas de colores de los monitores de vídeo y de los dispositivos de obtención de copias impre2
{
{
v
4
2
2
5
Colores complementarios Puesto que la gama de colores para dos puntos es una línea recta, los colores complementarios deben estar representados en el diagrama de cromaticidad como dos puntos situados en lados opuestos de C y colineales con C, como en la Figura 12.9. Las distancias de los dos colores C y C, a C determinan la cantidad de cada color necesaria para producir luz blanca. ]
Longitud de onda dominante Para determinar la longitud de onda dominante de un color, dibujamos una línea recta desde C a través de dicho punto de color, hasta alcanzar un color espectral en la curva cromática. El color espectral C en la Figura 2.10 es la longitud de onda dominante para el color C en este diagrama. Así, el color C puede representarse como una combinación de la luz blanca C y el color espectral C . Este método para detenninar la longitud de onda dominante no sirve para los puntos de color que se encuentren entre C y la línea púrpura. Si dibujamos una línea desde C a través del punto C en la Figura 12.1 ü, llegamos al punto C en la línea púrpura, que no se encuentra en el espectro visible. En este caso, tomamos el complementario de C en la curva espectral, K
{
(
s
2
¡}
7 4 2 C APÍTULO 12 Modelos y aplicaciones del color
que será el punto C , como longitud de onda dominante. Los colores como C en este diagrama tienen distinciones espectrales como longitudes de onda dominantes substractivas. Podemos describir dichos colores restando de la luz blanca la longitud de onda dominante espectral. sp
2
Pureza Para un punto de color tal como C, en la Figura 12.10, determinamos la pureza como la distancia relativa de C| a C según la linea recta que une C con C' . Si d \ denota la disntancia desde C a C, y d es la distancia desde C a C , podemos representar la pureza como el cociente d /d . El color í?i en esta figura tiene una pureza aproximadamente del 25 por ciento, ya que está situado aproximadamente a un cuarto de la distancia total de Ca C . En la posición C > el punto de color sería 100 por cien puro. v
A
c
cs
c{
v
cs
s
12.4 EL MODELO DE COLOR RGB De acuerdo con la teoría de los tres estímulos de la visión, nuestros ojos perciben el color mediante la estimación de tres pigmentos visuales en los conos de la retina. Uno de los pigmentos es más sensible a la luz con una longitud de onda de unos 630 nm (roja), otro tiene su pico de sensibilidad para unos 530 nm (verde) y el tercer pigmento es especialmente receptivo a la luz con una longitud de onda de unos 450 nm (azul). Comparando las intensidades de una fuente luminosa, podemos percibir el color de la luz. Esta teoría de la visión es la base para la visualización de los colores en un monitor de video utilizando los tres primarios rojo, verde y azul, que es lo que se denomina modelo de color RGB. Podemos representar este modelo utilizando el cubo unitario definido sobre sendos ejes /?, G y Z?, como se muestra en la Figura 12.11. El origen representa el color negro y el vértice diagonalmente opuesto, con coordenadas (1, 1. I), es el blanco. Los vértices del cubo situados sobre los ejes representan los colores primarios y los restantes vértices son los puntos de color complementario para cada uno de los colores primarios. Al igual que con el sistema de color XYZ, el esquema de color RGB es un modelo aditivo. Cada punto de color dentro del cubo unitario puede representarse como una suma vectorial ponderada de los colores primarios, utilizando los vectores unitario R, G y B: C (X) = (tf, G , 5 ) = / J R + GG + #B
(12.7)
donde los parámetros R G y B toman valores en el rango que va de 0 a 1.0. Por ejemplo, el vértice magenta se obtiene sumando los valores máximos de rojo y azul para producir la tripleta ( 1 , 0 , 1), mientras que el blany
12.4 El modelo de color RGB
743
FIGURA 12.11. El modelo de color RGB, Cualquier color dentro del cubo unitario puede describirse mediante la combinación aditiva de los tres colores primarios.
(a)
(b)
FIGURA 12.12. Dos vistas del cubo de color RGB. La vista (a) es según la diagonal de cscala de grises que va de blanco a negro y la vista (b) es según la diagonal de escala de grises que va de negro a blanco.
co en ( I , I, I) es la suma de los valores máximos de rojo, verde y azul. Las sombras de gris están representadas a lo largo de la diagonal principal del cubo, desde el origen (negro) hasta el vértice blanco. Los puntos situados en esta diagonal tienen una contribución igual de cada uno de los colores primarios, y una sombra de gris a medio camino entre el negro y el blanco se representa como (0.5, 0.5, 0.5). Las graduaciones de color en los planos frontales y superior del cubo RGB se ilustran en la Figura 12.12. Las coordenadas cromáticas para los fósforos RGB del estándar NTSC (National Television System Committee) se indican en la Tabla 12.1. También se indican las coordenadas cromáticas RGB dentro del modelo de color CIÉ y los valores aproximados utilizados para los fósforos en los monitores en color. La Figura 12.13 muestra la gama aproximada de colores para los primarios RGB del estándar NTSC. TABLA 12.1. COORDENADAS CROMÁTICAS RGB (x, >). Estándar NTSC
Modelo CIÉ
Valores aproximados monitor color
R
(0.670, 0.330)
(0.735, 0.265)
(0.628, 0.346)
G
(0.2 i0, 0.710)
(0.274, 0.717)
(0.268.0.588)
B
{0.140, 0.080)
(0.167, 0.009)
(0.150, 0.070)
744
CAPÍTULO 12 Modelos y aplicaciones del color
FIGURA 12.13. La gama de colores RGB para las coordenadas cromáticas NTSC. El iluminante C se encuentra en la posición (0.310, 0.316), con un valor de luminaneia de Y - 100.0.
12.5 EL MODELO DE COLOR YIQ Y LOS MODELOS RELACIONADOS Aunque un monitor gráfico RGB requiere señales separadas para las componentes roja, verde y a/ul de las imágenes, los monitores de televisión utilizan una señal compuesta. La codificación de color NTSC para formar la señal de vídeo compuesta se denomina modelo YIQ.
Los parámetros YIQ En el modelo de color YIQ, el parámetro Y es igual que la componente Y del espacio de color XYZ de CIÉ. La información de luminaneia (brillo) está contenida en el parámetro Y, mientras que la información cromática (tono y pureza) está incorporada en los parámetros / y Q. Para el parámetro y se elige una combinación de rojo, verde y azul para obtener la curva de luminosidad estándar. Puesto que Y contiene la información de luminaneia, los monitores de televisión en blanco y negro sólo utilizan la señal K. El parámetro / contiene la información de color naranja-cián que proporciona el tono de sombreado de la piel, mientras que el parámetro Q comunica la información de color verde-magenta. La señal de color compuesta NTSC está diseñada para proporcionar la información de tal manera que pueda ser recibida por los monitores de televisión en blanco y negro, que obtienen la información de escala de grises para una imagen dentro de un ancho de banda de 6 MHz. Así, la información YIQ está también codificada dentro de un ancho de banda de 6 MHz, pero los valores de luminaneia y cromáticos están codificados en señales analógicas separadas. De esta forma, la señal de luminaneia no tiene porqué cambiar con respecto a la de los monitores en blanco y negro, añadiéndose simplemente la información de color dentro del mismo ancho de banda. La información de luminaneia, el valor Y, se comunica como una modulación de amplitud sobre una señal portadora con un ancho de banda de 4.2 MHz. La información cromática, los valores / y Q, está combinada sobre una segunda señal portadora que tiene un ancho de banda de unos 1.8 MHz. Los nombres de los parámetros / y Q hacen referencia a los métodos de modulación utilizados para codificar la información de color sobre esta portadora. Una codificación de modulación de amplitud (la señal «en fase») transmite el valor /, utilizando unos 1.3 MHz del ancho de banda, mientras que una codificación por modulación de fase (la señal «en cuadratura»), que utilzan unos 0.5 MHz, transporta el valor Q, Los valores de luminaneia están codificados con mayor precisión en la señal NTSC (ancho de banda de 4.2 MHz) que los valores cromáticos (ancho de banda 1.8 MHz). porque los humanos podemos delectar más fácilmente los pequeños cambios de brillo que los pequeños cambios de color. Sin embargo, esta menor precisión de la codificación cromática hace que las imágenes NTSC presenten una cierta degradación de la calidad el color.
12.6 Los modelos de color CMY y CMYK
745
Podemos calcular el valor de luminancia para un color RGB utilizando la Ecuación 10.27, y un método para producir los valores cromáticos consiste en restar la luminancia de las componentes roja y a/ul del color. Así, Y = 0.299 R + 0.587 G + 0.114 B U2.8)
1 = R- Y Q = B - Y
Transformaciones entre los espacios de color RGB e YIQ Un color RGB puede convertirse a un conjunto de valores YIQ utilizando un codificador NTSC que implemente los cálculos de la Ecuación 12.8 y que module las señales portadoras. La conversión del espacio RGB al espacio YIQ se lleva a cabo utilizando la siguiente matriz de transformación:
=
/
0.299
0.587
0.114
0.701
-0.587
-0.114
-0.299
-0.587
0.886
(12.9)
A la inversa, una señal de vídeo NTSC puede convertirse a valores de color RGB utilizando un decodificador NTSC, que primero separa la señal de vídeo en las componentes YIQ y luego convierte los valores YIQ a valores RGB. La conversión desde el espacio YIQ al espacio RGB se lleva a cabo mediante la transformación inversa 12.9:
Los sistemas Y U V e Y C C r
R
.000
.000 1.000
0.000
i/
.(XX)
-0.509
-0.194
B
.000
0.000
1.000
1
(12.10)
b
Debido al menor ancho de banda asignada a la inforamción cromática en la señal de vídeo analógico compuesta NTSC, la calidad del color de una imagen NTSC no es la que debiera. Por tanto, se han desarrollado variaciones de la codificación YIQ para mejorar la calidad del color en las transmisiones de vídeo. Una de tales codificaciones es el conjunto YU V de parámetros de color, que proporciona la información de color compuesto para transmisiones de vídeo en sistemas tales como PAL (Phase Altemation Line) Broadcasting, que se utiliza en la mayor parte de Europa, así como en África, Australia y Eurasia. Otra variación de YIQ es la codificación digital denominada Y C C . lista representación del color se utiliza para manipulación de vídeo digital, y está incorporada en diversos formatos de archivo gráfico, como por ejemplo el sistema JPEG (Sección 15.4). r
12.6
b
LOS M O D E L O S DE COLOR CMY Y CMYK
Un monitor de vídeo muestra los patrones de color combinando la luz emitida por los fósforos de pantalla, lo cual es un proceso aditivo. Sin embargo, los dispostivos de obtención de copias impresas, como las impresoras y trazadoras gráficas, generan una imagen en color recubriendo el papel con pigmentos coloreados. Nosotros vemos los patrones de color del papel mediante la luz reflejada, lo cual es un proceso substractivo.
Los parámetros CMY Podemos formar un modelo de color substractivo utilizando los tres colores primarios cian, magenta y amarillo. Como hemos indicado, el cian puede describirse como una combinación de verde y azul; por tanto, cuan-
746
CAPÍTULO 12
Modelos y aplicaciones del color
M focaia de grises
FIGURA 12.14. F.l modelo de color CMY. Las posiciones dentro del cubo N describen restando del blanco las cantidades especificadas de los colores primarios. do se refleja lu/ blanca en una tinta de color ciati, la luz reflejada sólo contiene las componentes verde y azul, y la componente roja es absorbida, o restada, por la tinta. De forma similar, la tinta magenta resta la componente verde de la luz incidente y la tinta amarilla resta la componente azul. En la Figura 12.14 se ilustra un cubo unitario que sirve para representar el modelo CMY. En el modelo CMY, la posición espacial (I, I, 1 ) representa el negro, porque se restan todos los componentes de la luz incidente. El origen representa la luz blanca. Si se utilizan cantidades iguales de cada uno de los colores primarios, se obtienen las sombras de gris, situadas a lo largo de la diagonal principal del cubo. Una combinación de cian y magenta produce luz a/ul, porque las componentes roja y verde de la luz incidente se absorven. De forma similar, una combinación de tinta cian y amarilla produce luz verde, mientras que una combinación de tinta magenta y amarilla nos da la luz roja. El proceso de impresión CMY utiliza a menudo una colección de cuatro puntos de tinta, que están dispuestos en un determinado patrón, de modo similar a cómo se utilizan en un monitor RGB los tres puntos de fósforo. Así, en la práctica, el modelo de color CMY se denomina modelo CMYK, donde K es el parámetro tic color negro. Se utiliza un punto de tinta para cada uno de los colores primarios (cian. magenta y amarillo) y otro punto de tinta es negro. Se incluye un punto negro porque la luz reflejada a partir de las tintas cian. magenta y amarilla sólo produce normalmente sombras de gris. Algunos trazadores gráficos producen diferentes combinaciones de color indexando las tintas de unos colores primarios sobre otros y permitiéndolas mezclarse antes de que se sequen. Para impresión en blanco y negro o en escala de grises, sólo se utili/a la tinta negra.
Transformaciones entre los espacios de color CMY y RGB Podemos expresar la conversión de una representación RGB a una representación CMY utilizando la siguiente matriz de transformación: c \!
Y
R
1
=
1
I
-
G
U2.ll)
B
donde el punto blanco del espacio RGB está representado mediante el vector columna unitario. Asimismo, podemos convertir de una representación en color CMY a una representación RGB utilizando la matriz, de transformación:
i a = i B i R
c M
(12.12)
Y
En esta transformación, el vector columna unitario representa el punto negro del espacio de color CMY.
12.7 El modelo de color HSV
747
Para la conversión de RGB al espacio de color CMYK, primero hacemos K = max(/?. G\ B) y luego restamos K de cada uno de los valores C, M e Y en la Ecuación 12.11. De forma similar, para la transformación de CMYK a RGB, primero hacemos K = min(fl, G, B) y luego restamos K de cada uno de los valores /?, G y B de la Ecuación 12.12. En la práctica, estas ecuaciones de Iransformación se suelen modificar con el fin de mejorar la calidad de impresión de cada sistema concreto.
12.7 EL MODELO DE COLOR HSV Las interfaces para selección de colores por parte de los usuarios emplean a menudo un modelo de color basado en conceptos intuitivos, en lugar de en un conjunto de colores primarios. Podemos especificar un color en un modelo intuitivo seleccionando un color espectral y las cantidades de blanco y de negro que hay que añadir a ese color para obtener diferentes sombras, tintas y tonos (Sección 12.2).
Los parámetros HSV Los parámetros de color en este modelo se denominan tono (//), saturación (S) y valor (V). Podemos definir este espacio de color tridimensional relacionando los parámetros HSV con las direcciones del cubo RGB. Si pensamos en la visualización del cubo según la diagonal que va desde el vértice blanco hasta el origen (negro), podremos ver el contorno del cubo con forma hexagonal que se muestra en la Figura 12.15. El contorno del hexágono representa los distintos tonos y se utiliza como parte superior del cono hexagonal HSV (Figura 12.16). En el espacio HSV, la saturación S s c mide según un eje horizontal y el parámetro de valor l ' s e mide según un eje vertical que pasa por el centro del cono hexagonal. El tono está representado como un ángulo con respecto al eje vertical, yendo de 0° para el rojo a 360°. Los vértices del hexágono están separados por intervalos de 60°. El amarillo se encuentra en 60", el verde en 120° y el cían (opuesto al punto rojo) se encuentra en H = 180°. Los colores complementarios están separados por 180". El parámetro de saturación .S' se utiliza para especificar la pureza de un color. Un color puro (color espectral) tiene el valor S = LO y los valores de S decrecientes tienden hacia la línea de escala de grises (S - 0), situada en el centro del cono hexagonal. El valor V varía entre 0 en el vértice del cono hexagonal y 1.0 en el plano superior. El vértice del cono hexagonal es el punto negro. En el plano superior, los colores tienen su máxima intensidad. Cuando V = 1.0 y S = 1.0, tendremos los tonos puros. Los valores de los parámetros para el punto blanco son V = 1.0 y 5=0. Para la mayoría de los usaurios, este es el modelo más cómodo para la selección de colores. Comenzando con una selección de un tono puro, que especifica el ángulo de tono // y hace V = S = 1.0, describimos el
FIGURA 12.15. Cuando vemos (a) el cubo de color RGB según la diagonal que va del blanco al negro, el contorno del cubo de color liene forma hexagonal (b).
748 C APÍTU LO 12 Modelos y aplicaciones del color V (Valor)
Verde (120°)
Amarillo
Tono puro
(5= I . V - I)
Cían
V= 0' (Negro)
Sí Saturación I
FIGURA 12.16. El cono hexagonal HSV.
FIGURA 12.17. Sección Iransversal del cono hexagonal HSV, que muestra las regiones para las sombras, tintas y tonalidades.
color que queremos añadiendo blanco o negro al tono puro. La adición de negro hace que disminuya el valor de Vmientras que S se mantiene constante. Por ejemplo, para obtener un azul oscuro, le podríamos asignara V el valor 0.4 con S = 1.0 y H = 240°. De modo similar, cuando se añade blanco al tono seleccionado, el parámetro S decrece mientras que E s e mantiene constante. Un azul claro podría especificarse con S = 0.3, V = 1.0 y H = 240". Añadiendo algo de negro y algo de blanco, hacemos que disminuyan tanto V como S. Las interfaces que utilizan este modelo suelen presentar las opciones de selección de los parámetros HSV mediante una paleta de color que contiene deslizadores y una rueda de color.
Selección de sombras, tintas y tonalidades Las regiones de color para la selección de sombras, tintas y tonos están representadas en el plano de sección transversal del cono hexagonal HSV que se muestra en la Figura 12.17. Añadiendo negro a un color espectral, el valor de V decrece a lo largo del lado del cono hexagonal, desplazándonos hacia el punto negro. Así, las distintas sombras estarán representadas por los valores 5*= 1.0 y 0.0 < V < 1.0. La adición de blanco a los colores espectrales produce las distintas tintas situadas en el plano superior del cono hexagonal, donde los valores de los parámetros son V = 1.0 y 0 < S < LO. Las diversas tonalidades se obtienen añadiendo tanto blanco como negro a los colores espectrales, lo que genera los puntos de color situados dentro del área triangular de sección transversal del cono hexagonal. El ojo humano puede distinguir aproximadamente unos 128 tonos distintos y unas 130 tintas (niveles de saturación) distintas. Para cada uno de estos, podemos detectar diversas sombras (valores), dependiendo del tono seleccionado. Con los colores amarillos, podemos distinguir unas 23 sombras, mientras que en el extremo azul del espectro sólo podemos distinguir 16. Esto significa que el número de colores distintos que podemos distinguir es de aproximadamente 128 X 130 X 23 = 382,720. Para la mayoría de las aplicaciones gráficas, 128 tonos, 8 niveles de saturación y 16 valores suelen ser suficientes. Con este rango de parámetros en el modelo de color HSV, habrá disponible 16.384 colores para el usuario. Estos valores de color pueden almacenarse con 14 bits por píxel, o bien pueden utilizarse tablas indexadas de colores y un número de bits por pixel menor.
12.7 El modelo de color HSV
749
Transformaciones entre los espacios de color HSV y RGB Para determinar las operaciones requeridos para las transformaciones entre los espacios HSV y RGB, vamos a ver primero cómo puede construirse el cono hexagonal HSV a partir del cubo RGB. La diagonal del cubo RGB que va de negro (el origen) a blanco se corresponden con el eje Vát\ cono hexagonal. Asimismo, cada SLibeubo del cubo RGB se corresponde con un área hexagonal de sección transversal del cono. En cada sección transversal, todos l o s lados del hexágono y todas las líneas radiales que van del eje V hasta cualquier vértice tienen el valor V. Así, para cualquier conjunto de valores RGB, V será igual al valor de la componente RGB máxima. El punto HSV correspondiente a este conjunto de valores RGB estará en la sección transversal hexagonal correspondiente al valor V. El parámetro S puede entonces determinarse como la distancia relativa de este punto con respecto al eje V. El parámetro /•/ se determinará calculando la posición relativa del punto dentro de cada sextante del hexágono. En el siguiente procedimiento se proporciona un algoritmo para mapear cualquier conjunto de valores RGB sobre los correspondientes valores HSV: Podemos obtener la transformación desde el espacio HSV al espacio RGB realizando las operaciones inversas a las que se muestran en el procedimiento anterior. Estas operaciones inversas se llevan a cabo para cada sextante del cono hexagonal y las ecuaciones de transformación resultantes están resumidas en el siguiente algoritmo:
class
rgbSpace
(public:
float
r,
g,
b;};
class
hsvSpace
(public:
float
h,
s,
v;};
const
float
noHue
=
-1.0;
inline
float
inline
float max(float
void
a,
f l o a t b)
{ r e t u r n (a <
a,
float
{return
rain(float
rgbTOhsv
(rgbSpace&
rgb,
b)
(a
b)?
a : b;}
> b)?
a
:
b;}
havSpace& hsv)
i /*
L o s v a l o r e s RGB y HSV e s t a n e n e l
f l o a t minRGB float
• min
deltaRGB
=
(r,
min
maxRGB
-
(g,
b) ) ,
rango
maxRGB
minRGB;
v m maxRGB; if
(maxRGB s
I-
0.0)
=
deltaRGB
=
0.0;
/
maxRGB;
else 8 if
(8
<=
0.0)
h *• n o H u e ; else
{
if
(r h
« •
maxRGB) (g
-
b)
/
deltaRGB;
else if
(g h
== =
maxRGB)
2.0
+
(b
-
r)
/
deltaRGB;
else if
(b
mm maxRGB)
h = 4 , 0 + (r - g) / deltaRGB; h
*=
60.0;
0
a
= max
1.0 (r,
*/ max
(g,
b)) ;
750
CAPÍTULO 12 Modelos y aplicaciones del color
h h
/=
+=
360.0;
360.0;
)
Ì
12.8 EL MODELO DE COLOR HLS Otro modelo basado en parámetros intuitivos de color es el sistema HLS utilizado por Tektronix Corporation. Este espacio de color tiene la representación de doble cono que se muestra en la Figura I2.I8. Los tres parámetros de este modelo de color se denominan tono (//), claridad {!.) y saturación (S). El tono tiene el mismo signillcado que en el modelo IISV. Especificando un ángulo con respecto al eje vertical que indica un tono (color espectral). En esle modelo. /7 = 6°se corresponde con el azul. Los colores restantes se especifican alrededor del perímetro de cono en el mismo orden que en el modelo IISV. El magenta estará a 60°. el rojo a 120° y el cian a // =180". De nuevo, los colores complementarios estarán separados 180° en este doble cono. El eje vertical en este modelo se denomina claridad, L. Para L = 0, tendremos el negro, mientras que el blanco se encontrará en L = 1.0. Los valores de escala de grises se encuentran a lo largo del eje L y los colores puros están en el plano L - 0.5. El parámetro de saturación .V especifica de nuevo la pureza de un color. Este parámetro varía entre 0 y 1.0 y los colores puros son aquellos para los que .V = 1.0 y L = 0.5. A medida que S disminuye, se añade más blanco a un color. La linca de escala de grises se encuentra en S = 0.
I (Claridad)
/, = i
Amarillo
Azul
//(Ángulo licitino) FIGURA 12.18.
Fl doble a m o 111 S.
¿ = 0l (Negro)
S (Saturación)
12.10 Resumen
751
Para especificar un color, comenzamos seleccionando el ángulo de lono //. Entonces, podemos obtener Una sombra, titila o tonalidad correspondientes a dicho tono ajusfando los parámetros L y .S'. Se obtiene un color más claro incrementando L, mientras que si se disminuye L el color que se obtiene es más oscuro. Cuando se reduce .V, el punto de color espacial se mueve hacia la línea de escala de grises.
12.9 SELECCIÓN Y APLICACIONES DEL COLOR Los paquetes grállcos pueden proporcionar capacidades de color que nos ayuden a seleccionar los colores necesarios. Por ejemplo, una ínter faz puede contener deslizadores y ruedas de color en lugar de exigimos que todas las especificaciones de color se proporcionen como valores numéricos que definan las componentes RGB. Además, pueden proporcionarse facilidades para seleccionar combinaciones de color armoniosas, asi como directrices para la selección básica de colores. Un método para obtener un conjunto de colores coordinados consiste en generar las combinaciones de color a partir de un pequeño subespacio del modelo de color. Si los colores se seleccionan a intervalos regulares situados a lo largo de cualquier línea recta dentro del cubo RGB o C'MY. por ejemplo, cabe esperar que obtengamos un conjunto de colores bien adaptados. Los tonos aleatoriamente seleccionados producen norma Imente combinaciones de color duras y muy chocantes. Otra consideración que hay que tener en cuenta en las imágenes de color es el hecho de que percibimos los colores con profundidades diferentes. Esto sucede porque los ojos enfocan los colores de acuerdo con su frecuencia. Por ejemplo, los azules tienden a parecer más lejanos de lo que están en realidad. Si se muestra un patrón azul al lado de uno rojo los ojos tenderán a fatigarse, ya que necesitaremos continuamente ajustar el enfoque cuando desplacemos nuestra atención de un área a otra. Este problema puede reducirse separando estos colores o utilizando colores extraídos de una mitad o menos del hexágono de colores del modelo HSV. Con esta técnica, la imagen contendrá azules y verdes o rojos y amarillos, por ejemplo. Como regla general, la utilización de un número menor de colores produce imágenes con mejor aspecto que si se utilizara un gran número de colores. Asimismo, las tintas y las sombras tienden a mezclarse mejor que los tonos puros. Para un fondo, el gris o el complementario de uno de los colores de primer plano suelen ser las mejores elecciones.
12.10 RESUMEN La luz puede describirse como una radiación electromagnética con una cierta distribución de energía y que se propaga a través del espacio, y los componentes de color de la luz se corresponden con las frecuencias situadas dentro de una estrecha banda del espectro electromagnético. Sin embargo, la luz exhibe otras propiedades, y podemos caracterizar los diferentes aspectos de la luz utilizando diversos parámetros. Con las teorías Je la luz basadas en la dualidad onda-corpúsculo, podemos explicar las características tísicas de la radiación visible, mientras que para cuantificar nuestras percepciones sobre una fuente luminosa utilizamos términos tales como la frecuencia dominante (tono), la luminancia (brillo) y la pureza (saturación). El tono y la pureza se suelen denominar, conjuntamente, propiedades cromáticas de un color. También utilizamos los modelos de color para explicar los efectos de la combinación de fuentes luminosas. Un método para definir un modelo de color consiste en especificar un conjunto de dos o más colores primarios que se combinan para generar otros colores. Sin embargo, no hay ningún conjunto finito de colores primarios capaz de producir todos los colores o de describir todas las características de color. El conjunto de colores que puede generarse a partir del conjunto de primarios se denomina gama de colores. Dos colores que puedan combinarse para producir luz blanca se denominan colores complementarios. En I931, la CIÉ (Comisión Internacional de Iluminación) adoptó como estándar un conjunto de tres funciones hipotéticas de ajuste de color. Este conjunto de colores se denomina modelo XYZ, donde A", Y y Z
752
CAPÍTULO 12 Miníelos y aplicaciones del color
representan las cantidades de cada color necesarias para generar cualquier color del espectro electromagnético Las funciones de ajuste de color están estructuradas de modo que todas las funciones sean positivas y que el valor de Y correspondiente a cada color represente la luminancia. Los valores-Ve Y normalizados, denominados x e y se utilizan para situar las posiciones de todos los colores espectrales en el diagrama cromático CÍE. Podemos utilizar el diagrama cromático para comparar gamas de colores correspondientes a diferentes modelos de color, para identificar colores complementarios y para determinar la frecuencia dominante y pureza de un color especificado. Otros modelos de color basados en un conjunto de tres primarios son los modelos RGB, Y1Q y CMY. Utilizamos el modelo RGB para describir los colores que se muestran en los monitores de vídeo. El modelo YIQ se utiliza para describir la señal de vídeo compuesta utilizada en las emisiones de televisión. Por su parte, el modelo CMY se emplea para describir el color en los dispositivos de obtención de copias impresas. Las interfaces de usuario proporcionan a menudo modelos de color intuitivos, como los modelos HSV y HLS, para las selecciones de valores de color. Con estos modelos, especificamos un color como una mezcla de un tono seleccionado y ciertas cantidades de blanco y de negro. La adición de negro produce las distintas sombras de color, la adición de blanco produce las tintas y la adicción tanto de negro como de blanco produce las tonalidades. La selección del color es un factor importante en el diseño de imágenes efectivas. Para evitar las combinaciones de color chillonas, podemos seleccionar colores adyacentes en una imagen que no difiera grandemente en cuanto a su frecuencia dominante. Asimismo, podemos seleccionar las combinaciones de color extrayéndolas de un pequeño subespacio de un cierto modelo de color. Como regla general, un pequeño número de combinaciones de color formadas por tintas y sombras, en lugar de por tonos puros, da como resultado imágenes en color más armoniosas. %
REFERENCIAS Puede encontrar un análisis detallado de la ciencia del color en Wyszecki y Stiles (19X2). Los modelos de color y las técnicas de visualización de colores se Iratan en Smilh (1978), ileckberl (19X2), Durrelt (1987). Schwartz, Cowan y Beatty (1987), Hall (1989) y Truvis (1991). Puede encontrar algoritmos para diversas aplicaciones del color en Glassner( 1990), A r v o ( l 9 9 l ) , Kirk (1992), Heckbert (1994) y Paeth (1995). Para obtener información adicional sobre el sistema visual humano y nuestra percepción de la luz y el color, consulte Glassner(1905).
EJERCICIOS 12.1
Calcule las expresiones para convenir los parámetros de color RGB en valores HSV.
12.2
Calcule las expresiones para convertir valores de color HSV en valores RGB.
12.3
Diseñe un procedimiento interactivo que permita seleccionar parámetros de color HSV a partir de un menú visualizado; entonces, convierta los valores HSV en valores RGB para poder almacenarlos en un búfer de imagen.
12.4
Escriba un programa para seleccionar colores utilizando un conjunto de tres deslizadores con los que selcceionar los valores de los parámetros de color HSV.
12.5
Modifique el programa del ejercicio anterior para mostrar los valores numéricos de las componentes RGB de eada color seleccionado.
12.6
Modifique el programa del ejercicio anterior para mostrar las componentes de color RGB y el color combinado en pequeñas ventanas de visualización.
12.7
Calcule las expresiones para convenir los valores de color RGB en parámetros de color III S.
12.8
Calcule las expresiones para convertir valores de color HLS en valores RGB.
Ejercicios 12.9
753
Escriba un programa que produzca un conjunto de colores linealmente interpolados a partir de dos posiciones especillcadas en el espacio RGB.
12.10 Escriba una rutina interactiva para seleccionar valores de color dentro de un subespacio especificado del espacio RGB. 12.11
Escriba un programa que produzca un conjunto de colores linealmente interpolados a partir de dos posiciones especificadas dentro del espacio IISV.
12.12 Escriba un programa que genere un conjunto de colores linealmente interpolados entre de dos posiciones especificadas del espacio MLS. 12.13 Escriba un programa para mostrar dos rectángulos de color RGB adyacentes. Rellene un rectángulo con un conjunto de puntos de color RGB aleatoriamente seleccionados y rellene el otro rectángulo con un conjunto de punios de color seleccionados de entre un pequeño subespacio RGB. Experimente con diferentes selecciones aleatorias y diferentes subespacios para comparar los dos patrones de color. 12.14
Muestre los dos rectángulos de color del ejercicio anterior utilizando selecciones de color del espacio IISV o del espacio IILS.
Animación por computadora
Una imagen cuyas características faciales han sido transformadas mediante las técnicas de morfismo. (Cortesía de Vértigo Technology', Inc.)
13.6
Sistemas de fotogramas clave
13.7
Especificaciones de movimientos
13.8
Animación de figuras articuladas
Funciones generales de animación por computadora
13.9
Movimientos periódicos
Lenguajes de animación por computadora
13.11
13.1
Métodos de barrido para las animaciones por computadora
13.2
Diseño de secuencias de animación
13.3
Técnicas tradicionales de animación
13.4 13.5
13.10 Procedimientos de animación en OpenGL Resumen
Hoy en día, se utilizan los métodos ¡litografieos de forma común para generar animaciones para muy di\crsas aplicaciones, incluyendo el entretenimiento (películas y dibujos animados), la industria publicitaria, los estudios científicos y de ingeniería, la formación y la educación. Aunque todos leudemos a pensaren la animación como si implicara el movimiento de objetos, el término animación por computadora se refiere, en general, a cualquier secuencia temporal donde se aprecien cambios visuales en una imagen. Además de cambiar las posiciones de los objetos mediante traslaciones o rotaciones, una animación generada por computadora puede mostrar variaciones temporales que afecten al tamaño de los objetos, a su color, a su transparencia o a las texturas superficiales. Las animaciones utilizadas en la industria publicitaria recurren frecuentemente a las transiciones entre una forma de objeto y otra: por ejemplo, transformar una lata de aceite para motores en un motor de automóvil. También podemos generar animaciones por computadora variando parámetros de la cámara, como la posición, la orientación o la distancia focal. Y las variaciones en los efectos de iluminación u otros parámetros y procedimientos asociados con la iluminación y la representación de escenas pueden usarse también para producir animaciones por computadora. Una consideración importante en las animaciones generadas por computadora es la cuestión del realismo. Muchas aplicaciones requieren imágenes suficientemente realistas. Por ejemplo, una representación precisa de la forma de una tormenta o de otro fenómeno natural escrito con un modelo dinámico tiene una gran importancia para evaluar la Habilidad del modelo. De forma similar, los simuladores para el entrenamiento de los pilotos de aeronaves y de los operadores de equipos pesados debe producir representaciones razonablemente! precisas del entorno. Las aplicaciones de entretenimiento y publicitarias, por el contrario, suelen estar más interesadas en los efectos visuales. De este modo, puede que las escenas se muestren con formas exageradas y movimientos y transformaciones no realistas. Sin embargo, hay muchas aplicaciones de entretenimiento y publicitarias que sí que requieren una representación precisa en las escenas generadas por computadora. En algunos estudios científicos y de ingeniería, el realismo no constituye un objetivo: por ejemplo, determinadas magnitudes tísicas suelen mostrarse con pseudo-colores o con formas abstractas que cambian con el tiempo con el fin de ayudar al investigador a comprender la naturaleza del proceso físico. Dos métodos básicos para la construcción de una secuencia animada son la animación en tiempo real \ la animación imagen a imagen. En una animación por computadora en tiempo real, cada etapa de la secuencia se visualiza a medida que se la genera. Por ello, la animación debe generarse a una frecuencia que sea compatible con las restricciones de la frecuencia de refresco. Para una animación imagen a imagen, se genera de forma separada cada imagen de la secuencia y se la almacena. Posteriormente, las imágenes pueden grabarse sobre una película o mostrarse de forma consecutiva en un monitor de vídeo, en el modo de «reproducción en tiempo real». Las secuencias animadas simples se suelen producir en tiempo real, mientras que las animaciones más complejas se construyen más lentamente, imagen a imagen. Pero algunas aplicaciones requieren animación en tiempo real, independientemente de la complejidad de la animación. Una animación para un
756
CAPÍTULO 13
Animación por computadora
simulador de vuelo, se tiene que generar en tiempo real, porque las imágenes de vídeo deben construirse respondiendo de manera inmediata a los cambios de las configuraciones de control. En tales casos, se suelen desarrollar sistemas hardware y software especializados con el fin de poder generar rápidamente las complejas secuencias de animación.
13.1 MÉTODOS DE BARRIDO PARA LAS ANIMACIONES POR COMPUTADORA La mayoría de las veces, podemos crear secuencias simples de animación en nuestros programas utilizando métodos de tiempo real, pero en general, podemos producir una secuencia animada en un sistema de visualizóte ion por barrido generando una imagen cada vez y guardando dicha imagen completa en un archivo para su visualización posterior. La animación puede verse entonces recorriendo la secuencia completa de imágenes, o bien pueden transferirse esas imágenes a una película. Sin embargo, si queremos generar una imagen en tiempo real, debemos producir las imágenes de la secuencia con la suficiente rapidez como para que se perciba un movimiento continuo. Para una escena compleja, la generación de cada imagen de la animación puede ocupar la mayor parte del ciclo de refresco. En tal caso, los objetos que se generen primero se visualizarán durante la mayor parte de esc ciclo de refresco, pero los objetos generados hacia el final del mismo desaparecerán muy poco después de mostrarlos. Asimismo, en las animaciones muy complejas, el tiempo de generación de la imagen podría ser superior al tiempo necesario para refrescar la pantalla, lo que puede hacer que se perciban movimientos erráticos y que se muestren imágenes fracturadas. Puesto que las imágenes de la pantalla se generan a partir de los valores de píxel sucesivamente modificados que hay almacenados en el búfer de refresco, podemos aprovechar algunas de las características del proceso de refresco de pantalla en los sistemas de barrido con el fin de generar rápidamente las secuencias de animación.
Doble búfer Un método para producir una animación en tiempo real con un sistema de barrido consiste en emplear dos búferes de refresco. Inicialmentc, creamos una imagen para la animación en uno de los búferes. Después, mientras se refresca la pantalla a partir del contenido de dicho búfer, construimos la imagen siguiente de la secuencia en el otro búfer. Cuando dicha imagen se complete, cambiamos los roles de los dos búferes para que las rutinas de refresco utilicen el segundo búfer mientras se crea la siguiente imagen de la secuencia en el siguiente búfer. Este proceso alternativo de conmutación de búferes continua mientras dure la secuencia. Las bibliotecas gráficas que permiten tales operaciones suelen disponer de una función para activar la rutina de doble búfer y otra función para intercambiar los papeles de los dos búferes. Cuando se realiza una llamada para conmutar los dos búferes de refresco, el intercambio puede realizarse en diversos instantes. La implemenlación más sencilla consiste en conmutar los búferes al final del ciclo de refresco actual, durante el retorno vertical del haz de electrones. Si un programa puede completar la construcción de una imagen dentro del tiempo que dura un ciclo de refresco, como por ejemplo ¿ d e segundo, la secuencia animada se mostrará de forma sincronizada con la tasa de refresco de pantalla. Pero si el tiempo necesario para construir una imagen es mayor que el tiempo de refresco, la imagen actual se mostrará durante dos o más ciclos de refresco mientras se genera la siguiente imagen de la secuencia de animación. Por ejemplo, si la tasa de refresco de pantalla es de 60 imágenes por segundo y se t a r d a d de segundo en construir cada nueva imagen de la secuencia, las imágenes se mostrarán en pantalla dos veces y la velocidad de animación será únicamente de 30 imágenes por segundo. De forma similar, si el tiempo de construcción de una nueva imagen es de ¿ de segundo, la velocidad de imagen de la animación se reduce a 20 imágenes por segundo, ya que cada una de las imágenes tendrá que ser mostrada tres veces. Con la técnica de doble búfer pueden aparecer velocidades de animación irregulares cuando el tiempo de generación de cada imagen está muy próximo a un múltiplo entero del tiempo de refresco de pantalla. Como ejemplo de esto, si la velocidad de refresco de pantalla es de 60 imágenes por segundo, podría producirse una velocidad de animación errática si el tiempo de construcción de la imagen estuviera muy próximo a ¿ d e
13.2 Diseño de secuencia de animación
757
segundo, j^-de segundo o ^ d e segundo, etc. Debido a las pequeñas variaciones en el tiempo de ejecución de las rutinas que generan las primitivas y sus atributos, algunas imágenes podrían requerir algo más de tiempo para generarse y otras podrían requerir un tiempo más corto. Eso podría hacer que la velocidad de animación cambiara de forma abrupta y errática. Una forma de compensar este efecto consiste en añadir un pequeño retardo temporal al programa, mientras que otra posibilidad es alterar los movimientos o la descripción de la escena con el fin de acortar el tiempo de construcción de las imágenes.
Generación de animaciones mediante operaciones de barrido También podemos generar animaciones en tiempo real en los sistemas de barrido, para algunas aplicaciones limitadas, utilizando la transferencia en bloque de matrices rectangulares de píxeles. Esta técnica de animación se utiliza a menudo en los programas de juegos. Como hemos visto en la Sección 5.6, un método simple para mover un objeto de una ubicación a otra en el plano xy consiste en transferir el grupo de píxeles que definen la forma del objeto hasta una nueva ubicación. Las rotaciones bidimensionales en múltiplos de 90° también son simples de realizar, e incluso podemos rotar bloques rectangulares de píxeles otros ángulos distintos, siempre que utilicemos procedimientos de antialiasing. Para una rotación que no sea un múltiplo de 90°, necesitamos estimar el porcentaje de recubrimiento de área correspondiente a los píxeles que se solapan con el bloque rotado. Pueden ejecutarse secuencias de operaciones de barrido para obtener una animación en tiempo real de objetos bidimensionales o tridimensionales, siempre que restrinjamos la animación a movimientos dentro del plano de proyección. Entonces, no será necesario invocar algoritmos de proyección ni de detección de superficies visibles. También podemos animar los objetos según trayectorias de movimiento bidimensionales utilizando tablas de transformación de colores. Con este método, predefinimos el objeto en posiciones sucesivas a lo largo de la trayectoria de movimiento y asignamos a los sucesivos bloques de pixeies una serie de entradas en la tabla de color. Los píxeles correspondientes a la primera posición del objeto se configuran con un color de primer plano y los píxeles de las demás posiciones del objeto se configuran con el color de fondo. La animación se consigue entonces cambiando los valores de la tabla de colores, de modo que el color del objeto en las posiciones sucesivas a lo largo del trayecto de animación se vaya transformando en el color de primer plano, a medida que la posición precedente se configura con el color de fondo (Figura 13.1).
13.2 DISEÑO DE SECUENCIAS DE ANIMACIÓN La construcción de una secuencia de animación puede ser una tarea complicada, particulannente cuando requiere un guión y múltiples objetos, cada uno de los cuales puede moverse de diferente forma. Un enfoque básico consiste en diseñar tales secuencias de animación mediante las siguientes etapas de desarrollo: •
Realización del guión.
•
Definición de los objetos.
•
Especificación de los fotogramas clave.
•
Generación de los fotogramas intennedios.
FIGURA 13.1. Animación en tiempo real en un sistema de barrido mediante una tabla de colores.
758
CAPÍTULO 13
Animación por computadora
El guión es un resumen de la acción en el que se define la secuencia de movimiento como el conjunto de sucesos básicos que deben tener lugar. Dependiendo del tipo de animación que haya que producir, el guión puede estar compuesto por un conjunto de burdos dibujos y una breve descripción de los movimientos, o puede ser simplemente una lista de las ideas básicas que describen la acción. Originalmente, ese conjunto de burdos dibujos que describen el guión se solía fijar en un panel de gran tamaño que se utilizaba para presentar una vista global del proyecto de animación. De aquí proviene el nombre ingles «stotyhoard». Para cada participante en la acción se proporciona una definición del objeto. Los objetos pueden definirse en términos de las formas básicas, como por ejemplo polígonos o splines superficiales. Además, suele proporcionarse una descripción de los movimientos que tengan que realizar cada personaje u objeto descrito en el guión. Un fotograma clave es un dibujo detallado de la escena en un cierto momento de la secuencia de animación. Dentro de cada fotograma clave, cada objeto (o personaje) se posiciona de acuerdo con el tiempo correspondiente a dicho fotograma. Algunos fotogramas clave se eligen en las posiciones extremas de la acción, mientras que otros se espacian para que el intervalo de tiempo entre un fotograma clave y el siguiente no sea excesivo. Para los movimientos intrincados se especifican más fotogramas clave que para los movimientos simples o lentos. El desarrollo de los fotogramas clave suele, por regla general, ser responsabilidad de los animadores expertos, siendo normal que se asigne un animador distinto para cada personaje de la animación. Los fotogramas intermedios (in-betsveens) son los comprendidos entre los sucesivos fotogramas clave. El número total de imágenes o fotogramas, y por tanto el número total de fotogramas intermedios, necesarios para una animación vendrá determinado por el medio de visualización que se utilice. Las películas requieren 24 imágenes por segundo, mientras que los terminales gráficos se refrescan con una tasa de 60 o más imágenes por segundo. Normalmente, los intervalos temporales de la secuencia se configuran de tal modo que haya entre tres y cinco fotogramas intermedios entre cada par de fotogramas clave sucesivos. Dependiendo de la velocidad especificada para la secuencia, será necesario definir más o menos fotogramas clave. Como ejemplo, una secuencia de película de un minuto de duración contiene un total de 1440 fotogramas; si se requieren cinco fotogramas intermedios entre cada par de fotogramas clave, entonces será necesario desarrollar 288 fotogramas clave.
FIGURA 13.2. Una imagen del galardonado corto animado Laxo Jr. Esta película fue diseñada utilizando un sistema de animación basado en fotogramas clave y técnicas de dibujos animados con el fin de que las lámparas se muevan con si estuvieran vivas. Las imágenes finales fueron obtenidas con múltiples fuentes luminosas y con técnicas de texturado procedimental. (Cortesía de Pixar. &Í986 Pixar.)
FIGURA 13.3. Un fotograma del corto Tin Toy, la primera película de animación por computadora que ganó un Osear. Diseñada mediante un sistema de animación basada en fotogramas clave, la película también requirió un detallado modelado de las expresiones faciales. Las imágenes finales fueron obtenidas utilizando sombreado procedimental, técnicas de auto-sombreado, desenfoque de movimiento y mapeado de texturas. (Cortesía de Pixar. É /988 Pixar.)
13.3 Técnicas tradicionales de animación
759
Puede que sea necesario llevar a cabo diversas otras tareas, dependiendo de la aplicación. Estas tareas adicionales incluyen la vcriticación del movimiento, la edición y la producción y sincronización de una banda sonora. Muchas de las funciones necesarias para producir animaciones generales se llevan ahora a cabo con ayuda de computadoras. Las Figuras 13.2 y 13.3 muestran ejemplos de imágenes generadas por computadora para secuencias de animación.
13.3 TÉCNICAS TRADICIONALES DE ANIMACIÓN Los profesionales que trabajan en la producción de películas animadas utilizan diversos métodos para mostrar y enfatizar secuencias de movimientos. Estos métodos incluyen la deformación de los objetos, el espaciado entre fotogramas de la secuencia, la anticipación y seguimiento del movimiento y el enfoque de la acción. Una de las técnicas más importantes para simular efectos de aceleración, particularmente para los objetos no rígidos, es la técnica de compresión y expansión. La Figura 13.4 muestra cómo se utiliza esta técnica para enfatizar la aceleración y deceleración de una bola que rebota contra el suelo. A medida que la bola acelera, comienza a expandirse. Cuando la bola impacta en el suelo y se detiene, primero se comprime y luego se vuelve a expandir a medida que acelera y rebota hacia arriba. Otra técnica utilizada por los profesionales de las películas animadas es la temporización, que hace referencia al espaciado entre fotogramas de la secuencia. Un objeto que se mueva más lentamente se representará mediante fotogramas con un espaciado menor, mientras que un objeto que se mueva rápidamente se mostrará distribuyendo menos fotogramas a lo largo de todo el trayecto de movimiento. Este, efecto se ilustra en la Figura 13.5, donde podemos ver que los cambios de posición entre un fotograma y otro se incrementan a medida que se acelera la bola en su caída. Los movimientos de los objetos también pueden enfatizarse creando acciones preliminares que indiquen una anticipación de un movimiento inminente. Por ejemplo, un persona de dibujos animados puede inclinar-
FIGURA 13.4. Ejemplo de rebote de una pelota donde se ilustra la técnica de «compresión y expansión» para enfatizar la aceleración de los objetos.
FIGURA 13.5. I.os cambios de posición entre l o W n . n a mas para el rebote de una bola se incrementan a medida que lo hace la velocidad de una bola.
760
CAPÍTULO 13
Animación por computadora
se hacia adelante y girar el cuerpo antes de comenzar a correr. O bien, otro personaje puede hacer un «molinillo» con los brazos antes de arrojar una bola. De forma similar, las acciones de seguimiento pueden utilizarse para enfatizar un movimiento anterior. Después de arrojar una bola, un personaje puede continuar moviendo el brazo hasta volver a acercarlo al cuerpo. O bien, el sombrero de la cabeza de un personaje que se lia detenido abruptamente puede salir volando. Asimismo, las acciones pueden enfatizarse mediante las técnicas de regulación del punto de atención, que hacen referencia a cualquier método que permita centrarse en una parte importante de la escena, como por ejemplo aquella parte donde un personaje está ocultando algo.
13.4 FUNCIONES GENERALES DE ANIMACIÓN POR COMPUTADORA Se han desarrollado muchos paquetes software para diseño de animaciones generales o para realizar tareas de animación especializadas. Las funciones de animación típicas incluyen la gestión del movimiento de los objetos, la generación de vistas de los objetos, la proyección de movimientos de la cámara y la generación de fotogramas intermedios. Algunos paquetes de animación, como por ejemplo Wavelront, proporcionan funciones especiales tanto para el diseño global de animación como para el procesamiento de objetos individuales. Otros son paquetes de propósito especial para características concretas de una animación, como por ejemplo los sistemas para generar fotogramas intermedios o los sistemas para animación de personajes. En los paquetes de animación generales se suele proporcionar un conjunto de rutinas para la gestión de la base de datos de objetos. Las formas de los objetos y sus parámetros asociados se almacenan y actualizan en la base de datos. Otras funciones de manejo de los objetos incluyen las necesarias para generar los movimientos de los objetos y las empleadas para representar las superficies de los objetos. Los movimientos pueden generarse de acuerdo con restricciones especificadas utilizando transformaciones bidimensionales o tridimensionales. Entonces, pueden aplicarse funciones estándar para identificar las superficies visibles y aplicar los algoritmos de representación. Otro conjunto típico de funciones simula los movimientos de la cámara. Los movimientos estándar de una cámara son el zoom, las panorámicas y los giros. Finalmente, dada la especificación de los fotogramas clave, pueden generarse automáticamente los fotogramas intermedios.
13.5 LENGUAJES DE ANIMACIÓN POR COMPUTADORA Podemos desarrollar rutinas para diseñar y controlar las secuencias de animación mediante un lenguaje de programación de propósito general, como C, C + -F, Lisp o Fortran, pero también se han desarrollado diversos lenguajes especializados de animación. Estos lenguajes incluyen normalmente un editor gráfico, un generador de fotogramas clave, un generador de fotogramas intermedios y una serie de rutinas gráficas estándar, El editor gráfico permite al animador diseñar y modificar formas de objetos, utilizando splines de superficie, métodos constructivos de geometría sólida u otros esquemas de representación. Una tarea importante dentro de la especificación de la animación es la descripción de la escena. Esto incluye el posicionamiento de los objetos y las fuentes luminosas, la definición de los parámetros fotométricos (intensidades de las fuentes luminosas y propiedades de iluminación de las superficies) y la configuración de los parámetros de la cámara (posición, orientación y características del objetivo). Otra función estándar en este tipo de lenguajes es la especificación de acciones, que implica la disposición de las trayectorias de movimiento correspondientes a los objetos y a la cámara. Y también necesitamos las rutinas gráficas usuales: transformaciones de visualización y de perspectiva, transformaciones geométricas para generar movimientos de los objetos en función de las aceleraciones o especificaciones de proyectos cinemáticos, identificación de superficies visibles y operaciones de representación de las superficies. Los sistemas de fotogramas clave fueron diseñados originalmente como un conjunto separado de las rutinas de animación para generar los fotogramas intermedios a partir de los fotogramas clave especificados por los usuarios. Ahora, estas rutinas suelen formar parte de paquetes de animación más generales, En el caso más
13.6 Sistemas de fotogramas clave 761
Extensión
FIGURA 13.6. Grados de libertad para un robot estacionario de un único brazo.
FIGURA 13.7. Grados de libertad de traslación y rotación para la base del brazo robolizado.
simple, cada objeto de la escena se define como un conjunto de cuerpos rígidos conectados en las uniones y con un número limitado de grados de libertad. Por ejemplo, el robot de un único brazo de la Figura 13.6 tiene seis grados de libertad, que se denominan barrido del bra^o, movimiento del hombro, extensión del codo, inclinación, orientación y giro. Podemos ampliar el número de grados de libertad de este brazo robolizado a nueve permitiendo una traslación tridimensional de la base (Figura 13.7). Si también permitimos rotaciones de la base, el brazo robotizado puede tener un total de doce grados de libertad. Por comparación, el cuerpo humano tiene más de 200 grados de libertad. Los sistemas paramelrizados permiten especificar las características del movimiento de los objetos como parte de la definición de esos mismos objetos. Los parámetros ajustables controlan características de los objetos tales como grados de libertad, las limitaciones del movimiento y los cambios permitidos en la forma. Los sistemas de siripi permiten definir las especificaciones de los objetos y las secuencias de animación mediante un siripi introducido por el usuario. Mediante el scrípi, puede construirse una biblioteca de objetos y movimientos diversos.
13.6 SISTEMAS DE FOTOGRAMAS CLAVE Puede utilizarse un sistema de fotogramas clave para generar un conjunto de fotogramas intermedios a partir de la especificación de dos (o más) fotogramas clave. Los trayectos de movimiento pueden especificarse mediante una descripción cinemática como un conjunto de splines curvas, o bien pueden fundamentarse físicamente los movimientos especificando las fuerzas que actúan sobre los objetos que hay que animar. Para las escenas complejas, podemos separar los fotogramas en componentes u objetos individuales denominados cels (transparencias de celuloide). Este término fue acuñado en el mundo de las técnicas de dibujos animados, donde el fondo y cada uno de los personajes de una escena se dibujaba en una transparencia separada. Entonces, apilando las transparencias por orden, desde el fondo hasta el primer plano, se fotografiaba el conjunto para obtener el fotograma completo. Con este sistema, se utilizan los trayectos de animación especificados para obtener el siguiente cel de cada personaje, interpolando las posiciones a partir de los tiempos correspondientes a los fotogramas clave. Con transformaciones complejas de los objetos, las formas de los objetos pueden cambiar a lo largo del tiempo. Como ejemplos podríamos citar las ropas, las características faciales, las ampliaciones de determinados detalles, las formas evolutivas y la explosión o desintegración de los objetos. Para las superficies descritas con mallas poligonales, estos cambios pueden dar como resultado modificaciones significativas en la forma de los polígonos, por lo que el número de vistas de un polígono podría ser distinto entre un fotograma y el siguiente. Estos cambios se incorporan en el desarrollo de los fotogramas intermedios añadiendo o eliminando aristas a los polígonos de acuerdo con los requisitos impuestos por los fotogramas clave correspondientes.
762
CAPÍTULO 13
Animación por computadora
Morfismo La modificación de la forma de un objeto, para que éste adopte una forma distinta, se denomina morfismo, palabra que proviene de «metamorfosis». L'n animador puede modelar un morfismo haciendo que las formas de los polígonos efectúen una transición a lo largo de los fotogramas intermedios comprendidos entre un fotograma clave y el siguiente. Dados dos fotogramas clave, cada uno de ellos con un número diferente de segmentos de línea que especifican la transformación de un objeto, podemos primero ajustar la especificación del objeto en uno de los fotogramas de modo que el número de aristas poligonales (o el número de vértices de los polígonos) sea el mismo para los dos fotogramas. Esta etapa de preprocesamienlo se ilustra en la Figura 13.8. Un segmento de línea recta en el fotograma clave k se transforma en dos segmentos de línea en el fotograma clave k + I. Puesto que el fotograma A' + I. tiene un vértice adicional, añadimos un vértice entre los vértices I y 2 en el fotograma clave k para equilibrar el número de vértices (y aristas) en los dos fotogramas clave. Utilizando interpolación lineal para generar los fotogramas intermedios, efectuamos la transición del vértice añadido en el fotograma clave k hacia el vértice 3' según el trayecto lineal mostrado en la Figura 13.9. En la Figura 13.10 se proporciona un ejemplo de un triángulo que se expande linealmente en un cuadrilátero. Las Figuras 13.11 y 13.12 muestran ejemplos de morfismo en anuncios de televisión. Podemos enunciar reglas de procesamiento generales para ecualizar los fotogramas clave en términos del número de aristas o del número de vértices que haya que añadir a un fotograma clave. Vamos a considerar primero la ecualización del número de aristas, donde los parámetros L y denotan el número de segmentos de línea en dos fotogramas consecutivos. El número máximo y mínimo de líneas que habrá que ecualizar será k
L min
N,=L
nrM
modL
(i N =mt s
min(/, ., x
UH)
L ) k+]
nu
\
íj*
2
FIGURA 13.8. lina ansia con dos vértices I y t en el fotograma clave k evoluciona para convertirse en dos aristas conectadas en fotograma clave i + 1.
FIGURA 13.9. Interpolación lineal para transformar un segmento de línea en el fotograma clave k en dos segmentos de línea conectados en el fotograma clave k + 1.
Fotograma clave k
Fotograma clave
Fotograma clavo k + I
Fotograma intermedio
l'üiograum clave
k
+ I
1.1.6 Sistemas de fotogramas clave 7 6 3
Punu> .lll.i.lulo
ciave I
k• FIGURA 13.10. Interpolación lineal para transformar un triángulo en un cuadrilátero.
(c)
ith
FIGURA 13.11. Transformación de una lata de aceite para automóviles STP en un motor de automóvil. {Cortesiu de Silit ún Graphics, Inc.) Las etapas de preprocesamiento para la eeualización de aristas pueden llevarse a cabo entonces con los dos siguientes procedimientos: (!)
Dividir A', aristas de fotognimitclave ^ en pL + I secciones. (
y
m
(2)
Dividir las líneas restantes de jotogramüclave en N secciones. Como ejemplo, si L = 15 y 7 - ^ , = 11, dividiríamos cuatro líneas de fotogramaclave ^, en dos secciones cada una. Las líneas restantes de fotogramoclave ¡ se dejan intactas. Si eeuali/amos el número de vórtices, podemos utilizar los parámetros V y para denotar el número de vértices en dos fotogramas clave consecutivos. En este caso, determinamos los números máximo y mínimo de vértices de la forma siguiente: mm
s
k
k
ki
k
A continuación calculamos los siguientes dos valores:
764
CAPÍTULO 13
Animación por computadora
min
N„ = int p
Estos dos valores se utilizan entonces para llevar a cabo la ecualización de vértices mediante los procedimientos; (1) Añadir N puntos N secciones de línea de fotogramaciave . p
(2)
Añadir N p
is
mm
1 puntos a las aristas restantes dcfotogramacIave . mtn
Para el ejemplo de transformación de un triángulo en un cuadrilátero, V = 3 y = 4. Tanto N como N son I, por lo que añadiríamos un punto a una arista átfologramaclave . No se añadiría ningún punto a las líneas restantes de Jótogramaclave . k
f}
¡s
k
k
Simulación de aceleraciones A menudo se utilizan técnicas de ajuste de curvas para especificar los trayectos de animación entre fotogramas clave. Dadas las posiciones de los vértices en los fotogramas clave, podemos ajustar las posiciones mediante trayectos lineales o no lineales. La Figura 13.13 ilustra un ajuste no lineal de las posiciones en los fotogramas clave. Y para simular aceleraciones, podemos ajustar el espaciado temporal correspondiente a los fotogramas intermedios. Si el movimiento debe tener lugar a velocidad constante (aceleración cero), utilizamos intervalos temporales iguales para los fotogramas intermedios. Por ejemplo, con n fotogramas intermedios y con sendos tiempos jj y t para los fotogramas clave (Figura 13.14), el intervalo temporal entre los fotogramas clave se divide en n + 1 subintervalos iguales, lo que nos da un espaciado de los fotogramas intermedios igual a: 2
13.6 Sistemas de fotogramas clave 7 6 5
Fotograma clave k+2
Fotograma clave
Intermedio
FIGURA 13.13. Ajuste de las posiciones de los vértices en los fotogramas clave mediante splines no lineales.
-|
1
j-
k
A/
FIGURA 13.14. Posiciones de los fotogramas intermedios para movimiento a velocidad constante.
At=
2
(1-15)
n+l El tiempo correspondiente al fotograma intermedio /-ésimo será: ^=r
I +
,/A,
, = l,2.--,«
t
№M
y este tiempo se utiliza para calcular las coordenadas de posición, los colores y otros parámetros físicos para
dicho fotograma de la secuencia. Usualmenle, hacen falta cambios de velocidad (aceleración distinta de cero) en algún punto de las secuencias de animación o de dibujos animados, particularmente al principio y al Ilnal de un movimiento. Las partes de arranque y de parada de un trayecto de animación se suelen modelar con splines o funciones trigonométricas, pero también se han aplicado funciones temporales parabólicas y cúbicas para modelar las aceleraciones. Los paquetes de animación suelen proporcionar funciones trigonométricas para simular las aceleraciones. Para modelar una velocidad creciente (aceleración positiva), lo que puede hacerse es incrementar el espaciado temporal entre fotogramas, de modo que se produzcan cambios más grandes en la posición a medida que aumenta la velocidad del objeto. Podemos obtener un tamaño creciente para el intervalo temporal mediante la función: I - eos
a,
0<
6< n/1
Para n fotogramas intermedios, el tiempo correspondiente al fotograma intennedio /-ésimo se calcularía como: 1-cos
№ 2(#i
+ J).
j = 1,2, • • -, n
766
CAPÍTULO 13
Ainmacióu por computadora
FIGURA 13.15. Una función de aceleración Irigonomélriea y el correspondiente espaciado de fotogramas intermedios para n = 5 y 6 = j7t/\2 en la Ecuación 13.7, lo que produce cambios crecientes en los valores de las coordenadas a medida que el objeto pasa de un intervalo temporal a otro. donde Al es la diferencia de tiempo entre los dos fotogramas clave. La figura 1 3 . 1 5 muestra una gráfica de la función trigonométrica de aceleración y del espaciado de los fotogramas intermedios para n = 5. Podemos modelar una velocidad decreciente (deceleración) utilizando la función sin ft con 0 < 6< nfi. El tiempo correspondiente a un fotograma intermedio se determina entonces mediante la fórmula
7 = 1.2,
tfí, =t. + A / s i n ^ ^ — ' 2(« + l)
n
(13.8)
1
En la Figura 13.16 se muestra una g r á f i c a de esta función y el tamaño decreciente de los intervalos temporales, para cinco fotogramas intermedios.
I
tB
t
I
I
I
M |
FIGURA 13.16. Una función de deceleración trigonométrica y el correspondiente espaciado de los fotogramas intermedios para n = 5 y 9 = fiíí\2 en lu Ecuación 13.8, lo que produce cambios decrecientes en las coordenadas a medida que el objeto pasa de un intervalo temporal a otro.
13.7 Especificaciones de movimiento
767
FIGURA 13.17. La función trigonométrica de aceleración-deceleración (1 - eos 0)/2 y el correspondienie espaciado de los fotogramas intermedios para // == 5 en la Ecuación 13.9. A menudo los movimientos contienen tanto aceleraciones como frenados. Podemos modelar una combinación de velocidad creciente-decreciente incrementando primero el espaciado temporal de los fotogramas intermedios y luego reduciéndolo. Una función para poder conseguir estos cambios de carácter temporal es: -(1-COS0),
"2.
0<0<7t/2
El tiempo correspondiente al fotograma intermedio /-ésimo se calculará ahora como:
»,.,,+*{'-""«**"»'}.
J-m-m.
na
donde A/ denota la diferencia temporal entre dos fotogramas clave. Los intervalos temporales para un objeto en movimiento se incrementarán primero y luego se reducirán, como se muestra en la Figura 13.17. El procesamiento de los fotogramas intermedios se simplifica si modelamos inicialmenle objetos «esqueleto» (alámbricos), de modo que puedan ajustarse interactivamente a las secuencias de movimiento. Después de definir completamente la secuencia de animación, puede proeederse a obtener la representación de los objetos en imágenes.
13.7 ESPECIFICACIONES DE MOVIMIENTOS Los métodos generales para describir una secuencia de animación van desde la especificación explícita de las trayectorias de movimiento hasta una descripción de las interacciones que producen dichos movimientos. Así, podemos definir el modo en que una animación debe transcurrir proporcionando los parámetros de transformación, los parámetros de las trayectorias de movimiento, las fuerzas que deben actuar sobre los objetos o los detalles sobre cómo interactúan los objetos con el fin de producir movimientos.
Especificación directa del movimiento El método más simple para definir una animación consiste en la especificación directa del movimiento, lo que nos da los parámetros de transformación geométrica. Con este método, lo que hacemos es configurar explíci-
768
CAPÍTULO 13
Animación por computadora
•
•
••
FIGURA 13.18. Aproximación del movimiento de una bola que rebota sobre el suelo mediante una función seno amortiguada (Ecuación 13.10). tamenle los valores de los ángulos de rotación y de los vectores de traslación. A continuación, se aplican las matrices de transformación geométrica para transformar las posiciones de coordenadas. Alternativamente, podríamos usar una ecuación de aproximación en la que apare/can estos parámetros para especificar ciertos tipos de movimientos. Por ejemplo, podemos aproximar la trayectoria de una bola que rebote en el suelo utilizando una curva seno amortiguada y rectificada (Figura 13.18): y(x) = A\
SÍII(ÚK
+
fl^l*"**'
(/5.70)
donde A es la amplitud inicial (altura de la bola sobre el suelo), íoes la frecuencia angular, 0 es el ángulo de fase y A es el coeficiente de amortiguamiento. Este método de especificación del movimiento resulta particularmente útil para las secuencias de animación simples programas por el usuario. 0
Sistemas dirigidos por objetivos fin el extremo opuesto, podemos especificar los movimientos que deben tener lugar en términos generales que describan de manera abstracta las acciones en función de los resultados finales. En otras palabras, una animación se especifica en términos del estado final de los movimientos. Estos sistemas se denominan dirigidos por objetivos, ya que los valores de los parámetros de movimiento se determinan a partir de los objetivos de la animación. Por ejemplo, podríamos especificar que un determinado objeto debe «caminar» o «correr» hasta un destino concreto. O podríamos especificar que queremos que el objeto «agarre» a algún otro objeto especificado. Las directivas de entrada se interpretan entonces en términos de los movimientos componentes que permitirán llevar a cabo la tarea descrita. El movimiento de los seres humanos, por ejemplo, puede definirse como una estructura jerárquica de submovimiento para el torso, los miembros, etc. Así, cuando se proporciona un objeto tal como «caminar hasta la puerta» se calculan los movimientos requeridos del torso y de los miembros para llevar a cabo está acción.
Cinemática y dinámica También podemos construir secuencias de animación utilizando descripciones cinemáticas o dinámicas. Con una descripción cinemática, especificamos la animación proporcionando los parámetros de movimiento (posición, velocidad y aceleración) sin referencia a las causas ni a los objetivos del movimiento. Para una velocidad constante (aceleración cero), designamos los movimientos de los cuerpos rígidos de una escena proporcionando una posición inicial y un vector de velocidad para cada objeto. Como ejemplo, si la velocidad se
13.8 Animación de figuras articuladas
769
específica como (3, 0, —4) km/seg, entonces este vector proporcionará la dirección de la trayectoria lineal de movimiento y la velocidad (módulo del vector) será igual a 5 km/seg. Si también especificamos las aceleraciones (tasa de cambio de la velocidad), podemos modelar arranques, paradas y trayectos de movimiento curvos. La especificación cinemática de un movimiento también puede proporcionarse simplemente describiendo la trayectoria del movimiento. Esto se suele hacer mediante curvas de úpospline. Un enfoque alternativo consiste en utilizar cinemtttica inversa. Con este método, especificamos las posiciones inicial y final de los objetos en instantes determinados y es el sistema el que se encarga de calcular los parámetros del movimiento. Por ejemplo, suponiendo una aceleración cero, podemos determinar la velocidad constante que pennitirá conseguir el movimiento de un objeto desde la posición inicial hasta la posición final. Este método se suele utilizar para objetos complejos proporcionando las posiciones y orientaciones de un nodo terminal de un objeto, como por ejemplo una mano o un pie. El sistema determina entonces los parámetros de movimiento de los otros nodos que hacen falta para conseguir el movimiento deseado. Las descripciones dinámicas, por el contrario, requieren la especificación de las fuerzas que producen las velocidades y aceleraciones. La descripción del comportamiento de los objetos en términos de la influencia de las fuerzas se suele denominar modelado físico (Capítulo 8). Como ejemplos de fuerzas que afectan al movimiento de los objetos podemos citar las fuerzas electromagnéticas, gravitatorias, de fricción y otras fuerzas mecánicas. Los movimientos de los objetos se obtienen a partir de las ecuaciones de las fuerzas que describen leyes físicas, como por ejemplo las leyes de Newton del movimiento para los procesos gravilalorios y de fricción, las ecuaciones de Euler o de Navier-Stokes que describen el flujo de Huidos y las ecuaciones de Maxwell para las fuerzas electromagnéticas. Por ejemplo, la forma general de la segunda ley de Newton para una partícula de masa m es:
F = 4(«'V)
(13.11)
di donde F es el vector de la fuerza y v es el vector velocidad. Si la masa es constante, resolvemos la ecuación F = /wa, donde a representa el vector de aceleración. En caso contrario, la masa será una función del tiempo, como sucede en el movimiento relativista o en el movimiento de naves espaciales que consuman cantidades no despreciables de combustible por unidad de tiempo. También podemos utilizar la dinámica inversa para obtener las fuerzas, dadas las posiciones inicial y final de los objetos y el tipo de movimiento requerido. Entre las aplicaciones del modelado tísico se incluyen los sistemas complejos de cuerpos rígidos y también otros sistemas no rígidos como las ropas y los materiales plásticos. Normalmente, se utilizan métodos numéricos para obtener los parámetros de movimiento incrementalmente a partir de las ecuaciones dinámicas, utilizando condiciones iniciales de valores de contorno.
13.8 ANIMACIÓN DE FIGURAS ARTICULADAS Una técnica básica para animar personajes humanos, animales, insectos y otras criaturas consiste en modelarlas como figuras articuladas, que son estructuras jerárquicas compuestas de un conjunto de enlaces rígidos conectados mediante uniones rotatorias (Figura 13.19). En términos menos formales, esto simplemente quiere decir que modelamos los objetos animados como si fueran esqueletos simplificados, los cuales podemos envolver luego con superficies que representen la piel, el pelo, las plumas, las ropas u otros tipos de recubrimientos. Los puntos de conexión de una figura articulada se sitúan en los hombros, las caderas, las rodillas y otras articulaciones del esqueleto, y esos puntos de unión siguen unas trayectorias de movimiento especificadas a medida que el cuerpo se traslada. Por ejemplo, cuando se especifica un movimiento para un objeto, el hombro se mueve automáticamente de una cierta forma y, a medida que el hombro se mueve, los brazos también lo hacen. Con estos sistemas, se definen diferentes tipos de movimientos, como por ejemplo andar, correr o sallar, y esos movimientos se asocian con movimientos concretos de las uniones y de los enlaces conectados a ellas.
770
CAPÍTULO 13
Animación por computadora
FIGURA 13.20. Posibles ungimientos para un conjunto ele enlaces conectados que representan una pierna llevando a cabo la acción de andar. Por ejemplo, podríamos definir como en la Figura 13.20 un conjunto de movimientos para una pierna que estuviera efectuando la acción de andar. La articulación de la cadera se mueve hacia adelante según una línea horizontal, mientras que los enlaces conectados realizan una serie de movimientos en torno a las articulaciones de la cadera, de la rodilla y del talón. Comenzando con una pierna recta (Figura I3.2()(a)>. el primer movimiento consiste en doblar la rodilla a medida que la cadera se mueve hacia adelante (Figura I3.20(b)). Entonces, la pierna avanza, vuelve a la posición vertical y empuja hacia atrás, como se muestra en las Figuras 13.20(c), (d) y (e). Los movimientos finales son un movimiento amplio hacia atrás y una vuelta a la posición vertical, como en las Figuras 13.20(1) y (g). Este ciclo de movimiento se repite mientras dure la animación, a medida que el personaje recorre una distancia especificada o hasta que transcurra un determinado intervalo de tiempo. A medida que se mueve un personaje, se incorporan otros movimientos a las diversas articulaciones. Puede aplicarse un movimiento sinusoidal, a menudo de amplitud variable, a las caderas para que éstas se muevan con respecto al torso. De la misma forma, puede aplicarse un movimiento giratorio a los hombros y también la cabeza puede moverse hacia arriba y hacia abajo. En la animación de personajes se utilizan tanto descripciones cinemáticas del movimiento como descripciones basadas en cinemática inversa. La especificación del movimiento de las articulaciones suele ser una tarea no demasiado complicada, pero la cinemática inversa puede también resultar útil para generar moví-
13.9 Movimientos periódicos
771
míenlos simples sobre un terreno arbitrario. Para una figura complicada, la cinemática inversa puede no producir una secuencia de animación única, ya que, por ejemplo, puede que sean posibles muchos movimientos rotatorios distintos para un conjunto especificado de condiciones iniciales y finales. En tales casos, puede obtenerse una solución única añadiendo más restricciones al sistema, como por ejemplo el principio de conservación de la cantidad de movimiento.
13.9 MOVIMIENTOS PERIÓDICOS Cuando construimos una animación con patrones de movimiento repetitivos, como por ejemplo un objeto giratorio, necesitamos asegurarnos de nniestrear el movimiento (Sección 4.17) con la suficiente frecuencia como para representar los movimientos correctamente. En otras palabras, el movimiento debe estar sincronizado con la tasa de generación de imágenes, para poder mostrar un número de imágenes por ciclo lo suficientemente alto como para que se perciba el movimiento real. En caso contrario, puede que la animación se visualice de forma incorrecta. Un ejemplo típico de imágenes de movimiento periódico submuestreadas es la rueda de tren en una película del Oeste que parece estar girando en la dirección incorrecta. La Figura 13.21 ilustra un ciclo completo de la rotación de una rueda de tren, con un radio de distinto color que da 18 vueltas por segundo en el sentido de las agujas del reloj. Si este movimiento se graba en una película a la velocidad normal de proyección de 24 imágenes por segundo, entonces las primeras cinco imágenes correspondientes a este movimiento serian las que se muestran en la Figura 13.22. Puesto que la rueda completa 7 de vuelta cada 37 de segundo, sólo se genera un fotograma de la animación por cada ciclo y la rueda parece estar girando en la dirección opuesta (en sentido contrario a las agujas del reloj).
(a) 0 seg.
0» 1/72 seg.
(C) 1/36 seg.
(d) 1/24 seg.
(e) se*;.
1/1S
FIGURA 13.21. Cinco posiciones del radio durante un ciclo de movimiento de una rueda que está girando a l 8 revoluciones por segundo.
Fotograma O 0 seg.
Fotograma I 1/24 scg.
Fotograma 2 2/24 seg.
Fotograma 3 3/24 seg.
Fotograma 4 4/24 seg
FIGURA 13.22. Los cinco primeros fotogramas de película para la rueda giratoria de la Figura 13.21, producidos con una velocidad de 24 imágenes por segundo.
772
CAPÍTULO 13
Animación por computadora
En las animaciones generadas por computadora, podemos controlar la velocidad de muestreo de un movimiento periódico ajustando los parámetros de movimiento. Por ejemplo, podemos configurar el incremento angular para el movimiento de un objeto giratorio de modo que se generen múltiples fotogramas en cada revolución. Así, un incremento de 3° para un ángulo de rotación produce 120 pasos de movimiento durante una revolución, mientras que un incremento de 4 genera 90 posiciones. Para movimientos más rápidos, pueden utilizarse pasos de rotación más amplios, siempre y cuando el número de muestras por ciclo no sea demasiado pequeño y el movimiento se visualice claramente. Cuando haya que animar objetos complejos, también deberemos tener en cuenta el efecto que el tiempo de generación del fotograma pueda tener sobre la tasa de refresco, como se explica en la Sección I3.I. El movimiento de un objeto complejo puede ser mucho más lento de lo que deseamos si se tarda demasiado en generar cada fotograma de animación. Otro factor que tenemos que consideraren la visualización de un movimiento repetitivo es el efecto de los redondeos en los cálculos de los parámetros de movimiento. Como hemos observado en la Sección 5 A, podemos reinicializar periódicamente los valores de los parámetros para evitar que la acumulación de los errores produzca movimientos erráticos. Para una rotación continua, podríamos reinicializar los valores de los parámetros una vez por ciclo (360°). o
13.10 PROCEDIMIENTOS DE ANIMACIÓN EN QpenGL En la biblioteca básica hay disponibles operaciones de manipulación de imágenes de barrido (Sección 5,7) y funciones de asignación de índices de colores, mientras que en GLUT hay disponibles rutinas para modificar los valores de las tablas de colores (Sección 4.3). Otras operaciones de animación por barrido sólo están disponibles como rutinas GLUT, porque dependen del sistema de gestión de ventanas que se utilice. Además, algunas características para animación por computadora tales como el doble búfer pueden no estar incluidas en algunos sistemas hardware. Las operaciones de doble búfer, si están disponibles, se activan utilizando el siguiente comando GLUT: glutlnitDisplayMode
{GLUTJDOUBLE) ;
Esto proporciona dos búferes, denominados búfer frontal y búfer trasero, que podemos utilizar alternativamente para refrescar la imagen de pantalla. Mientras uno de los búferes actúa como búfer de refresco para la ventana de visualización actual, puede irse construyendo la siguiente imagen de la animación en el otro búfer. Podemos especificar cuándo hay que intercambiar los roles de los dos búferes mediante el comando: glutSwapBuffers
{
) ;
Para determinar si están disponibles las operaciones de doble búfer en un sistema, puede efectuarse la siguiente consulta: glGetBooleanv
(GL DOUBLEBUFFER,
status);
Se devolverá un valor G L T R U E al parámetro de matriz s t a t u s si hay disponibles en el sistema tanto un búfer frontal como otro trasero. En caso contrario, el valor devuelto es G L _ F A L S E . Para una animación continua, también podemos usar: glutldleFunc
{animationFcn);
donde al parámetro a n i m a t i o n F c n se le puede asignar el nombre de un procedimiento que se encargue de realizar las operaciones de incremento de los parámetros de animación. Este procedimiento se ejecutará de modo continuo cuando no haya sucesos de la ventana de visualización que procesar. Para desactivar la función g l u t l d l e F u n c , podemos asignar a este argumento el valor NTJLL O el valor 0. En el siguiente fragmento de código se proporciona un ejemplo de programa de animación que hace girar de modo continuo un hexágono regular en el plano xy en torno a un eje z. El origen de las coordenadas de pantalla tridimensionales se coloca en el centro de la ventana de visualización, de modo que el eje r pasa a través
13.10 Procedimientos de animación en OpenGL
773
de esta posición central. En el procedimiento i n i t , utilizamos una lista de visualización para especificar la descripción del hexágono regular, cuya posición central está originalmente en la posición (150, 150) de las coordenadas de pantalla y que tiene un radio (distancia desde el centro del polígono a cualquiera de sus vértices) igual a 100 píxeles. En la función de visualización, d i s p l a y H e x , especificamos una rotación inicial de 0° en torno al eje z e invocamos la rutina g l u t S w a p B u f f e r s . Para activar la rotación, utilizamos el procedimiento m o u s e F c n que incrementa continuamente el ángulo d e rotación en 3 cuando pulsamos el botón central del ratón.. El cálculo del ángulo de rotación incrementado se lleva a cabo en el procedimiento r o t a t e H e x , que e s invocado por la rutina g l u t l d l e F u n c en el procedimiento m o u s e F c n . Detenemos la rotación pulsando el botón derecho del ratón, lo que hace que se invoque g l u t l d l e F u n c con un argumento U
NULL.
#include
#include
# include
< stcU ib.h>
c o n s t d o u b l e TWO_PI GLsizei
winWidth
=
=
6.2831853;
500,
winHeight
=
500;
GLuint r e g H e x ; static
//
GLfloat
class
scrPt
rotTheta
=
//
Tamaño i n i c i a l
Definir
nombre
para
ventana v i s u a l i z a c i ó n . lista
visualización.
0.0;
{
public: GLint
x,
static scrPt
y;
void
init
hexVertex;
GLdouble GLint
hexTheta;
k;
glClearColor /*
(1.0,
Establecer
+
Los
*
=
glBegin
(1.0,
son
seis
circunferencia.
puntos
hexágono
*/
(1);
GL_COMPILE) ; 0.0,
(k =
0;
hexTheta
0.0);
k < 6; =
/ 6;
=
150
+
100
*
eos
(hexTheta);
hexVertex.y
=
150
+
100
*
sin
(hexTheta);
} glEnd
(
* k
hexVertex.x glVertex2i
glEndList
k++)
TWO_PI
(
); (
displayHex
); (void)
(hexVertex.x,
hexVertex.y)
regular de
equiespaciados
(GL_POLYGON); for
void
0.0);
hexágono
s o b r e una
(regHex,
glColor3f
1.0,
l i s t a de v i s u a l i z a c i ó n para un
glGenLists
glNewList
1.0,
vértices del
situados
regHex
(void)
color rojo.
774
CAPÍTULO 13 glClear
Animación por computadora (GL_COLOR_BUFFER_BIT);
glPushMatrix í ) ; glRotatef
(rotTheta,
glCallList
(regHexJ;
glPopMatrix
{
(
0.0,
1.0);
) ;
glutSwapBufters glFlush
0.0,
(
) ¡
);
} void
rotateHex
(void)
{ rotTheta if
+=
3.0;
(rotTheta
>
rotTheta
-=
360.0) 360.0;
glutPostRedisplay
(
);
} v o i d winReshapeFcn glViewport
(0,
glMatrixMode
0,
(GLsizei)
(
GLint
newHeight)
newWidth,
(GLsizei)
newHeight);
)
(-320.0,
glMatrixMode
320.0,
-320.0,
320.0);
(GLJ40DELVIEW);
glLoadldentity glClear
newWidth,
(GL_PROJECTION);
glLoadldentity gluOrtho2D
(GLint
(
);
(GL_COLOR_BUFFER__BIT) ;
>
v o i d mouseFcn
(GLint
button,
GLint
action,
GLint x,
GLint y)
{ switch
(button)
case
{
GLUT_MIDDLE_BUTTON:
Ü
(action
==
//
Comenzar
la
rotación.
GLÜT_DOWN)
glutldleFunc
(rotateHex);
break; case
GLUT_RIGHT_BUTTON;
if
(action
//
Detener
la
rotación.
GLUT_DOWN)
glutldleFunc
(NULL);
break; default: break;
J } v o i d main
(int
argc,
char**
argv)
{ glutlnit
(fcargc,
argv);
glutlnitDisplayMode
(GLUT_DOUBLE
|
GLUT_RGB) ;
13.11
glutlnitWindowPosition glutlnitWindowSize glutCreateWindow init
(
(150,
(winWidth, ("Animation
Resumen
775
150); winHeight); Example");
) ;
glutDisplayFunc
(displayHex);
glutReshapeFunc
(winReshapeFcn);
glucMouseFunc gluCMainLoop
(mouseFcn); (
);
}
13.11 RESUMEN Podemos construir una secuencia de animación fotograma a fotograma o podemos generarla en liempo real. Cuando se construyen y almacenan fotogramas independientes de una animación, los fotogramas pueden posteriormente transferirse a una película o mostrarse en una rápida sucesión sobre un monitor de vídeo. Las animaciones que incluyen escenas y movimientos complejos suelen crearse de fotograma en fotograma, mientras que las secuencias de movimiento más simples se muestran en tiempo real. En un sistema de barrido, pueden usarse métodos de doble búfer para facilitar la visualización del movimiento. Se utiliza un búfer para registrar la pantalla, mientras que se carga en un segundo búfer los valores de los píxeles correspondientes al siguiente fotograma de la secuencia. Después, se intercambian los papeles de los dos búferes, usualmente al final de un ciclo de refresco. Otro método de barrido para mostrar una animación consiste en realizar secuencias de movimiento utilizando transferencias en bloque de los píxeles. Las traslaciones se llevan a cabo mediante un simple movimiento de un bloque rectangular de píxeles desde una posición de búfer de imagen a otra. Asimismo, las rotaciones en incrementos de 90° pueden llevarse a cabo mediante una combinación de traslaciones e intercambios de filas-columnas dentro de la matriz de píxeles. Pueden usarse métodos basados en tablas de colores para construir animaciones de barrido simples, almacenando una imagen de un objeto en múltiples ubicaciones del búfer de imagen y utilizando diferentes valores en la tabla de colores. Una imagen se almacena con el color de primer plano y las copias de la imagen en las otras ubicaciones tendrán un color de fondo. Intercambiando rápidamente los valores de color de primer plano y de fondo almacenados en la tabla de colores, podemos mostrar el objeto en varias posiciones de pantalla. Son varias las etapas de desarrollo necesarias para producir una animación, comenzando con el guión, las definiciones de los objetos y la especificación de los fotogramas clave. El guión es un resumen de la acción, mientras que los fotogramas clave definen los detalles de los movimientos de los objetos para posiciones seleccionadas dentro de una secuencia de animación. Una vez definidos los fotogramas clave, se generan los fotogramas intermedios para conseguir un movimiento suave entre un fotograma clave y el siguiente. Una animación infográfica puede incluir especificaciones de movimiento para la «cámara», además de trayectorias de movimientos para los objetos y personajes que participen en la animación. Se han desarrollado diversas técnicas para simular y enfatizar los efectos de movimiento. Los electos de compresión y expansión son métodos estándar para resaltar las aceleraciones, y la modificación del tiempo entre unos fotogramas y otros permite conseguir variaciones de velocidad. Otros métodos incluyen movimientos preliminares de preparación, movimientos de seguimiento al tlnal de la acción y métodos de variación del punto de atención que centran la imagen sobre una acción importante que esté teniendo lugar en la escena. Nonnalmente, se utilizan funciones trigonométricas para detenninarel espaciado temporal de los fotogramas intermedios cuando los movimientos incluyen aceleraciones.
776
CAPÍTULO 13
Animación por computadora
Las animaciones pueden generarse mediante software de propósito especial o utilizando un paquete gradeo de propósito general. Entre los sistemas disponibles para la animación automática por computadora se incluyen los sistemas basados en fotogramas clave, los sistemas parametrizados y los sistemas basados en scripts. Muchas animaciones incluyen efectos de morfismo, en los que se hace que cambie la forma de un objeto. Estos efectos se consiguen utilizando fotogramas intermedios para efectuar la transición, transformando los puntos y líneas que definen un objeto en los puntos y líneas que definen el objeto final. Los movimientos dentro de una animación pueden describirse por especificación directa del movimiento o pueden estar dirigidos por objetivos. Así, una animación puede definirse en términos de los parámetros de traslación y rotación, o los movimientos pueden describirse mediante ecuaciones o mediante parámetros cinemáticos o dinámicos. Las descripciones cinemáticas del movimiento especifican las posiciones, velocidades y aceleraciones; las descripciones dinámicas del movimiento se proporcionan en términos de las fuerzas que actúan sobre los objetos incluidos en una escena. A menudo se utilizan figuras articuladas para modelar el movimiento de las personas y de los animales. Con este método, se definen enlaces rígidos dentro de una estructura jerárquica, conectados mediante articulaciones giratorias. Cuando se imprime movimiento a un objeto, cada subparte está programada para moverse de una forma concreta en respuesta al movimiento global. La velocidad de muestreo para los movimientos periódicos debe producir los suficientes fotogramas por ciclo como para mostrar correctamente la animación. En caso contrarío, pueden producirse movimientos erráticos o confusos. Además de las operaciones de barrido y de los métodos basados en tablas de colores, hay disponibles algunas funciones en GLUT (OpenGL Utility Toolkit) para desarrollar programas de animación. Estas funciones proporcionan rutinas para las operaciones de doble búfer y para incrementar los parámetros de movimiento durante los intervalos de inactividad durante el procesamiento. En la Tabla I3.l se enumeran las funciones GLUT para generar animaciones con programas OpenGL.
ABLA 13.1. RESUMEN DE FUNCIONES DE ANIMACIÓN OpenGL Función
Descripción
glutlnitDisplayMode
(GLUT DOUBLE)
Activa las operaciones de doble búfer.
glutSwapBuffers glGetBooleanv
Intercambia los búferes de refresco frontal y trasero. (GL DOUBLEBUFFER,
glutldleFunc
status)
Consulta al sistema para determinar si están disponibles las operaciones de doble búfer. Especifica una función para incrementar los parámetros de animación.
REFERENCIAS Los sistemas de animación por computadora se analizan en Thalmann y Thalmann (l985),Watt and Walt (1992), O'Rourke (1998), Maestri (1999 y 2002), Kerlow (2000), Gooch y Gooch (2001), Parent (2002), Pocock y Rosebush (2002) y Strothotte y Schlechtweg (2002). Las técnicas tradicionales de animación se exploran en Lasseter (1987), Thomas, Johnston y Johnston (1995) y Thomas y Lefkon (1997). Los métodos de morfismos se estudian en Hughes (1992), Kent, Carlson y Parent (1992), Sederberg y Greenwood (1992) y Gomes, Darsa, Costa y Velho (1999). Hay disponibles diversos algoritmos para aplicaciones de animación en Glassner (1990), Arvo (1991), Kirk (1992), Gascuel (1993), Snyder, Woodbury, Fleischer, Currin y Barr (1993) y Paeth (1995). Para ver una explicación de las técnicas de animación en OpenGL, consulte Woo, Neider, Davis y Shreiner (1999).
Ejercicios
777
EJERCICIOS 13.1
Diseñe un guión y los fotogramas clave correspondientes para una animación de una figura articulada simple, como en la Figura 13.19.
13.2
Escriba un programa para generar los fotogramas intermedios para los fotogramas clave especificados en el Ejercicio 13.1 utilizando interpolación lineal.
13.3
Expanda la secuencia de animación del Ejercicio 13.1 para que incluya dos o más objetos móviles.
13.4
Escriba un programa para generar los lótogramas intermedios para los fotogramas clave del Ejercicio 13.3 utilizando interpolación lineal.
13.5
Escriba un programa de modismo para transformar cualquier polígono en otro polígono e.speeilicado, utilizando cinco fotogramas intermedios.
13.6
Escriba un programa de morfismo para transfonnar una esfera en un poliedro especificado, utilizando cinco fotogramas intermedios.
13.7
Defina una especificación de una animación que incluya aceleraciones y que implemcntc la Ecuación 13.7.
13.8
Defina la especificación de una animación que incluya tanto aceleraciones como deceleraciones, implementando los cálculos de espaciado de los fotogramas intermedios dados en las Ecuaciones 13.7 y 13.8.
13.9
Defina la especificación de una animación que impleniente los cálculos de aceleración-deceleración de la Ecuación 13.9.
13.10 Escriba un programa para simular los movimientos lineales bidimcnsionales de un circulo relleno dentro de un área rectangular especificada. Hay que dar al círculo una posición y una velocidad iniciales y el círculo debe rebotar en las paredes, siendo el ángulo de reflexión igual al ángulo de incidencia. 13.11 Convierta el programa del ejercicio anterior en un juego de frontón, sustituyendo un lado del rectángulo por un lado del rectángulo por un corlo segmento de línea que pueda moverse adelante y atrás a lo largo de dicho lado del rectángulo. El movimiento interactivo del segmento de línea simula una raqueta que puede colocarse para evitar que escape la bola. El juego terminará cuando el círculo escape del interior del rectángulo. Los parámetros iniciales de entrada incluyen la posición del circulo, la dirección y la velocidad. La puntuación del juego puede incluir el número de veces que la raqueta golpea a la bola. 13.12 Modifique el juego de frontón del ejercicio anterior para variar la velocidad de la bola. Después de un corto intervalo fijo, como por ejemplo cinco rebotes, la velocidad de la bola puede incrementarse. 13.13 Modifique el ejemplo de la bola bidimensional dentro de un rectángulo, para convertirlo en una esfera que se mueva tridimensionalmenle en el interior de un paralelepípedo. Pueden especificarse parámetros de visualización interactivos para ver el movimiento desde distintas direcciones. 13.14 Escriba un programa para implementar la simulación de una bola que rebote utilizando la Ecuación 13.10. 13.15
Expanda el programa del ejercicio anterior para incluir efectos de comprensión y expansión.
13.16 Escriba un programa para implementar el movimiento de una bola que rebote utilizando ecuaciones dinámicas. El movimiento de la bola deberá estar gobernado por una fuerza gravilatoria dirigida hacia abajo y una fuerza de fricción con el plano de tierra. Inicialmente, se proyecta la bola hacia el espacio con un vector de velocidad dado. 13.17 Escriba un programa para implementar especificaciones de movimiento dinámico. Especifique una escena con dos objetos o más, con unos parámetros de movimiento iniciales y con unas fuerzas especificadas. Después, genere la animación resolviendo las ecuaciones de fuerza. (Por ejemplo, los objetos podrían ser la Tierra, la Luna y el Sol, con fuerzas gravitatorias atractivas que sean proporcionales a la masa e inversamente proporcionales al cuadrado de la distancia). 13.18 Modifique el programa del hexágono giratorio para permitir al usuario seleccionar interactivamente el objeto que hay que girar, a partir de una lista de opciones de menú. 13.19 Modifique el programa del hexágono giratorio para que la rotación sea alrededor de una trayectoria elíptica. 13.20 Modifique el programa del hexágono giratorio para permitir una variación interactiva de la velocidad de rotación.
Modelado jerárquico
Una escena fotográfica que contiene un complejo de edificios modelado jerárquicamente. (Cortesía de Silicon Graphics, Inc.)
1 4 . 1 Conceptos básicos de modelado 14.2
Paquetes de modelado
1 4 . 3 Métodos generales de modelado jerárquico
1 4 . 4 Modelado jerárquico mediante listas de visualización OpenGL 14.5
Resumen
Al definir un sistema de objeto complejo, lo más fácil suele ser especificar primero las subparles y luego describir cómo encajan estas subpartes para formar el objeto o sistema global. Por ejemplo, una bicicleta puede describirse en términos de un chasis, unas ruedas, unos pedales, un asiento, etc., junto con las reglas para posicionar estos componentes con el fin de formar la bicicleta. Una descripción jerárquica de este tipo puede proporcionarse en forma de estructura de árbol, que estará compuesta de las subpartes en los nodos del árbol y de las reglas de construcción como las ramas del árbol. Los sistemas de arquitectura e ingeniería, como por ejemplo los planos de edificios, los diseños de automóviles, los circuitos electrónicos y los electrodomésticos, se desarrollan hoy en día utilizando siempre paquetes de diseño asistido por computadora. Asimismo, se usan métodos de diseño gráfico para representar sistemas económicos, financieros, organizativos, científicos, sociales y medioambientales. A menudo, se construyen simulaciones para estudiar el comportamiento de un sistema en diversas condiciones, y el resultado de la simulación puede servir como herramienta de formación o como base para tomar decisiones acerca del sistema. Los paquetes de diseño proporcionan, generalmente, rutinas para crear y gestionar modelos jerárquicos y algunos paquetes también contienen formas predefinidas, como por ejemplo ruedas, puertas, ejes o componentes de circuitos eléctricos.
14.1 CONCEPTOS BÁSIDOS DE MODELADO La creación y manipulación de una representación de un sistema se denomina modelado. Cualquier representación se denominará modelo del sistema y esos modelos pueden definirse de manera gráfica o puramente descriptiva, como por ejemplo mediante un conjunto de ecuaciones que describan las relaciones entre los parámetros del sistema. Los modelos gráficos se suelen denominar modelos geométricos, porque las partes componentes del sistema se representan mediante entidades geométricas tales como segmentos de línea recta, polígonos, poliedros, cilindros o esferas. Puesto que lo único que nos interesa aquí son las aplicaciones gráficas, utilizaremos el término modelo para referirnos a una representación geométrica de un sistema generada por computadora.
Representaciones de los sistemas La Figura 14.1 muestra una representación gráfica de un circuito lógico, donde se ilustran las característieas eomunes a muchos modelos de sistemas. Las partes componentes del sistema se muestran como estructuras geométricas, denominadas símbolos, y las relaciones entre los símbolos se representan en este ejemplo mediante una red de líneas de conexión. Se utilizan tres símbolos estándar para representar las puertas lógicas correspondientes a las operaciones booleanas: and, or y not. Las lineas de conexión definen las relaciones en términos del flujo de entrada y de salida (de izquierda a derecha) a través de los componentes del sistema. Uno de los símbolos, la puerta and, se muestra en dos posiciones diferentes dentro del circuito lógico. El posicionamiento repetido de unos cuantos símbolos básicos es un método común para construir modelos complejos. Cada una de estas apariciones de un símbolo dentro de un modelo se denomina instancia de
780
CAPÍTULO 14
Modelado jerárquico
Eni rad ;i Imi un li
FIGURA 14.1. Modelo de un circuito lògico. dicho símbolo. Tenemos una instancia para los símbolos or y nal en la Figura 14.1 y dos instancias para el símbolo and. En muchos casos, los símbolos gráficos concretos elegidos para representar las partes de un sistema están dictados por la descripción del propio sistema. Para los modelos de circuitos, se utilizan símbolos lógicos o eléctricos estándar, pero con modelos que representen conceptos abstractos, como por ejemplo sistemas políticos, financieros o económicos, podemos utilizar como símbolos cualquier patrón geométrico que nos resulte conveniente. La información que describe un modelo suele proporcionarse como una combinación de datos geométricos y no geométricos. La información geométrica incluya las coordenadas para ubicar las partes componentes, las primitivas de salida y las funciones de atributo que definen la estructura de los componentes, así como dalos para construir las conexiones entre esos componentes. La información no geométrica incluye las etiquetas de texto, los algoritmos qtie describen las características de operación del modelo y las reglas para determinar las relaciones o conexiones entre las partes componentes, si es que éstas no están especificadas como datos geométricos. Hay dos métodos para especificar la información necesaria para construir y manipular un modelo. Uno de ios métodos consiste en almacenar la información en una estructura de datos, como por ejemplo una tabla o una lista enlazada. El otro método se basa en especificar la información mediante procedimientos. En general, una especificación de un modelo contendrá tanto estructuras de datos como procedimientos, aunque algunos modelos están definidos completamente mediante estructuras de dalos y otros utilizan sólo especificaciones procedimentales. Una aplicación para realizar el modelado de objetos sólidos puede que utilice principalmente información extraída de algún tipo de estructura de datos con el Un de definir las coordenadas, empleándose muy pocos procedimientos. Un modelo climático, por el contrario, puede que necesite principalmente procedimientos para poder calcular los gráficos de temperatura y las variaciones de presión. Como ejemplo de utilización de combinaciones de estructuras de datos y procedimientos, vamos a considerar algunas especificaciones alternativas para el modelo del circuito lógico de la Figura 14.1. Un método consiste en definir los componentes lógicos en una tabla de dalos (Tabla 14.1), empleando una serie de procedimientos de procesamiento para especificar cómo deben realizarse las conexiones de red y cómo opera el circuito. Los datos geométricos contenidos en esta tabla incluyen las coordenadas de parámetros necesarios para dibujar y posicionar las puertas. Estos símbolos pueden dibujarse como formas poligonales o pueden formarse mediante combinación de segmentos de línea recta y arcos elípticos. Las etiquetas para cada una de las puertas componentes también se han incluido en la tabla, aunque podrían omitirse si los símbolos se mostraran mediante formas comúnmente reconocibles. Después de esto, utilizaríamos procedimientos para mostrar las puertas y construir las líneas de conexión, basándonos en las coordenadas de las puertas y en un orden especificado para interconectarlas. Se emplearía también otro procedimiento adicional para producir la salida del circuito (valores binarios) a partir de cualquier entrada dada. Este procedimiento podría definirse de modo que sólo mostrara la salida final, o bien se le podría diseñar para que mostrara también los valores de salida intermedios, con el fin de ilustrar el funcionamiento interno del circuito. Alternativamente, podríamos especificar la información gráfica correspondiente al modelo de circuito mediante estmeturas de datos. Las líneas de conexión, asi como las puertas, podrían entonces definirse en una tabla de dalos que enumerara explícitamente los extremos de cada una de las líneas del circuito. Con esto, podríamos emplear un único procedimiento para visualizar el circuito y calcular la salida. En el otro extremo.
14.1 Conceptos básicos de modelado 781
DE CADA PUERTA EN EL CIRCUITO DE
1. TABLA DE DATOS QUE DEFINE LA LA FIGURA 14.1 Código de! símbolo Puerta 1
Descripción geométrica (Coordenadas y otros parámetros)
Etiqueta identificativa and
Puerta 2
or
Puerta 3
not
Puerta 4
and
sería también posible definir completamente el modelo mediante procedimientos, sin utilizar ninguna estructura de datos externa.
Jerarquías de símbolos Muchos modelos pueden organizarse como una jerarquía de símbolos. Los elementos básicos del modelo se definen como formas geométricas simples que resulten apropiadas para el tipo de modelo que se esté considerando. Estos símbolos básicos pueden usarse para formar objetos compuestos, algunas veces denominados módulos, que a su vez pueden agruparse para formar objetos de nivel superior, etc., para los diversos componentes del modelo. En el caso más simple, podemos describir un modelo mediante una jerarquía de un único nivel formada por las partes componentes, como en la Figura 14.2. Para este ejemplo de circuito, asumimos que las puertas se colocan y se conectan unas a otras con líneas rectas, de acuerdo con una serie de reglas de conexión especificadas con cada descripción de puertas. Los símbolos básicos en esta descripción jerárquica son las puertas lógicas. Aunque las propias puertas podrían describirse como jerarquías (formadas por líneas rectas, arcos elípticos y textos) dicha descripción no resultaría cómoda para construir circuitos lógicos, ya que en este tipo de circuitos los bloques componentes más simples son las puertas. En una aplicación en la que estuviéramos interesados en diseñar diversas formas geométricas, los símbolos básicos podrían definirse mediante segmentos de línea recta y arcos. En la Figura 14.3 se muestra mi ejemplo de una jerarquía de símbolos de dos niveles. Aquí, el plano de una fábrica se construye mediante una disposición de áreas de trabajo. Cada área de trabajo está equipada con un conjunto de muebles. Los símbolos básicos son los muebles: mesa de trabajo, silla, estantes, archivador, etc. Los objetos de nivel superior son las áreas de trabajo, que se componen mediante diferentes organizaciones de los muebles. Cada instancia de un simbolo básico se define especificando su posición, su tamaño y su orientación dentro de cada área de trabajo. Las posiciones se especifican mediante las coordenadas dentro del área de trabajo y las orientaciones se especifican como rotaciones que determinan hacia qué dirección apuntan los símbolos. En el primer nivel debajo del nodo raíz del árbol correspondiente a la fábrica, cada área de
Circuito lógico
Puerta and
FIGURA 14.2. Una descripción jerárquica de un solo nivel para un circuito formado mediante puertas lógicas.
782
CAPÍTULO 14
Modelado jerárquico
Fábrica
Área de trabajo l
Me su de trabajo
Silla
Área de trabajo 2
- ,. . Archivador
Mesa de . . trabajo
Silla
Área de trabajo 3
Estantes
M
e
d
c
f trabajo
Silla
Estantes
Archivador
'
FIGURA 14.3. Una descripción jerárquica en dos niveles para el plano de una fábrica. trabajo se define especificando su posición, su tamaño y su orientación dentro del plano de la fábrica. La frontera de cada área de trabajo puede estar definida mediante un divisor que encierre el área de trabajo y proporcione una serie de entornos independientes dentro de la fábrica. Otras jerarquías de símbolos más complejas pueden formarse mediante el agrupamiento repetido de conjuntos de símbolos en cada nivel superior. La disposición de la fábrica mostrada en la Figura I4.3 podría ampliarse para incluir grupos de símbolos que formaran diferentes habitaciones, diferentes pisos de un edificio, diferentes edificios dentro de un complejo y diferentes complejos en ubicaciones geográficas ampliamente separadas.
14.2 PAQUETES DE MODELADO Aunque pueden diseñarse y manipularse modelos de sistemas utilizando un paquete infográfico de tipo general, también hay disponibles sistemas de modelado especializados para facilitar la labor de modelado en aplicaciones concretas. Los sistemas de modelado proporcionan un medio para definir y reordenar las representaciones de los modelos en ténninos de jerarquías de símbolos, que luego son procesadas por las rutinas gráficas con el fin de poderlas visualizar. Los sistemas gráficos de propósito general no suelen proporcionar rutinas que permitan utilizar aplicaciones extensivas de modelado, pero algunos paquetes gráficos, como GL y PHIGS, sí que incluyen conjuntos integrados de funciones de modelado y gráficas. Un ejemplo de jerar-
FIGURA 14.4. Una jerarquía de objetos generada utilizando el paquete PHIGS Toolkit desarrollado en la Universidad de Manchester. El propio árbol de objetos visualizado es una estructura PHIGS. (Cortesía de T. L. J. Howard. J. G Williams y W, T, l/ewitt. Departamento de Computer Science, Universidad de Manchester. Reino Unido.)
14.1 Conceptos básicos de modelado
FIGURA 14.5. Modelado bidimensional utilizando un diseño de circuitos. (Cortesía de Snmmagrap/iics,)
783
FIGURA 14.6. Un modelo CAD que muestra los componentes individuales de un motor, representado por Ted Malone. ITI/3D-Magic. (Cortesía de Silicon Graphics, hn\)
quía de estructuras Pl IIGS es el que se muestra en la Figura 14.4. Esta imagen fue generada utilizando el software PHIGS Toolkil, desarrollado en la Universidad de Manchester y que proporciona un editor, ventanas, menús y otras herramientas de interfaz para aplicaciones PHIGS. Si una biblioteca gráfica no contiene funciones de modelado, podemos utilizar a menudo una interfaz que algún paquete de modelado ofrezca para esas rutinas gráficas. Alternativamente, podemos crear nuestras propias rutinas de modelado utilizando las transformaciones geométricas y otras funciones disponibles en la biblioteca gráfica. Los paquetes de modelado especializados, como algunos sistemas CAD, se deíinen y estructuran de acuerdo con el tipo de aplicación para la que el paquete haya sido diseñado. Estos paquetes proporcionan menús con las formas de los símbolos, así como funciones para la aplicación pretendida. Dichos paquetes pueden estar diseñados para modelado bidimensional o tridimensional. La Figura 14.5 muestra un esquema bidimensional generado por un paquete CAD configurado para aplicaciones de diseño de circuitos, mientras que la
FIGURA 14.7. Una representación mediante nodos de aristas para residuos de aminoácidos, modelada y representada por Julie Newdoll, UCSF Computer (¡raphics Lab. (Cortesía de Silicon Graphics, Inc.)
FIGURA 14.8. Una mitad de una pareja de imágenes estereoscópicas que muestran un modelo molecular tridimensional del ADN. Datos suministrados por Schlick, NYU y Wilma K. Olson, Rutgers University; visualización realizada por Jerry Greenberg, SDSC. (Cortesía de S/ephanie Sides. San Diego Stfpercomputer Center. j
784 CAPÍTULO 14 Modelado jerárquico
FIGURA 14.9. Una visla tridimensional del plano de una ofìcina. {Cortesia de Intergraph Corporation.)
Figura 14.6 ilustra una aplicación C A D tridimensional. En las Figuras 14.7 y 14.8 se muestran ejemplos de modelado molecular, mientras que la Figura 14.9 incluye un modelo tridimensional de una vivienda.
14.3 MÉTODOS GENERALES DE MODELADO JERÁRQUICO Para crear un modelo jerárquico de un sistema, anidamos las descripciones de sus subpartes con el Fin de formar una organización en árbol. A medida que se introduce cada nodo en la jerarquía, se le asigna un conjunto de transformaciones con el fin de posicionarlo apropiadamente dentro del modelo global. Para el diseño de un edificio de oficinas, por ejemplo, las áreas de trabajo y los despachos se forman disponiendo los diversos muebles. Los despachos y áreas de trabajo se colocan entonces en departamentos, etc., hasta llegar a la pane superior de la jerarquía. En la Figura 1 4 . 1 0 se proporciona un ejemplo de utilización de múltiples sistemas de coordenadas y de métodos de modelado jerárquico con objetos tridimensionales. Esta figura ilustra la simulación del movimiento de un tractor. A medida que el tractor se mueve, el sistema de coordenadas del tractor y las ruedas delanteras se desplazan dentro del sistema de coordenadas universales. Las ruedas delanteras rotan en el sistema de coordenadas de las ruedas y el sistema de las ruedas rota con respecto al sistema del tractor cuando éste efectúa un giro.
Coordenadas locales En aplicaciones generales de diseño, los modelos se construyen con instancias (copias transformadas) de las formas geométricas definidas en un conjunto básico de símbolos. Cada instancia se coloca, con la orientación
Sistema de las ruedas delanteras FIGURA 14.10. Sistemas de coordenadas posibles utilizados a la hora de simular el movimiento de un tractor. Una rotación del sistema de las ruedas delanteras hace que el tractor gire. Tanto el marco de referencia de las ruedas como el del tractor se desplazan dentro del sistema de coordenadas universales.
Métodos generales
14.3
de
modelado jerárquico
785
101-
5 -
O -
0 -
-5 -
-5
iii 0
"5
-10 J—L
-10
-5
0
5
10
Mesa de trabajo Matriz de coordenadas de la silla Silla r
Silla v -3
"3 -3 3 3 l 2 1
J
3 -3 3 0 —3 (ai
Mairi/ de coordenadas de la mesa de trabajo Mesa de Mesa de trabajo y trabajo x
j i
0 ü 6 6 -10 -1Ü
—8 8
№
FIGURA 14.11. Objetos definidos en coordenadas locales. apropiada, en el sistema de coordenadas universales correspondiente a la estructura global del modelo, Los
diversos objetos gráficos que hay que usar en una aplicación se definen en relación con el sistema de referencia de coordenadas universales, refiriéndonos a este nuevo sistema como sistema de coordenadas /ocales de dicho objeto. Las coordenadas locales se denominan también coordenadas de modelado o, en ocasiones, coordenadas maestras. La Figura 14.II ilustra las definiciones en coordenadas locales para dos símbolos que podrían usarse en una aplicación de diseño bidimensional de planos de oficinas.
Transformaciones de modelado Par construir un modelo gráfico, aplicamos transformaciones a las definiciones de los símbolos en coordenadas locales, con el fin de producir instancias de los símbolos dentro de la estructura global del modelo. Las transformaciones aplicadas a las definiciones de los símbolos en coordenadas de modelado, con el fin de dar a esos símbolos una posición y orientación concretas dentro de un modelo, se denominan transformaciones de modelado. Las transformaciones típicamente disponibles en un paquete de modelado son las de translación, rotación y cambio de escala, aunque algunas aplicaciones pueden también utilizar otros tipos de transformaciones.
Creación de estructuras jerárquicas Un primer paso en el modelado jerárquico consiste en construir módulos que estén compuestos de símbolos básicos. Entonces, los propios módulos pueden combinarse para formar módulos de nivel superior, etc.
786
CAPÍTULO 14
Modelado jerárquico
Definimos cada módulo inicial como una lista de instancias de símbolos, junto con los apropiados parámetros de transformación para cada símbolo. En el siguiente nivel, definimos cada módulo de nivel superior como una lista de símbolos y de instancias de módulo de nivel inferior, junto con sus parámetros de transformación. Este proceso continúa hasta alcanzar la raíz del árbol, que representa el modelo total en coordenadas universales. En un paquete de modelado, un módulo se crea con una secuencia de comandos del tipo:
crearMódulol establecerTransformaciónSímbolol irtsertarSímbolol establecerTransformaciónSímbolo2 insertarSímbolo2
cerrarMóduloi
A cada instancia de un símbolo básico se le asigna un conjunto de parámetros de transformación para dicho módulo. De forma similar, los módulos se combinan para formar otros módulos de primer nivel con funciones tales como:
crearMódulo6 establecerTransformaciónMódulol insertarMódulol establecerTransformaciónMódulo2 ineertarMódulo2 establecerTransformaciónSímboloS insertarSímbolo5
cerrarMódulo6
La función de transformación para cada módulo o símbolo especifica cómo hay que encajar dicho enfoque dentro del módulo de nivel superior. A menudo, se proporcionan opciones para que una determinada matriz de transformación pueda premultiplicar, postmultiplicar o sustituir a la matriz de transformación actual. Aunque en un paquete de modelado puede haber disponible un conjunto básico de símbolos, puede que ese conjunto de símbolos no contenga las formas que necesitamos para una aplicación concreta. En tal caso, podemos crear formas adicionales dentro de un programa de modelado. Como ejemplo, el siguiente pseudocódigo ilustra la especificación de un modelo simple de bicicleta: crearSímboloRueda crearSímboloChasis
crearMóduloBicicleta especificarTransformaciónChasis insertarSímboloChasie
14.5 Resumen
787
especificarTransformaciÓnRuedaDelantera insertarSímboloRueda especificarTransformaciónRuedaTrasera insertarSímboloRueda cerrarMóduloBicicleta
En los sistemas diseñados para modelado jerárquico suele haber disponibles varias otras rutinas de modelado. Suele ser habitual que los módulos puedan visualizarse selectivamente o extraerse temporalmente de la representación de un sistema. Estos permite al diseñador experimentar con diferentes formas y estructuras de diseño. Asimismo, los módulos pueden resaltarse o desplazarse a través de la imagen durante el proceso de diseño.
14.4 MODELADO JERÁRQUICO MEDIANTE LISTAS DE VISUALIZACIÓN OpenGL En OpenGL podemos describir objetos complejos utilizando listas de visualización anidadas con el Un de formar un modelo jerárquico. Cada símbolo y módulo del modelo se crea mediante una función g l N e w L i s t , y podemos insertar una lista de visualización dentro de otra utilizando la función g l C a l l L i a t dentro de la definición de la lista de nivel superior. Se pueden asociar transformaciones geométricas con cada objeto insertado con el fin de especificar una posición, una orientación o un tamaño dentro de un módulo de nivel superior. Como ejemplo, el siguiente código podría utilizarse para describir una bicicleta que estuviera compuesta simplemente por un chasis y dos ruedas idénticas:
glNewList
(bicycle,
glCallList glTranslatef
(txl,
glCallList
glCallList (
tyl,
tzl);
ty2
tz2);
(wheel);
glTranslatef glEndList
GL_COMPILEÍ;
(frame);
(tx2,
f
(wheel); );
De forma similar, la lista de visualización f r a m e (chasis) podría a su vez estar compuesta de listas de visualización individuales que describieran el manillar, la cadena, los pedales y otros componentes.
14.5 RESUMEN El término «modelo», en aplicaciones infográficas, hace referencia a una representación gráfica de un sistema. Los componentes gráficos de un sistema se representan como símbolos definidos en sistemas de referencia de coordenadas locales, las cuales se denominan también coordenadas maestras o de modelado. Podemos crear un modelo, como por ejemplo un circuito eléctrico, colocando instancias de los símbolos en ubicaciones seleccionadas y con orientaciones prescritas. Muchos modelos se construyen como jerarquías de símbolos. Podemos construir un modelo jerárquico a nivel de módulos, que estarán compuestos de instancias de símbolos básicos y de otros módulos. Este proce-
788
CAPÍTULO 14 Modelado jerárquico
so de anidamiento debe continuar hacia abajo, hasta alcanzar símbolos que estén definidos mediante primitivas gráficas de salida y sus correspondientes atributos. A medida que se anida cada símbolo o módulo dentro de un módulo de nivel superior, se especifica una transformación de modelado asociada con el fin de describir su papel concreto dentro de la estructura anidada. Podemos definir un modelo jerárquico en OpenGL utilizando listas de visualización. La función g l N e w L i s t puede utilizarse para definir la estructura global de un sistema y sus módulos componentes. Los símbolos individuales u otros módulos se insertan dentro de un módulo utilizando la función g l C a l l L i s t , precedida mediante un conjunto apropiado de transformaciones que especifiquen la posición, orientación y (amafio del componente insertado.
REFERENCIAS Puede encontrar ejemplos de aplicaciones de modelado con OpenGL en Woo. Neider. Davis y Shreiner (I999).
EJERCICIOS
14.1
Explique las representaciones de modelos que sedan apropiadas para diferentes tipos de sistemas que tengan características muy distintas. Asimismo, explique cómo pueden implementarse las representaciones gráficas para cada sistema.
14.2
Diseñe un paquete de diseño bidimensional de oficinas, I lay que proporcionar al diseñador un menú de formas dé muebles y el diseñador puede poder utili/ar un ratón para seleccionar y colocar un objeto en cualquier ubicación dentro de una habitación (jerarquía de un único nivel). Las transfonnaciones de instancias pueden limitarse a traslaciones y rotaciones.
14.3
Amplíe el ejercicio anterior para poder también cambiar la escala de las formas de los muebles.
14.4
Diseñe un paquete bidimensional de modelado de oficinas que presente un menú de formas de muebles. Utilice una jerarquía de dos niveles, de modo que los muebles puedan colocarse en diversas áreas de trabajo y que las áreas de trabajo puedan disponerse dentro de un área mayor. Los muebles deben poder colocarse en las áreas de trabajo utilizando únicamente transformaciones de instancia de traslación y rotación.
14.5
Amplié el ejercicio anterior de modo que también pueda cambiarse la escala de los muebles.
14.6
Escriba un conjunto de rutinas para crear y visualizar símbolos para el diseño de circuitos lógicos. Como mínimo, el conjunto de símbolos debe incluir las puertas and, or y nol mostradas en la figura 14.1.
14.7
Desarrolle un paquete de modelado para el diseño de circuitos lógicos que pennita al diseñador colocar símbolos eléctricos dentro de la red de un circuito. Utilice el conjunto de símbolos del ejercicio anterior y emplee únicamente traslaciones para colocar en la red una instancia de las formas contenidas en el menú, l.'na \ez colocado un componente en la red. debe podérselo conectar con otros componentes especificados mediante segmentos de línea rectu.
14.8
Escriba un conjunto de rutinas para editar módulos que hayan sido creados en un programa de aplicación. Las rutinas deben proporcionar las siguientes modalidades de edición: adición, inserción, sustitución y borrado de módulos.
14»
Dadas las extensiones de coordenadas de todos los objetos visualizados en un modelo, escriba una rutina para borrar cualquier objeto seleccionado.
14.10 Escriba procedimientos para visualizar y borrar un módulo especificado dentro de un modelo. 14.11 Escribe una rutina que permita extraer selectivamente módulos de la imagen de un modelo o volver a activar su visualización.
Ejercicios
14.12
789
Escriba un procedimiento para resaltar de alguna manera un módulo seleccionado. Por ejemplo, el módulo seleccionado podría mostrarse con un color distinto o podría encerrárselo dentro de un contorno rectangular.
14.13 Escriba un procedimiento para resaltar un módulo seleccionado en un modelo, haciendo que el módulo parpadee.
Formatos de archivos gráficos
Una escena generada por computadora creada con golpes de pincel de acuarela simulada.
{Cortesía de Aydin Controls, División de Aydin Corporation.)
15.1
Con figuraciones de archivos de imagen
1 5 . 2 Métodos de reducción de color
1 5 . 4 Composición de la mayoría de los fórmalos de archivo
1 5 . 3 Técnicas de compresión de archivos
1 5 . 5 Resumen
Cualquier representación ilustrativa almacenada se denomina archivo gráfico o archivo de imagen. Para sistemas de grállcos digitalizados, un dispositivo de pantalla en color se representa en el búler de imagen como un conjunto de valores de píxel RGB. Como se pudo ver en la Sección 2 . 1 , el contenido del búfer de imagen, o cualquier sección rectangular del mismo, se llama pixmap. Aunque las imágenes monocromáticas pueden almacenarse en formato bitmap (usando un bit para cada píxel) la mayoría de los grállcos digitalizados se almacenan como pixmaps. En general, cualquier representación digitalizada correspondiente a un gráfico es lo que se denomina archivo digitalizado o raslerizado. Se han desarrollado muchos fonnatos para organizar la información en un archivo de imagen de varias maneras, y los archivos digitalizados de color completo pueden ser bastante grandes, por lo que la mayoría de los formatos de archivo aplican algún tipo de compresión para reducir el tamaño del mismo, tanto para archivado definitivo como para su transmisión. Además, el número de valores de color en un archivo de imagen de color completo debe reducirse cuando la imagen va a visualizarse en un sistema con capacidades de color limitadas, o cuando el archivo va a almacenarse en un formato que no soporta 24 bits por píxel. Aquí, se ofrece una breve introducción a los formatos de archivos gráficos y los métodos usados comúnmente para reducir el tamaño tanto del archivo como del número de colores que se van a usar en la visualización de una imagen.
15.1 CONFIGURACIONES DE ARCHIVOS DE IMAGEN Los valores de color de píxel en un archivo de imagen digitalizada se almacenan típicamente como enteros no negativos, y el rango de los valores de color depende del número de bits disponibles por posición de píxel. Para una imagen RGB a color completo (24 bits por píxel), el valor para cada componente de color se almacena en un byte, con los valores R, G y B en un rango entre ü y 255. Un archivo gráfico digitalizado no comprimido compuesto por valores de color RGB, a veces, se denomina archivo de datos en bruto o sin formato o archivo digitalizado sin formato. Otros modelos de color, incluyendo HSV, USB e Y C C , se usan en formatos de archivos comprimidos. El número de bits disponibles por píxel depende del formato. Los formatos de archivo normalmente incluyen una cabecera que ofrece información sobre la estructura del archivo. Para archivos comprimidos, la cabecera debe también contener tablas y otros detalles necesarios para decodificar y visualizar la imagen comprimida. La cabecera puede incluir una amplia variedad de información, tal como el tamaño del archivo (número de líneas de barrido y número de píxelcs por línea de barrido) el número de bits o bytes asignados por píxel, el método de compresión usado para reducir el tamaño del archivo, el rango de color para los valores de píxel y el color de fondo de la imagen. Otra característica de los archivos de imagen digitalizados es el orden de los bytes dentro del archivo. La mayoría de los procesadores de computadora almacenan enteros multibyte con el byte más significativo en primer lugar, aunque algunos procesadores almacenan enteros multibyte con el byte menos significativo en primer lugar. El concepto de big endian se usa para indicar que el byte más significativo va el primero, y el concepto de ¡tule endian hace referencia a que es el byte menos significativo el que va primero. Algunos formatos de archivo almacenan una imagen en una representación geométrica, que es una lista de posiciones de coordenadas y otra información para segmentos de línea recta, áreas de relleno, arcos circur
b
7 9 2 CAPÍTULO 1 5
Formulas de archivos gráficos
lares, curvas de splines y otras primitivas. Las representaciones geométricas pueden contener también información sobre los atributos y los parámetros de visualización. Este tipo de representación de imágenes se llama comúnmente formato vectorial, incluso cuando no todas las estructuras geométricas se definen mediante segmentos de línea recta. Originalmente, el término de archivo «vectorial» se empleaba para describir una lista de segmentos de línea que se visualizaban en un sistema vectorial (barrido aleatorio). Aunque los sistemas vectoriales han sido sustituidos por sistemas digitalizados, y las descripciones de objetos no lineales han sido añadidas a los archivos «vectoriales», el nombre continua siendo aplicado a cualquier archivo que usa una representación geométrica para una imagen. Los formatos de archivo que soportan tanto representación de imágenes geométricas como digitalizadas son lo que se denominan formatos híbridos o metaarchivos. Las aplicaciones de visualización científica a menudo usan un archivo de imagen que es un conjunto de valores de datos generados a partir de instrumentos de medición o de simulaciones numéricas por computadora. Hay disponibles diversos programas que se usan para ofrecer visualizaciones de datos particulares, tales como visualizaciones de pseudo-color, representaciones de isosuperficies o representaciones de volúmenes.
15.2 MÉTODOS DE REDUCCIÓN DE COLOR Se han ideado muchos métodos para reducir el número de colores usados en la representación de una imagen. Los métodos más populares son aquellos que intentan generar muestras de color que se aproximan mucho al conjunto de colores original. Aveces, cuando se habla de métodos de reducción de color se habla de "cuantización", término que se usa en las áreas de física y matemáticas (como la mecánica cuántica y las teorías de muestreo), para un proceso que genera un conjunto discreto de valores a partir de una distribución continua. En cualquier caso, un archivo digitalizado de imagen no es una distribución continua; contiene un conjunto discreto y finito de valores de color. Por tanto, cualquier método de reducción de color simplemente sustituye un conjunto discreto de colores por un conjunto discreto de colores más pequeño. Además, los procesos de reducción de color, en su uso común, no generan un conjunto de colores tal que cada color del conjunto es un múltiplo de algún valor seleccionado. En otras palabras, la reducción de colores no produce un conjunto cuantizado de colores.
Reducción uniforme de color Un método sencillo para reducir colores en un archivo digitalizado consiste en dividir cada uno de los niveles de color /?, G y B entre un entero y truncar el resultado. Por ejemplo, si se divide entre 2, se reduce cada uno de los componentes R G y B en una representación a color completo con 128 niveles. Así, la reducción uniforme de color sustituye grupos de niveles de colores contiguos con un nivel de color reducido, como se ilustra en la Figura 15.1. Otro estrategia consiste en sustituir un grupo de valores de píxel con el valor del píxel medio del grupo. O se puede sustituir el grupo de píxeles con el color promedio para el grupo. En general, no se puede esperar que los 256 valores aparecerán en el archivo de imagen para cada uno de los componentes RGB. Por tanto, se puede aplicar un método de reducción uniforme de color a los niveles de color entre los niveles máximo y mínimo que realmente están en el archivo de imagen. Se pueden también aplicar diferentes criterios de reducción a los distintos componentes RGB. Por ejemplo, se podría reducir una imagen de color completo, de tal forma que las componentes de los colores rojo y verde se representasen con 3 bits cada una (8 niveles) y la componente azul se representase con 2 bits (4 niveles). t
Reducción de color por popularidad Otra forma de hacer una reducción de color consiste en mantener sólo los valores de color que aparecen más frecuentemente en la representación de una imagen. Se puede procesar primero la entrada del archivo de íma
15.3
Valores R G B originales
Técnicas de compresión
de archivos
793
Valores R G B reducidos
FIGURA 15.1. Reducción uniforme de color de los valores RGB de una imagen de color cernípíelo a k niveles.
FIGURA 15.2. Bloque de colores de imagen y división de este bloque en la posición de la componente roja media.
gen para reducir la representación de bits para las componentes individuales RGB. Luego, se explora este conjunto modificado de colores para producir un recuento, o un histograma, de la frecuencia de aparición de cada componente de color RGB. Para producir un archivo de color reducido con k colores, se selecciona la k de los colores que aparecen más frecuentemente en el archivo de imagen.
Reducción de color de corte medio En este algoritmo, se subdivide el espacio de color para el archivo de imagen en k subregiones y se calcula el color medio para cada una de las subregiones. Para formar las subregiones, primero se determinan los valores mínimo y máximo para cada componente RGB: R , R G , G , B y B . Estos valores proporcionan los saltos en el bloque de colores dentro del cubo de color RGB que está presente en la imagen. Para el mayor de estos tres intervalos, se determina el valor medio y se usa este valor para formar dos bloques de color más pequeños. Por ejemplo, si el componente rojo tiene el rango más largo, se calcula el valor R de tal forma que la mitad de los colores de píxel estén por encima de este valor y la mitad por debajo. Después se recorta la imagen de color dentro de dos subbloques en la posición E L ^ j , como se muestra en la Figura I 5 . 2 . Cada uno de los dos subbloques de color son procesados usando el mismo procedimiento de subdivisión. Este proceso continua hasta que se tiene subdividido el bloque de color de la imagen original en k subbloques. En cada paso, se puede aplicar el procedimiento de subdivisión al subbloquc mayor. Un color medio con la precisión deseada se calcula para cada subbloqtie, y todos los colores de la imagen dentro de un subbloque se sustituyen con el color promedio del subbloque. m i n
m a x %
m j n
n i a x
m i n
l l l a x
m c d i a n
15.3
TÉCNICAS DE COMPRESIÓN DE ARCHIVOS
Hay disponible una amplia variedad de técnicas de compresión que permiten reducir el número de bytes en un archivo de imagen, pero la eficacia de un método de compresión particular depende del tipo de imagen. Los métodos sencillos que necesitan patrones en el archivo de imagen son más efectivos con diseños geométricos que contienen amplias áreas de colores sencillos, mientras que los esquemas de compresión complejos producen mejores resultados con gráficos por computadora fotorrealislas y fotografías digitali/adas. La técnica general empleada para reducir el tamaño de los archivos gráficos consiste en sustituir los valores de color con una codificación que ocupe menos bytes que en el archivo original. Además, se incorporan códigos a los archivos comprimidos para indicar cosas como el final de una línea de barrido y el final del archivo de imagen.
794
CAPÍTULO 15
Formatos
de archivos gráficos
Algunos algoritmos de compresión implican operaciones en punto flotante, que pueden introducir errores de redondeo. Además, algunos métodos usan aproximaciones que también modifican los colores de la imagen. Como resultado, un archivo que ha sido decodificado a partir de un archivo comprimido a menudo contiene valores de color que no son exactamente los mismos que había en la imagen original. Por ejemplo, un color entero RGB que se especifica como (247, i08, I75) en un archivo de imagen de entrada puede convertirse en el color (242, I I I , 177) después de decodificar el archivo comprimido. Pero tales cambios de color, normalmente, son tolerables porque el ojo humano no es sensible a pequeñas diferencias de color. Los métodos de reducción de archivos que no cambian los valores en un archivo de imagen emplean técnicas sin pérdida de compresión, y aquéllos que dan lugar a cambios de color usan técnicas con pérdidas de compresión. En la mayoría de los casos, los métodos con pérdidas de compresión dan lugar a una tasa de comprensión mucho mayor para un archivo, siendo la tasa de compresión el número de bytes del archivo original dividido entre el número de bytes del archivo comprimido.
Codificación de longitud de recorrido Este esquema de compresión sencillamente busca en el archivo de imagen los valores repelidos contiguos. Se forma un archivo reducido almacenando cada secuencia de valores repetidos como un único valor de archivo junto con el número de repeticiones. Por ejemplo, si el valor 125 aparece 8 veces en sucesión a lo largo de una línea de barrido, se almacenan los dos valores, 8 y 125, en el archivo comprimido. Esto reduce los ocho bytes originales de almacenamiento a dos bytes. Para imágenes con grandes áreas de un único color, este esquema de codificación funciona bien. Pero para las imágenes tales como fotografías digitalizadas que tienen frecuentes cambios de color y pocas repeticiones de valores consecutivos, muchos valores de color se almacenarían con un factor de repetición de 1. .Se han desarrollado variantes para mejorar la eficiencia del algoritmo básico de codificación de longitud de recorrido. Por ejemplo, se podría usar un factor de repetición negativo para indicar una secuencia de valores no repetitivos, en lugar de simplemente almacenar un factor de repetición de 1 con cada uno de los valores de la secuencia no repetitiva. Por ejemplo, la siguiente lista de valores: {20,
20,
20,
20,
99,
6B,
31,
40,
40,
40,
40,
40,
40,
40,
40,
. . .
)
podría codificarse como , {4,
20,
3,
99,
68,
31,
8,
40,
. .
.
)
lo que indica que el valor 20 ocurre 4 veces, seguido de 3 valores no repetitivos 99. 68 y 3 1 , el cual va seguido por 8 ocurrencias del valor 40. En este ejemplo de codificación, los primeros 15 bytes del archivo de entrada se comprimen en 8 bytes.
Codificación L Z W Desarrollado por Lempel, Ziv y Weleh, el método LZW es una modificación de los anteriores LZ, LZ77 y LZ78 algoritmos de reconocimiento de patrones. En el esquema LZW, los patrones repetidos en un archivo de imagen son sustituidos por un código. Por ejemplo, la siguiente lista de 12 valores contiene dos ocurrencias para cada patrón {128, 96} y |200, 30, 10}: {128,
96,
200,
30,
10,
128,
96,
50,
240,
200,
30,
10,
. . .
}
Se pueden sustituir estos dos patrones con los códigos c\ y c2 y, al patrón restante ¡50, 240} puede asignársele el código el. Esto reduce los primeros doce valores de la lista de entrada a los siguientes 5 bytes: { e l , c2, e l , c3, c2, . . . } Alternativamente, cualquier secuencia de valores no repetitivos, tales como {50, 240 ¡ podrían almacenarse en el archivo comprimido sin asignar un código a la secuencia.
15.3 Técnicas de compresión de archivos
795
Básicamente, el algoritmo LZW busca secuencias repetidas y construye una tabla de tales secuencias junto con sus códigos asignados. Así, este esquema de codificación se denomina algoritmo sustitucional o algoritmo basado en diccionario. El archivo comprimido se decodiflca entonces con la tabla de códigos.
Otros métodos de compresión mediante reconocimiento de patrones Se pueden usar esquemas de reconocimiento de patrones para localizar repeticiones de combinaciones de blanco y negro o color RGB a lo largo de todo un archivo de imagen. Se pueden detectar lineas de barrido duplicadas y otros patrones y codificarse para reducir más aún el tamaño de los archivos de imagen. Además, se han aplicado métodos de fractales para obtener pequeños conjuntos codificados autosimilares de valores de color.
Codificación Huffman Con el método IlulTman la compresión del archivo se logra usando un código de longitud variable para los valores de un archivo de imagen. El método de codificación Huffman asigna el código más cono al valor del archivo que tiene una ocurrencia más frecuente, y el código más largo se asigna al valor que ocurre con menor frecuencia. La idea básica en el algoritmo Iluífman es la misma que en el código Morse, el cual asigna códigos de caracteres de longitud variable a letras del alfabeto. A las letras con mayor frecuencia en el esquema Morse, se les asigna códigos de un carácter, y las letras con frecuencia más baja tienen asignado códigos de cuatro caracteres. Por ejemplo, la letra E se codifica con un «punto» (V), la letra T se codifica como «guión» (-) y la letra 0 se codifica como una secuencia de cuatro caracteres con un punto y tres guiones (--.-). En cambio, en lugar de usar códigos de caracteres, el código Huffman asigna códigos de bits de longitud variable a los valores de un archivo de imagen, que ofrecen mayores tasas de compresión. El primer paso en el algoritmo Huffman consiste en contar el número de ocurrencias para cada valor contenido en el archivo de imagen de enUada. Luego, los códigos de bits se asignan a los valores de acuerdo con la frecuencia contada. Un método para asignar los códigos de bits de longitud variable es construir un árbol binario con los valores de alta frecuencia cerca de la raíz del árbol y los valores con frecuencias más bajas como nodos hoja. Comenzando con los valores de baja frecuencia, se pueden crear subárboles de abajo a arriba. A cada nodo rama de un subárbol se le asigna una etiqueta numérica, que es la suma de las cuentas de frecuencia o los nodos etiqueta de sus dos hijos. Cuando el árbol está completo, todos los subárboles de la izquierda se etiquetan con el valor binario 0 y todos los árboles de la derecha se etiquetan con el valor binario I. El código de bit para cada valor del archivo se forma mediante la concatenación de las etiquetas de bit de las ramas, desde la raíz del árbol hacia abajo hasta el nodo posición de aquel valor de archivo del árbol. Para ilustrar los pasos generales de construcción de un árbol se usa el conjunto de seis valores de la Tabla 15.1. Este conjunto representa una pequeña imagen de ejemplo que contiene 21 elementos, en la que el valor % aparece 8 veces, el valor 177 aparece 4 veces, y así sucesivamente para los otros cuatro valores del archivo. TABLA 15.1.
RECUENTO DE FRECUENCIAS PARA LOS VALORES DE UN ARCHIVO PEQUEÑO DE EJEMPLO
Valor de archivo
Recuento de frecuencias
4 I 3
1 j
Total de valores en el archivo
21
796 CAPÍTULO 15 Formatos de archivos gráficos
Lista de etiquetas de las frecuencias restantes 96 177 141 85 nodo
1 (210)
(43)
1 4 3
1 3
FIGURA 15.3. Formación de un subárbol Huffman usando los valores de archivo 21Ü y 43.
3 (I4I)
(85)
FIGURA 15.4. Formación de un subárbol Huffman usando los valores de archivo 141 y 85.
7
FIGURA 15.5. Formación de un subárbol Huffman usando los valores de archivo 177 y un subárbol creado previamente.
Lista de etiquetas de las frecuencias restantes 96 8 nodo 6 177 4 nodo 3
Lista de etiquetas de las frecuencias restantes 96 i nodo 7 nodo 6
4 (177) (210)
Lista de etiquetas de las frecuencias restantes nodo
FIGURA 15.6. Formación de un subárbol Huffman uniendo dos suhárboles previamente creados. 21
Lista de etiquetas de las frecuencias restantes
(177)
FIGURA 15.7. Árbol binario llutYman completo para los valores de archivo de la Tabla 15.1. Los valores 210 y 43 de esta tabla tienen el recuento de frecuencias más bajo, por lo que se usan estos dos valores para formar el primer subárbol (Figura 15.3). A la raíz de este subárbol se le asigna una etiqueta nodo que es igual a la suma del número de ocurrencias de sus dos hijos: 3 = 2 -I- 1. Se borran esos dos valores de archivo (210 y 43) de la lista activa de tal forma que el siguiente recuento de frecuencia menor es 3. Pero justo
153 Técnicas de compresión de archivos
797
21
13 0/
\1
(96)
Lista de etiquetas de las frecuencias refilantes
7 0/ 4 (177)
0/
\l 3 0/
\l
3 (141)
\l 3
1 (43)
FIGURA 15.8. Árbol binario Huffman completo con el etiquetado de las ramas. se ha creado un subárbol que también tiene la etiqueta de nodo 3. Por tanto, se puede formar el siguiente subárbol usando cualquier par de los tres elementos que tienen la etiqueta 3. Se eligen los dos valores de archivo para formar el subárbol mostrado en la Figura 15.4, y se borran los valores 141 y 85 de la lista activa. El siguiente subárbol se construye con el valor de archivo 177, el cual presenta una frecuencia de 4, y el subárbol cuya rama tiene la etiqueta 3 (Figura 15.5). Se borra el valor de archivo 177 y el nodo del árbol con la etiqueta 3 de la lista activa, y ahora los dos «recuentos» más bajos de la lista representan subárboles. Estos dos subárbolcs se combinan para producir el nuevo subárbol mostrado en Figura 15.6. Finalmente, se completa la construcción del árbol binario (Figura 15.7) uniendo el valor de archivo 96 con el último subárbol creado. El valor asignado a la raíz del árbol es el recuento total (21) de lodos los valores del archivo de imagen. Ahora que se tienen todos los valores del archivo en el árbol binario, se pueden etiquetar las ramas de la izquierda del árbol con el valor binario 0 y las ramas de la derecha con el valor binario 1, como se muestra en la Figura 15.8. Comenzando desde la raíz del árbol, se concatenan las etiquetas de las ramas hacia abajo en cada uno de los nodos hoja. Esto forma el conjunto de códigos de longitud variable para cada uno de los valores de archivo, y después se establece la Tabla 15.2, la cual se almacenará con el archivo comprimido. En este ejemplo, hay un valor de archivo con un código binario de un dígito, tres valores de archivo con un código binario de tres dígitos, y dos valores de archivo con un código binario de cuatro dígitos. Los valores de baja frecuencia tienen códigos más largos, y los valores con frecuencia más alta tienen códigos más cortos. Una característica importante de los códigos Huffman es que ningún código de bits es un prefijo para ningún otro código de bits. Esto permite decodificar una lista codificada de valores de archivo proporcionando la Tabla 15.3 junto con la Tabla 15.2. Para demostrar el algoritmo de decodiíicación, se supone que el archivo comprimido contiene la trama de bits {100100100...}. El primer valor de bits en este archivo es l,así que - TABLA 15.2. CÓDIGOS HUFFMAN INDEXADOS PARA EL ARCHIVO índice
Valor de archivo
Código binario
l
96
l
2
I77
000
3
I4l
010
4
85
011
5
2IÜ
0010
6
43
0011
7 9 8 C APÍTU LO 15 Formatos de archivos gráficos
TABLA 15.3. TABLA DE REFERENCIA DE CÓDIGOS DE BIT Longitud de código de bits
Valor minimo de código
Valor máximo de código
Primer indice
I
I
1
1
3
000
011
2
4
0010
0011
5
debo representar el valor de archivo % porque hay un código de bit I y no puede ser un prefijo para ningún otro código. Después, se tiene el valor de bit 0. No hay ningún otro código de bits además del I y no hay códigos de dos bits, así que el siguienle código debe ser 001 ó 0010. Verificando la tabla de códigos indexada, se encuentra un valor de archivo de 210 con un código 0010, lo que significa que no puede haber un valor de archivo con el código 001. En este punto, se tienen decodificados los dos primeros valores de archivo. % y 210. El siguiente código en la trama de bits debe ser 010 ó 0100. Hay un valor de archivo con el código 010, así que no puede haber un código de cuatro bits con dicho prefijo. Por tanto, el tercer valor de archivo decodillcado es 141. Se continua analizando la trama de bits de esta manera hasta que el archivo comprimido haya sido completamente decodificado. Se pueden usar también otros esquemas para generar y asignar códigos de bits Huffman. Una vez que se tiene el recuento de frecuencias, se podría asignar una longitud de código a cada valor de archivo. Usando la longitud de código y el recuento de la frecuencia, se puede usar un algoritmo de combinación de listas para deducir los códigos de bits específicos. También se puede emplear un conjunto de códigos predefinido para asignar códigos a los valores de archivo, lo que elimina la necesidad de almacenar los códigos con el archivo comprimido.
Codificación aritmética En este esquema de compresión, el recuento de frecuencias de un archivo se usa para obtener códigos numéricos para secuencias de valores de archivo. El algoritmo de codificación aritmética primero calcula la fracción del archivo que está ocupada por cada valor. Esto crea un conjunto de subintervalos dentro del intervalo de 0.0 a 1.0. Después, cada fracción de archivo se mapea repetidamente sobre estos subintervalos para establecer intervalos numéricos para las diferentes combinaciones de valores de archivo. Los límites numéricos de estos intervalos se usan para codificar estas combinaciones. Para ilustrar el método, consideramos un archivo con 80 entradas y sólo tres valores distintos. El recuento de frecuencias y las correspondientes fracciones de archivos para los tres valores se enumeran en la Tabla 15.4. Asi, el valor V se asocia con el stibinlervalo de 0.00 a 0.20 dentro del intervalo unidad, el valor V se asocia con el subintervalo de 0.20 a 0.50, y el valor S| se asocia con el subintervalo de 0.50 a 1.00. En otras palabras, el 20 por ciento del intervalo unidad se asocia con F,, el 30 por ciento con K-, y el 50 por ciento con {
2
TABLA 15,4. RECUENTO DE FRECUENCIAS Y FRACCIÓN DE OCURRENCIAS PARA LOS VALORES DE UN ARCHIVO PEQUEÑO DE EJEMPLO Valor del archivo
Total
Recuento de frecuencias
Fracción de archivo
Rango del intervalo unidad
16
0.20
0.00-0.20
24
0.30
0.20-0.50
40
0.50
0.50-I.ÒO
80
LOO
15.3 Técnicas de compresión de archivos 7 9 9
TABLA
15.5. RANGO DEL INTERVALO UNIDAD PARA CADA SECUENCIA DE DOS VALORES QUE COMIENZA CON EL VALOR V* Secuencia
Rango del intervalo unidad 0.50-0.60 0.60-0.75 0.75-1.00
l'y Si ahora mapeamos l\ sobre el subinterv alo K ésle ocupará el 20 por ciento de la mitad superior del intervalo unidad. Este nuevo suhintervalo, con un rango de 0.50 a 0.60, representa la secuencia F , F Resultados similares se obtienen para los mapeos de W y \\ sobre el subintervalo V la Tabla 15.5 enumera los rangos para estas tres secuencias de dos valores. Continuando de esta forma, se pueden mapear los intervalos para las secuencias de dos valores sobre otros subintervalos para obtener las secuencias para combinaciones más largas de los valores de archivo. Los valores límite para los subintervalos se usan entonces para codificar y decoditlcar las secuencias dentro del archivo. Pueden emplearse varios algoritmos para determinar las subdivisiones del intervalo unidad y asignar códigos numéricos a combinaciones de valores de archivo. Y el algoritmo de codificación aritmética se implemeiv ta típicamente usando números binarios en lugar de valores en punto flotante dentro del intervalo unidad. El archivo comprimido es entonces una secuencia de valores binarios. v
p
y
Trasformada discreta del coseno Una serie de métodos de tranformadas numéricas, incluyendo las transformadas de Fourier y Hadamard, han sido aplicadas a la compresión de archivos, pero la trasformada discreta del coseno es el método más comúnmente usado. Los algoritmos de implemenlaeión eficientes para una trasformada discreta del coseno ofrecen una ejecución más rápida y mejor fidelidad de color en una imagen reconstruida con unas tasas de compresión más altas. Para una lista de n valores numéricos con k = 0, 1 // 1, el método discreto del coseno genera el siguiente conjunto de valores transformados. (2A +l)./7r v;=siseos
para / = 0 . 1
/i-l
4-«
donde. ,
para j = 0
—. para j * * 0 n Por tanto, este método de transformación calcula una suma discreta de términos coseno con una frecuencia que se va incrementando y con amplitudes que son proporcionales a los valores de entrada. Excepto por la posibilidad de errores de redondeo, los valores originales se recuperan con la trasformada inversa: n
I
(2A
+ I)J;r
para / ; = ( ) , !
n -1
(15.2)
800
CAPITULO 15 Formatos de archivos gráficos
Muy a menudo, los valores de transformación Vj'sc refieren a los «coeficientes» de las funciones coseno en la ecuación de la trasformada inversa. Pero ésta es una terminología incorrecta, ya que los coeficientes de los términos coseno en el sumatorio son los productos c Vj. Para ilustrar este método de transformación, consideremos la siguiente lista de 8 valores de entrada: f
{2I5, 2 0 9 , 2 1 1 , 2 0 7 , 192, 148, 88. 63) Los valores transformados, calculados con dos posiciones decimales, para esta entrada son: ¡471.29, 143.81.-67.76, 16.33,7.42,-4.73,5.49, 0.05} En este ejemplo, observamos que las amplitudes de los valores transformados decrecen notablemente, de tal fomia que los términos coseno con la frecuencia más alta contribuyen menos a la recuperación de los valores de entrada. Esta es una característica básica de la trasformada discreta del coseno, que permite aproximarse muy estrechamente a los valores originales usando sólo los primeros valores transformados. Por tanto, para obtener un archivo de imagen comprimido, se podrían calcular y almacenar sólo la primera mitad de los valores de transformación. La Tabla 15.6 muestra los resultados de la Ecuación 15.2 cuando se emplean 4, 5 o los 8 valores transformados para recuperar los valores de entrada. Todos los valores calculados en la tabla están redondeados a dos posiciones decimales. Podemos mejorar la eficiencia de esta técnica de compresión transformando bloques rectangulares de valores de entrada, mejor que transformando conjuntos lineales de valores a través de una sola línea de barrido. Para un bloque cuadrado de // por n valores de entrada, los valores de transformación se calculan como:
vL = <;„, Llecos
2k + № 2n
eos
(2j
+ \)mn
(15.3)
2n
con /, m = 0, 1, . .
n- 1
y -,
si/=0 o m=0
-, n
si / * ( ) y théQ
Además, el conjunto de n por n valores de entrada se recupera usando la trasformada inversa:
i/
VV
i/'
\(2j + \)l7t]
I )mn \{2k + \)
(15.4,
CULOS DE LA TRANSFORMACIÓN INVERSA DISCRETA DEL COSEI Valores de entrada 215
209
211
207
192
148
88
63
Términos suma
Valores de la transformada inversa discreta del coseno
4
212.63
211.85
211.53
207.42
188.43
147.65
95.47
58.02
5
215.26
209.23
208.91
210.04
191.06
145.02
92.84
60.64
8
215.00
209.00
211.00
207.00
192.00
148.00
88.00
63.00
15.4 Composición de lo mayoría de formatos de archivo 801
donde /• k
- 0, 1
//
I
Esta tranformada y su inversa se implementan típicamente usando grupos de 8 por 8 valores de entrada, de tal forma que los grupos de valores de color a lo largo de 8 líneas de barrido se procesan simultáneamente.
15.4 COMPOSICIÓN DE LA MAYORÍA DE FORMATOS DE ARCHIVO Cientos de formatos de archivo han sido desarrollados para representar dalos gráficos dentro de diferentes contextos para diferentes sistemas. Los sistemas operativos, por ejemplo, normalmente usan una serie de formatos especialmente diseñados en diversas rutinas de procesamiento del sistema. Existen fonnatos individuales para aplicaciones específicas, tales como el modelado tridimensional, las animaciones, las interfaces gráficas de usuario, el software de trazado de rayos, las grabaciones de vídeo, el software para visualizaciones científicas, los programas de dibujo, los procesadores de texlo. paquetes de hojas de cálculo, comunicaciones por Internet, multidifusión por televisión y transmisión de faxes. Además, los comités de estandarización ISO y ANSÍ han propuesto distintos formatos y sistemas de compresión de archivos para uso general. La mayoría de los formatos de archivo están diseñados para acomodar imágenes de color, pero algunos se aplican sólo a bitmaps. Sin embargo, el nombre del formato a menudo es engañoso, ya que el termino mapa de bits ó bitmap se usa frecuentemente para hacer referencia a imágenes de color (pixmaps). Esta situación es simplemente el resultado del uso continuado de la vieja etiqueta, bitmap, para un archivo digitalizado. Antes del desarrollo de los dispositivos de visualización en color, todas las imágenes digitalizadas se almacenaban como bitmaps (un bit por píxel) representando los patrones de píxel blanco y negro en una imagen. Cuando se desarrollaron las técnicas de color, los archivos pixmap (múltiples bits por píxel) sustituyeron a los bitmaps. Pero muy a menudo, estos archivos se siguen denominando bitmaps. Como resultado, muchos esquemas de Codificación de color en uso hoy en día para archivos de imagen se etiquetan como «formatos bitmap» incluso aunque sean realmente formatos pixmap (múltiples bits por píxel). En cualquier caso, la documentación para cada formato puede consultarse para determinar el número de bits que realmente se asignan a cada posición de píxel en el archivo. Para la mayor parte, los formatos de arclm o descritos en esta sección son no estáticos. Los mismos, sufren constantes revisiones y actualizaciones, y a menudo existen muchas variantes para un formato particular.
JPEG: Joint Photographic Experts Group En su forma básica, este sistema complejo y ampliamente utilizado, desarrollado por el comité JPEG de la organización internacional de estándares ISO consiste en una larga colección de opciones para compresión de archivos. Más de dos docenas de variantes se dan para la definición de JPEG, así que se puede implcmentar de un número de maneras diferente, desde un simple algoritmo con pérdidas hasta un método de alta compresión sin pérdidas. Pero la definición básica de JPEG no especifica completamente cómo el archivo de imagen comprimido debería estructurarse para que pueda usarse en distintos sistemas informáticos o por diferentes aplicaciones. Por ejemplo, no hay una organización especifica para la información de cabecera y no hay especificación para el modelo de color que debería usarse en el archivo comprimido. II estándar JPEG define cuatro modos generales para la compresión de archivos, que son los modos sin pérdidas, secuencia], progresivo y jerárquico. En el modo JPE(¿ sin pérdidas, un esquema de reconocimiento de patrones se combina tanto con codificación Huffman como con codificación aritmética. Sin embargo, el modo original de JPEG sin pérdidas no es tan eficiente como otros formatos sin pérdidas disponibles, por lo que raramente se implementan. El modo seeiiencial JPEG básico es la versión de JPEG más comúnmente utilizada. Los valores numéricos para los componentes de color en una imagen se almacenan en 8 hits, y el algoritmo tic compresión combina la tranformada discreta del coseno con la codificación Huffman o arilmé-
802
CAPÍTULO 15 Formatos de archivos gráficos
tica. También se ha definifo un modo secuencia! extendido con más opciones que el modo secuencial básico y cuyos componentes de color pueden especificarse usando 16 bits. En el modo JPEG progresivo, un archivo de imagen se procesa usando distintas pasadas para que las "capas" de la imagen puedan generarse con distintas resoluciones. Este modo, generalmente llamado JPEG progresivo, se está haciendo popular para aplicaciones de Interne!, porque una aproximación de tipo borrador de una imagen puede visualizarse rápidamente antes de descargarse ta imagen de archivo completa. Otra colección de procedimientos para obtener versiones de una imagen mejoradas incrementalmente está contenida en el modo JPEG jerárquico, que divide una imagen en un conjunto de subimágenes. Esto permite seleccionar secciones de una imagen para construirlas progresivamente. Debido a su complejidad, el JPEG jerárquico no es muy usado. Pueden ofrecerse opciones en implementaciones de JPEG a gran escala para la selección del modo de compresión y los parámetros de compresión, como el número de términos que hay que usar en los cálculos del sumalorio de la transformada discreta inversa del coseno. También, las definiciones de compresión JPEG especifican que tanto la codificación 1 IuITman como la codificación aritmética pueden combinarse con la trasformada discreta del coseno. Pero las implementaciones de JPEG nunca usan los algoritmos de codificación aritmética, porque estos algoritmos están patentados y requieren el pago de una licencia. A pesar de que la especificación de JPEG no define una estructura específica del archivo de imagen comprimido, ahora las implementaciones usan el formato JPEG File Interchange (JFIF) propuesto por Eric Hamilton en C-Cube Microsystems y basado en sugerencias de muchos usuarios de JPEG. En este formato, la cabecera del archivo contiene un idenlificador JFIF unívoco (que es lo que se denomina "firma" del archivo), la versión del JFIF utilizado para configurar el archivo, el tamaño de la imagen (en pixeles por cm o en píxeles por pulgada), la altura y anchura de la vista preliminar opcional RGB del archivo (denominada imagen "miniatura") y los valores RGB para la la vista preliminar opcional de la imagen. Los valores de los píxeles del archivo comprimido se almacenan usando el modelo de color YC .C , y los componentes de color se almacenan en orden, en primer lugar Y, en segundo C y, por último, C . Para una imagen en escala de grises, sólo se usa la componente Y. Otra información del archivo incluye las tablas necesarias para los algoritmos de compresión. Los enteros se almacenan en archivos JPEG usando el formato big-endian. f
h
!t
r
La codificación secuencial básica JPEG/JF1F de un archivo de imagen consiste normalmente en las siguientes operaciones. (I)
Conversión de color: los valores de color de píxel RGB en un archivo de imagen son convertidos en componentes de color YC C . r
h
Muestreo de color: el número de valores de color del archivo puede reducirse usando sólo los valores para los píxeles seleccionados o haciendo la media de las componentes de color para grupos de píxeles adyacentes. Una implemenlaeión sencilla para estas operaciones de muestreo debe tomar los valores de color de todos los otros píxeles, todos los píxeles terceros o todos los píxeles cuartos. Usualmente, las componentes de color se muestrean en diferentes frecuencias, por lo que los valores de mayor luminancia, las componentes K, se seleccionan. Esto permite alcanzar mayores tasas de compresión, ya que se almacenan muy pocos valores diferentes de crominancia, las componentes C yC , r
h
Tranformada discreta del coseno: a continuación, los grupos de 8 por 8 valores de píxeles de color se convierten en valores de la trasformada discreta del coseno usando la Ecuación 15.3. (4)
Reducción de los valores transformados: para una compresión mayor del archivo de imagen codifi-
cado, se almacena un conjunto reducido de valores de la trasformada (Sección 15.3). El número de valores del conjunto reducido puede fijarse, o puede calcularse usando un algoritmo para determinar la influencia de los diversos términos de la trasformada. (5) Codificación Huffman: se realiza una operación de compresión final convirtiendo los valores de la trasformada discreta del coseno en códigos Huffman, como se ha explicado en la Sección 15.3, El fórmalo SPIFF (Still-Picture Interchange File Format) desarrollado por Eric Hamilton y el comité ISO JPEG, es una extensión de JFIF. Este formato tiene muchas más características y opciones que JFIF, y se
15.4 Composición de ia mayoría de formatos de archivo 8 0 3
espera que SP1FF sustituya eventualmenie a JFIF en las implementaciones JPEG Sin embargo, como JPEG, esta extensión del formato JFIF contiene muchas más opciones que pueden resultar prácticas en una implementación. Por ejemplo, JFIF usa sólo un modelo de color (YC C ), pero SPIFF ofrece opciones para trece modelos de color diferentes. Para imágenes fotorrealistas de gráficos por computadora y fotografías digitalizadas, las implementaciones JPEG actuales ofrecen una mayor tasa de compresión que cualquier otro sistema. Pero otros formatos pueden ofrecer tasas de compresión comparables sin pérdida de información de color para imágenes sencillas que contengan grandes áreas de un mismo color. r
h
CGM: Computer-Graphics Metafile Format Este formato es otro estándar desarrollado por ISO y ANSÍ. Está diseñado para usarse en cualquier sistema infomiático y en cualquier área de los gráficos por computadora, incluyendo la visualización científica, los sistemas CAD, las artes gráficas, la maquetación electrónica, publicidad electrónica y cualquier aplicación que utilice bibliotecas gráficas GKS o P111GS. Así, CGM soporta una gran variedad de características y opciones. Como indica la denominación me/afile (metaarchivo), CGM permite que una descripción de imagen sea dada como un pixmap o como un conjunto de definiciones geométricas, incluyendo atributos tales como tamaño de la línea, tipo de linea, estilo del relleno y especificaciones de las cadenas de caracteres. En un archivo de imagen pueden incluirse muchos otros parámetros, tal como el valor máximo para las componentes de color, el tamaño de una tabla de color, la lista de fuentes usadas en el archivo y los límites de la ventana de recorte. En CGM, se usa un esquema de codificación de caracteres para minimizar el tamaño del archivo y se optimiza un código numérico binario para codificar y decodificar el archivo de imagen más rápidamente. Los valores de píxeles pueden darse usando varios esquemas de color, tales como los modelos RGB, CMYK, YC C , CIÉ y tablas de color. Además, los archivos pixmap pueden comprimirse usando variantes de la codificación de longitud de recorrido y de la codificación Huffman. r
h
TIFF:Tag Image-File Format Un consorcio de compañías de computadoras encabezadas por Aldus Corporation desarrollaron TIFF como un formato eficiente para la transferencia de imágenes digitalizadas entre diferentes aplicaciones y sistemas informáticos. Aunque es altamente complejo, TIFF es uno de los formatos más versátiles y puede personalizarse para aplicaciones individuales. Es ampliamente usado en aplicaciones diversas como son las imágenes médicas, la edición electrónica, las interfaces gráficas de usuario, el almacenamiento de imágenes por satélite y la transmisión de fax. El formato TIFF puede usarse con nivel-b, escala de grises, imágenes a color completo, y los archivos TIFF se diseñan para almacenar múltiples imágenes digitalizadas. La información de píxeles de color puede proporcionarse como componentes RGB o como tablas de color. Se ofrecen más alternativas de compresión en TIFF que en cualquier otro sistema. Estos esquemas de compresión incluyen combinaciones de codificación de longitud de recorrido, codificación LZW, codificación Huffman y la serie de métodos JPEG.
PNG: Portable Network-Graphics Format Diseñado por un grupo de desarrolladores independientes, PNG proporciona un esquema de compresión sin pérdidas enormemente eficiente para el almacenamiento de imágenes. Los algoritmos de compresión en PNG incluyen codificación Huffman y variaciones de la codificación LZ. Este formato está ganando popularidad en Internet para el almacenamiento y la transmisión de imágenes. También es útil para almacenar imágenes temporalmente para ediciones repetidas. Para imágenes sencillas de gráficos por computadora, PNG genera archivos con tasas de compresión muy altas, comparables a aquellos archivos comprimidos con JPEG
804
CAPÍTULO 15 Formatos de archivos gráficos
Los valores enteros se almacenan en orden hig-endkm y las componentes de color pueden especificarse con una precisión superior a 16 bits por pixel. PNG soporta una serie de opciones, incluyendo componentes de color RGB, componentes de color XYZ, escala de grises, tablas de color y un valor allá para la información de transparencia.
XBM: X Window System Bitmap Format y XPM: X Window System Pixmap Format A diferencia de otros formatos, XBM y XPM almacenan la información de las imágenes como código C o C-H- que se procesa en estaciones de trabajo usando el sistema X Window. Así, los valores de píxel se representan en matrices, se almacenan en el orden de barrido, de izquierda a derecha. Como sus propios nombres indican, XBM es un formato para bitmaps (un bit por pixel) y XPM es un formato para píxmaps (múltiples bits por píxel). Estos formatos son soportados por la mayoría de los exploradores web. Los formatos XBM y XPM no contienen algoritmos de compresión, pero el tamaño de los archivos puede reducirse usando programas de compresión especialmente diseñados. En lugar de cabeceras de archivos, estos formatos usan directivas de preprocesador tídefwe para especificar información como el número de píxeles por línea de barrido y el número de líneas de barrido. Hn el formato XBM, los valores de bit iguales a 1 representan el color del primer plano actual y los valores de bit iguales a 0 representan el color del fondo actual. En el formato XPM, los valores pueden almacenarse en tablas de color usando componentes RGB o HSV.
Formato Adobe Photoshop Usado ampliamente en aplicaciones de procesamiento de imágenes, el formato Adobe Photoshop está optimizado para el acceso rápido a imágenes digilalizadas grandes y a color completo. Por el contrario, se alcanzan compresiones muy pequeñas con el esquema de codificación de longitud de recorrido usada en Photoshop, y las primeras versiones de Photoshop no contenían métodos de compresión. Los valores de pixel se almacenan en orden big~ettdian y Photoshop ofrece una serie de opciones. Photoshop soporta píxmaps, bitmaps (imágenes monocromáticas) e imágenes en escala de grises. Los colores pueden almacenarse usando componentes RGB, componentes de color CMYK o en tablas de color. Y se ofrecen varios esquemas para la representación de múltiples colores por píxel e imágenes semitono, así como de parámetros de transparencia.
MacPaint: Macintosh Paint Format Producto de Apple Corporation, MacPaint es un formato estándar para todas las aplicaciones Macintosh. Los archivos de imagen para este formato son bitmaps con el valor 0 indicando blanco y el valor I indicando negro. El formato McPaint se usa típicamente para texto, dibujo de líneas y clip arts. Los valores de píxel se almacenan en orden hig-endian y los archivos McPaint siempre contienen 576 píxeles por línea de barrido y 720 líneas de barrido. El esquema de codificación de longitud de recorrido se usa para comprimir los archivos de imagen.
PICT: Formato Picture Data Este formato híbrido es otro producto para aplicaciones Macintosh de Apple Corporation. Soporta imágenes que se especifican como bitmaps, píxmaps o representaciones geométricas. Un archivo PICT en un formato de representación geométrica que contiene una lista de funciones Macintosh QuickDraw que definen una imagen como un conjunto de segmentos de línea, polígonos, arcos, bitmaps, otros objetos, parámetros de recorte, atributos y otros parámetros de estado. Las imágenes pueden especificarse usando un formato monocromo (bitmap), componentes de color RGB o una labia de color. Los archivos digitalizados pueden comprimirse usando un algoritmo de codificación de longitud de recorrido.
15.5 Resumen
805
BMP: Formato Bitmap Aunque se denomina formato bitmap, BMP en realidad soporta archivos de imagen que contienen múltiples bits por píxel. Este formato fue desarrollado por Microsoft Corporation para aplicaciones del sistema operativo Windows. Los sistemas operativos IBM OS/2 también emplean otro formato pixmap similar, que también se denomina BMP. Los valores de píxel en un archivo BMP se almacenan en orden iiííle-indian usando I, 2 , 4 , 8, 16, 24 ó 32 bits por píxel. Los valores de píxel de color pueden especificarse con componentes de color RGB o con tablas de color. Y las líneas de píxeles de barrido se almacenan de abajo hacia arriba, con el origen de coordenadas en la posición inferior izquierda del pixmap. Un archivo BMP normalmente no se comprime, pero el algoritmo de codificación de longitud de recorrido puede aplicarse a pixmaps con 4 u 8 bits por píxel.
PCX: Formato de archivo PC Paintbrush Desarrollado por Zsoft Corporation. PCX es otro formato pixmap usado por sistemas operativos Windows. Los archivos de imagen en el formato PCX pueden contener desde I a 24 bits por píxel, y los valores de píxel pueden especificarse usando componentes RGB o tablas de color. Los valores se almacenan en orden littlcendian, con el orden de las líneas de barrido de arriba hacia abajo. Y los archivos digitalizados pueden comprimirse usando la codificación de longitud de recorrido.
TGA: Formato Truevision Graphics-Adapter Desarrollado por Truevision Corporation para su uso junto con los adaptadores gráficos Targa y Vista, el formato TGA pixmap es también conocido como formato Targa. liste formato es usado popularmente para la edición de vídeo. En el formato TGA, los valores de píxel se almacenan en orden litüe-endkm, y los archivos de imagen pueden contener 8, 16, 24 ó 32 bits por píxel. Los colores de píxel pueden especificarse como componentes RGB o en tablas, con dos posibles formatos de tabla. Puede usarse una única tabla de color RGB, o las componentes R, G y B pueden venir dadas en tablas separadas. Normalmente, los archivos TGA no se comprimen, pero los algoritmos de codificación de longitud de recorrido pueden aplicarse a archivos de imagen más grandes.
GIF: Graphics Interchange Format Este formato, diseñado para una transmisión enciente a través de línea telefónica de archivos de imagen digitalizados, es un producto de CompuServe Corporation. Usando un algoritmo LZW, GIF ofrece tasas de compresión razonables para imágenes de gráficos por computadora. Pero las tasas de compresión generadas por GIF para imágenes fotorrealistas no son tan buenos como aquellos producidos por JPEG o PNG. A pesar de ello, GIF se ha usado en muchas aplicaciones, aunque su popularidad ha decaído drásticamente debido a las evidentes aportaciones asociadas a los algoritmos de compresión LZW. Tanto imágenes monocromas como multicolor pueden procesarse con GIF, pero los valores de píxel sólo pueden especificarse en un rango de 1 a 8 bits, permitiendo un máximo de 256 colores. Los valores de píxel se almacenan en orden little-endian usando tablas de color RGB.
15.5 RESUMEN Para un sistema de gráficos digitalizados, un archivo de imagen normalmente es un pixmap RGB, el cual a menudo se denomina archivo digitalizado sin formato. Los valores de píxel RGB se almacenan como enteros en un rango de 0 hasta un valor máximo, el cual viene determinado por el número de bits disponibles para cada píxel. Una imagen también puede almacenarse usando una representación que contenga descripciones geométricas de componentes de la imagen, tales como segmentos de línea, áreas de relleno y apunes.
806
CAPÍTULO 15 Formatos de archivos gráficos
Cuando los archivos de imágenes digitalizadas se transfieren entre sistemas o se almacenan de una forma particular, es necesario reducir el número de valores de color representados en la imagen. El número de colores se puede reducir uniformemente mediante la combinación de niveles de color de varias maneras, tal como la media de niveles. El método para reducir colores por popularidad selecciona los valores de color que aparecen más frecuentemente. Y el método de corte medio subdivide el espacio de color en un conjunto de bloques, siendo lodos los colores contenidos en cada bloque sustituidos por el color promedio del bloque. Se han desarrollado diferentes formatos para el almacenamiento de archivos de imagen de forma conveniente para aplicaciones particulares o sistemas concretos. Estos formatos difieren en la estructura de la cabecera del archivo, el orden de los bytes (big eruikm o little endian) para valores enteros, y los métodos usados (si se usa alguno) para reducir el tamaño del archivo para su almacenamiento. La electividad de los métodos de reducción de archivos se puede medir por la tasa de compresión, que es la relación entre el tamaño del archivo original y el tamaño del archivo comprimido. Los algoritmos para reducir el tamaño del archivo que alteran los valores de color en un archivo de imagen se denominan con pérdidas, y aquellos que pueden r e s tablecer los valores de color exactamente se llaman sin pérdidas. Algunos formatos de archivo también pueden emplear esquemas de reducción de color. Un método común de compresión de archivos de imagen es la codificación de longitud de recorrido, la cual sustituye una secuencia de valores de píxel repetidos por el valor y la longitud del recorrido. El esquema de compresión de archivos LZW es una variación de la codificación de longitud de recorrido que sustituye patrones de píxeles repetidos por un código. Otros métodos de compresión de reconocimiento de patrones incluyen la comparación de lincas de barrido y procedimientos fractales para identificar conjuntos de valores de píxel aulosimilares, En la codificación Huffman, un código de longitud variable es asignado a valores de color de tal forma que los valores que ocurren más frecuentemente tienen el código más corto. La codificación aritmética usa el recuento de frecuencias para valores de color en un archivo de imagen para crear subdivisiones del intervalo unidad desde 0.0 hasta l .0. Los límites de cada suhintervalo se emplean entonces para codificar las secuencias de valores de color representadas por ese suhintervalo. La trasformada discreta del coseno multiplica los valores de color de píxel por los términos del coseno con frecuencia creciente, y luego suma dichos productos. Este proceso sumatorio convierte un conjunto de valores de píxeles de color en un conjunto de valores transformados. La compresión de archivos se consigue entonces mediante la eliminación de algunos valores transformados, que producen una compresión con pérdidas de la imagen. Muchos formatos de archivo están disponibles para diversas aplicaciones gráficas y para diferentes sistemas informáticas. Algunos formatos fueron desarrollados por las organizaciones de estándares ISO y ANSÍ, algunos surgieron de compañías de hardware o software, y algunos son productos de grupos independientes. Los formatos más ampliamente utilizados son JPEG, TILE, PNG, y aquellos para el sistema X Window, computadoras Apple Maeinloeh, y sistemas operativos Windows.
REFERENCIAS Los métodos de reducción de color se presentan en Hcckbert (1982 y 1994), Glassner (I990), Arvo (I99I) y Kirk (1992). González y Wintz (1987) exponen los métodos de trasformada y las técnicas de procesamiento de imágenes en general. Y varios algoritmos de compresión de archivos se detallan en Huffman (1952), Ziy y Lcmpel (I977 y I978), Welch (I984), Rao y Yip (1990), Arvo ( I 9 9 I ) , y Barnsley y Ilurd (I993). Puede encontrarse información de carácter general sobre formatos de archivos gráficos en Brown y Shepherd (I995), y Miaño (1999). Para obtener información adicional acerca de JPEG, consulte Taubman y Marcellin (200I), El formato de archivo estándar CGM se detalla en Henderson y Mumlbrd (I993).
EJERCICIOS 15.1
Escribir un programa para implemeniar reducción de color uniforme para todos los valores de color en un sistema a color completo, donde cada componente de color RGB se especifica en un rango de enteros de 0 a 255. La
Ejercidos
807
entrada será cualquier división culera del factor J que se aplicará a cada componente de color y la salida es un conjumo reducido de niveles de color enteros. 1 5 . 2 Modificare! programa del ejercicio anterior de modo que la entrada sea un entero k que especifique el número de niveles reducidos que se va a generar en lugar del factor de división. 1 5 . 3 Modificar el programa del Ejercicio 15.2 de modo que un número de reducción diferente se aplique a los componentes R, G y B. Las reducciones pueden especificarse corrió el rango de enteros para cada componente o el número de bits. 1 5 . 4 Escribir un programa para implementar el esquema de reducción de color que reduzca un archivo de imagen de entrada a k colores. La entrada del programa es una matriz de valores de píxeles y el tamaño de la matriz, especificado por el número de líneas de barrido y el número de posiciones de píxel a lo largo de cada línea de barrido. 1 5 . 5 Escriba un programa para implementar el esquema de reducción de color de medio corte. Un archivo de imagen que contiene // valores de píxel RGB debe reducirse a k valores de color. 1 5 . 6 Escriba un programa para implementar la codificación de longitud de recorrido para un sola línea de barrido que contiene 1024 valores enteros, con cada valor dentro del rango de 0 a 255. 1 5 . 7 Modifique el programa del ejercicio anterior para codificar un archivo que contenga n líneas de barrido. 1 5 . 8 Escriba un programa para implemeniar un algoritmo de codificación LZ simplificado para una sola línea de futrrido que contiene 1024 valores enteros, con cada valor dentro del rango de 0 a 255. El programa debe buscar sólo tres elementos de patrones, representando colores RGB repetidos. Use códigos enteros para los patrones. 1 5 . 9 Amplíe el programa del ejercicio anterior para procesar un archivo de entrada con n lincas de barrido. 1 5 . 1 0 Dado un archivo de imagen de entrada que contiene // líneas de barrido y m colores de píxel RGB en cada línea de barrido, escriba un programa para obtener una tabla de recuentos de frecuencias para los colorea de píxel. 1 5 . 1 1 Con el recuento de frecuencias del ejercicio anterior, escriba un programa para comprimir el archivo de imagen usando codificación HulVman. 1 5 . 1 2 Con el recuento de frecuencias del Ejercicio 15.10. escriba un programa para comprimir el archivo de imagen usando codificación aritmética. 1 5 . 1 3 Dada una lista de 32 colores de píxel, con tres componentes de color RGB para cada píxel, escriba un programa para calcular los valores de la trasfornuida discreta del coseno (Ecuación 15.1) para cada grupo sucesivo de 8 píxeles de la lista. 1 5 . 1 4 Usando la Ecuación 15.2 y los valores trasformados del ejercicio anterior, escriba un programa para calcular los 32 colores de píxel originales (restablecidos). 1 5 . 1 5 Modifique el ejercicio anterior para calcular los valores de la trasformada inversa para cada conjunto de 8 píxeles, usando cualquier número // seleccionado de entre los valores transformados; es decir, ti puede ser cualquier valor de I a 8, ambos inclusive. 1 5 . 1 6 Dado un archivo de imagen que contiene 32 por 32 colores de pixel, con tres componentes de color RGB, escriba un programa para calcular los valores de la trasformada discreta del coseno (Ecuación 15.3} para cada grupo sucesivo de píxeles 8 por 8. 1 5 . 1 7 Usando la Ecuación 15.4 y los valores transformados del ejercicio anterior, escriba un programa para calcular los colores de píxel de 32 por 32 originales (restablecidos). 1 5 . 1 8 Modifique el ejercicio anterior para calcular los valores de la trasformada inversa para cada conjunto de píxeles de 8 por 8. usando cualquier número /; por m seleccionado de entre los valores transformados; es decir, n y m pueden cada uno ser asignados a cualquier valor entero comprendido entre 1 y ambos inclusive.
Matemáticas para gráficos por computadora En los algoritmos de gráficos por computadora, se utilizan diversos conceptos y técnicas matemáticos. En este apéndice, vamos a proporcionar una breve referencia de los métodos de geometría analógica, álgebra lineal, análisis vectorial, análisis tensorial, números complejos, cuaternios, cálculo, análisis numérico y otras áreas de las que se trata en las explicaciones contenidas en el libro.
A.1 SISTEMAS DE COORDENADAS Tanto los sistemas de referencias cartesianos como los no cartesianos resultan útiles en las aplicaciones infográllcas. Normalmente, especificamos las coordenadas en un programa gráfico utilizando un sistema de referencia cartesiano, pero la especificación inicial de una escena podría proporcionarse en un sistema de referencia no cartesiano. A menudo, las simetrías escénicas, cilindricas o de otros tipos pueden aprovecharse para simplificar las expresiones relativas a las descripciones o manipulaciones de objetos.
Coordenadas de pantalla cartesianas bidimensionales Para los comandos independientes del dispositivo incluidos dentro de un paquete gráfico, las coordenadas de pantalla se referencian dentro del primer cuadrante de un sistema cartesiano bidimensional en posición estándar, como se muestra en la Figura A.l(a). El origen de coordenadas de este sistema de referencia se encuentra situado en la esquina inferior izquierda de la pantalla. Sin embargo, las líneas de barrido se enumeran comenzando por 0 en la parte superior de la pantalla, por lo que las posiciones de pantalla están representadas internamente con respecto a la esquina superior izquierda de la misma. Por tanto, los comandos dependientes del dispositivo, como por ejemplo los relativos a la entrada interactiva y a las manipulaciones de las ventanas de visualización, suelen hacer referencia a las coordenadas de pantalla utilizando el sistema cartesiano invertido que se muestra en la Figura A.l(b). Los valores de las coordenadas horizontales en los dos sistemas son iguales, y un valor y invertido se convierte a un valor y medido desde la parte inferior de la pantalla mediante el cálculo:
v=v J
-'m»
Ufí
-v ' inven
En algunos paquetes de aplicación, el origen de las coordenadas de pantalla puede situarse en una posición arbitraria, como por ejemplo en el centro de la pantalla.
Sistemas de referencia cartesianos bidimensionales estándar Utilizamos sistemas cartesianos en posición estándar para las especificaciones en coordenadas universales, en coordenadas de visualización y para otras referencias dentro de la pipeline de visualización bidimensional. Las coordenadas en estos sistemas de referencias pueden ser positivas o negativas, con cualquier rango de valores. Para mostrar una vista de una imagen bidimensional, designamos una ventana de recorte y un visor con el fin de mapear una sección de la imagen sobre las coordenadas de pantalla.
810
APÉNDICE A
Matemáticas para gráficos por computadora
FIGURA A.1. Coordenadas de pantalla cartesianas referenciadas con respecto a la esquina inferior izquierda de la pantalla (a) o a la izquierda superior izquierda de la pantalla (b).
Coordenadas polares en el plano xy Un sistema no cartesiano bidimensional frecuentemente utilizado es el sistema de referencia en coordenadas polares (Figura A . 2 ) , en el que las coordenadas se especifican mediante una distancia radial r con respecto a un eje de coordenadas y un desplazamiento angular O con respecto a la horizontal. Los desplazamientos angulares positivos se definen en el sentido contrario a las agujas del reloj, mientras que los desplazamientos angulares negativos se definen en el sentido de las agujas del reloj. La relación entre coordenadas cartesianas y polares se muestra en la Figura A . 3 . Considerando el triángulo recto de la Figura A.4 y utilizando la definición de las funciones trigonométricas, podemos realizar la transformación de coordenadas polares a coordenadas cartesianas mediante las expresiones: A* = r c o s 0 ,
y = rsinfl
(A.2)
La transformación inversa, de coordenadas cartesianas a coordenadas polares es:
Los valores angulares pueden medirse en grados o en unidades adimensionales (radianes). Un radian se define como el ángulo subtendido por un arco circular que tenga una longitud igual al radio del círculo. Esta
Lusa V
eje F
/ > O
ojo X
FIGURA A.2. Sistema de referencia en coordenadas polares, formado mediante círculos concéntricos y líneas radiales.
FIGURA A3. Relación entre coordenadas polares y cartesianas.
A.l Sistemas de coordenadas
811
r y
x
FIGURA A.4. Triángulo recto con hipotenusa r, lados x cy y un ángulo interior 6.
FIGURA A.5. Un ángulo 6 subtendido por un arco circular de longitud s y radio r.
definición se ilustra en la Figura A.5, que muestra dos líneas que se intersectan en un plano y un círculo centrado en el punto de intersección P. Para cualquier círculo centrado en P, el valor del ángulo # e n radianes está dado por el cociente: 6 =r
(radianes)
donde ,v es la longitud del arco circular que subtienden a By r es el radio del círculo. La distancia angular total alrededor del punto P es la longitud del perímetro del círculo (2pr) dividida por r, lo que es igual a 2p radianes. Si hablamos en grados, una circunferencia se divide en 360 arcos de igual longitud, por lo que cada arco subtiende un ángulo de l grado. Por tanto, 360° = 2n radianes. Pueden utilizarse otras cónicas, además de los círculos, para especificar las coordenadas. Por ejemplo, utilizando elipses concéntricas en lugar de círculos, podemos especificar los puntos en coordenadas elípticas. De forma similar, pueden aprovecharse otros tipos de simetrías para definir coordenadas planas hiperbólicas o parabólicas.
Sistemas de referencia cartesianos tridimensionales estándar La Figura A.6(a) muestra la orientación convencional para los ejes de coordenadas en un sistema de referencia cartesiano tridimensional. Decimos que este tipo de sistema cumple la regla de la mano derecha, porque el pulgar de la mano derecha apunta en la dirección z positiva si nos imaginamos encerrando el eje ~ al curvar los dedos desde el eje.r positivo hacia el eje y positivo (abarcando 90°), como se ilustra en la Figura A.6(b). En la mayoría de los programas infográlícos, las descripciones de los objetos y otros tipos de coordenadas se especifican mediante coordenadas cartesianas que cumplen la regla de la mano derecha. En las explicaciones contenidas en el libro (incluyendo el apéndice), hemos supuesto que todos los sistemas de referencia cartesianos cumplen la regla de la mano derecha, excepto cuando indiquemos explícitamente lo contrario. Los sistemas de referencia cartesianos son sistemas de coordenadas ortogonales, lo que simplemente significa que los ejes de coordenadas son perpendiculares entre sí. Asimismo, en los sistemas de referencia cartesianos, los ejes son líneas rectas. Aunque también los sistemas de coordenadas con ejes curvos resultan útiles en muchas aplicaciones. La mayoría de dichos sistemas son también ortogonales, en el sentido de que las direcciones de los ejes en cualquier punto del espacio son mutuamente perpendiculares.
8 1 2 APÉNDICE A Matemáticas para gráficos por computadora
cje>' i
ejez
eje
eje x
eje ;
y
eje i
(a)
FIGURA A.6. Coordenadas de un punto P en la posición (.v, y, z) en un sistema de referencia cartesiano estándar que cumple la regla de la mano derecha.
Coordenadas de pantalla cartesianas tridimensionales Cuando se muestra una vista de una escena tridimensional sobre un monitor de vídeo, se almacena información de profundidad para cada posición de pantalla. La posición tridimensional que corresponde a cada punto de pantalla suele estar referenciada mediante un sistema que cumple la regla de la mano izquierda, como se muestra en la Figura A.7. En este caso, el pulgar de la mano izquierda apunta en la dirección z positiva si nos imaginamos rodeando el eje z de modo que ios dedos de la mano izquierda vayan desde el eje x positivo hasta el eje v positivo abarcando W. Los valores de z positivos indican posiciones situadas detrás de la pantalla para cada punto en el plano xv, y el valor positivo de z se incrementará a medida que los objetos se alejen del observador.
Sistemas de coordenadas curvilíneas tridimensionales Los sistemas de referencia no cartesianos se denominan sistemas de c o o r d e n a d a s curvilíneas. La elección del sistema de coordenadas para una aplicación gráfica concreta dependerá de diversos factores, como la simetría, la facilidad de cálculo y las ventajas que puedan obtenerse de cara a la visualización. La Figura A.8 muestra un sistema de referencia general de coordenadas curvilíneas formado por tres superficies de coordenadas, donde en cada superficie una de las coordenadas tiene un valor constante. Por ejemplo, la superficie x¡x se define con x-¡ const^. Los ejes de coordenadas de cualquier sistema de referencia son las curvas de intersección de las superficies de coordenadas. Si las superficies de coordenadas se intersectan siempre con ángulos rectos, tendremos un s i s t e m a de c o o r d e n a d a s curvilíneas o r t o g o n a l e s . Los sistemas de referencia curvilíneos no ortogonales son también útiles en algunas aplicaciones, como por ejemplo en la visualización de movimientos gobernados por las leyes de la relatividad general, pero se utilizan menos frecuentemente en gráficos por computadora que los sistemas ortogonales. =
2
A.1 Sistemas de coordenadas
813
eje z z ^
eje v.
ejejr
eje y
3
eje*.
FIGURA A.8. L'n sistema de coordenadas curvilíneas general.
FIGURA A.9. Coordenadas cilindricas p, 6 y r.
En la Figura A.9 se muestra una especificación en coordenadas cilindricas de un punto en el espacio en relación con un sistema de referencia cartesiano. La superficie de p constante es un cilindro vertical; la superficie de 0 constante es un plano vertical que contiene al eje z; y la superficie de z constante es un plano horizontal paralelo al plano cartesiano xy. Podemos efectuar la transformación de coordenadas cilindricas a un sistema de referencia cartesiano mediante las ecuaciones: x = pcos0,
y = psin0,
z=Z
iA.5)
Otro sistema de coordenadas curvilíneas comúnmente utilizado es el sistema de coordenadas esféricas de la Figura A. 10. Las coordenadas esféricas se denominan en ocasiones coordenadas polares en el espacio tridimensional. La superficie de r constante es una esfera; la superficie de 6 constante es, de nuevo, un plano vertical que contiene al eje z; y al superficie de 0 constante es un cono cuyo vértice se encuentra en el origen de coordenadas. Si tp < 90, el cono se encontrará por encima del plano xy. Si tp > 90, el cono se encontrará por debajo del plano xy. Podemos efectuar la transformación de coordenadas esféricas a un sistema de referencia cartesiano mediante las ecuaciones: x = rcos#sin0,
y = rsin£sin0,
z =rcos
(A-6)
z
P(r.0.
FIGURA A.11. Ángulo sólido 0) subtendido por un FIGURA A.10.
Coordenadas esféricas r, G y <¡>.
parche esférico superficial con área A y radio r.
8 1 4 APÉNDICE A Matemáti cas para gráficos por computadora
Ángulo sólido La definición de ángulo sólido rose formula por analogía con la definición de ángulo en radianes bidimensionales 0entre dos líneas que se inlersectan (licuación A.4). Sin embargo, para un ángulo tridimensional, lo que hacemos es definir un cono cuyo vértice está en un punto P y una esfera centrada en P, como se muestra en la Figura A. 11. El ángulo sólido íoen la región cónica que tiene su vértice en el punto P se define como U 7 )
donde A es el área de la superficie esférica intersectada por el cono y r es el radio de la esfera. Asimismo, por analogía con las coordenadas polares bidimensionales, la unidad adimensional para los ángulos sólidos se denomina estereoradian. El ángulo sólido total en torno al punto P es el área total de la superficie esférica (4/D~) dividida por lo que es igual a 4;restereoradianes.
A.2 PUNTOS Y VECTORES Existe una diferencia fundamental entre el concepto de punto geométrico y el concepto de vector. Un punto es una posición especificada mediante sus coordenadas en algún sistema de referencia, dependiendo las coordenadas y otras propiedades del punto de nuestra selección de sistema de referencia. Un vector, por el contrario, tiene propiedades que son independientes del sistema de referencia concreto que elijamos.
Propiedades de los puntos La Figura A. 12 ilustra la especificación de un punto bidimensional P mediante sus coordenadas en dos sistemas de referencias distintos. En el sistema A, el punto tiene unas coordenadas que están dadas por el par orde1
2
nado (x, y) y su distancia con respecto al origen es y j x + y . En el sistema B, el mismo punto tiene coordenadas (0, 0) y la distancia hasta el origen de coordenadas del sistema 13 se 0.
Propiedades de los vectores En un determinado sistema de coordenadas, podemos definir un vector como la diferencia entre dos puntos. Así, para los puntos bidimensionales P, y P en la Figura A. 13, podemos especificar un vector como: 2
V=P -P, :
= (x -x y -y ) 2
r
2
(A.8)
i
donde las componentes cartesianas (o elementos cartesianos) l' y V son las proyecciones de V sobre los ejes xcy. También podríamos obtener estas mismas componentes del vector Utilizando otros dos puntos dentro del sistema de coordenadas. De hecho, existe un número infinito de parejas de puntos que nos dan las mismas componentes de vector, y los vectores se suelen definir mediante un único punto relativo al sistema de referencia actual. Por tanto, un vector no tiene una posición fija dentro de un sistema de coordenadas. Asimismo, si transformamos la representación de V a otro sistema de referencia, las coordenadas de las posiciones P y P, cambiarán, pero las propiedades básicas del vector no sufrirán modificación. Podemos describir un vector como un segmento de linea dirigido que tiene dos propiedades fundamentales: módulo y dirección. Para el vector bidimensional de la Figura A. 13, calculamos el módulo del vector utilizando el teorema de Pitágoras, que nos da la distancia entre sus dos extremos según la dirección del vector: v
y
(
A . 2 Puntos y vectores 8 1 5
P
ti •
7
%
Ir-*
Sistema B
— •
t .t
Sistema A
FIGURA A.13. Un vector hidimensional V definido en un sistema de referencia cartesiano como la diferencia entre dos puntos.
FIGURA A. 12. Coordenadas de un punto P en dos sistemas de referencia cartesianos distintos.
Podemos especificar la dirección del vector de diversas formas. Por ejemplo, podemos proporcionar la dirección en términos del desplazamiento angular con respecto a la horizontal de la forma siguiente: (A. 10)
Un vector tiene el mismo módulo y dirección independientemente de dónde situemos el vector dentro de un cierto sistema de coordenadas. Asimismo, el módulo del vector es independiente del sistema de coordenadas que elijamos. Sin embargo, si transformamos el vector a otros sistema de referencia, los valores de esos componentes y su dirección dentro de ese sistema de referencia pueden cambiar. Por ejemplo, podríamos transformar el vector a un sistema de referencia cartesiano rotado, de modo que la dirección del vector esté definida ahora según la nueva dirección >>. Para una representación cartesiana tridimensional de un vector, V = (K., K, KJ, el módulo del vector será:
Ivi-VvZ+^+i?
u , , )
Y podemos dar la dirección del vector en términos de los ángulos directores, a, /3 y y, que el vector forma con cada uno de los ejes de coordenadas (Figura A. 1 4 ) . Los ángulos directores son los ángulos positivos que el vector forma con cada uno de los ejes de coordenadas positivos. Podemos calcular estos ángulos de la forma siguiente: (A. 12)
V. c o s a
COS y =
=
—=7
V Los valores eos «, eos /3 y eos y se denominan cosenos directores del vector. En realidad, sólo hace falta especificar dos de los cosenos directores para proporcionar la dirección de V, ya que: (A. 13)
eos" a + eos /3 + cos y = I 3
7
•
J
*Y
FIGURA A.14.
Ángulos directores a, fi y y,
8 1 6 APÉNDICE A Matemáticas para gráficos por computadora
FIGURA A.15. Un vector de fuer/a gravitaloria F y un vector de velocidad v.
FIGURA A.16. Dos vectores (a) pueden sumarse geométricamente situando los dos vectores uno a continuación de otro (b) y dibujando el vector resultante desde el extremo inicial del primer vector hasta el extremo final del segundo vector.
Los vectores se utilizan para representar cualquier tipo de magnitud que tenga como propiedades un módulo y una dirección. Dos ejemplos comunes son la fuerza y la velocidad (Figura A.15). Una fuerza puede considerarse como la intensidad con que se tira 0 empuja en una dirección concreta. Un vector de velocidad especifica la rapidez con la que un objeto se mueve en una cierta dirección.
Suma de vectores y multiplicación escalar Por definición, la suma de dos vectores se obtiene sumando la componentes correspondientes: V, + V = (V„ + V ,V + V , S§, * V ) 2
lt
ly
2t
2:
(A. 14)
La Figura A.16 ilustra geométricamente la suma bidimensional de vectores. Obtenemos la suma de vectores colocando el extremo inicial de un vector sobre el extremo final del otro vector y dibujando la representación del vector suma desde el extremo inicial del primer vector hasta el extremo final del segundo. La suma de un vector con un escalar no está definida, ya que un escalar sólo tiene un valor numérico, mientras que un vector tiene n componentes numéricas en un espació «-dimensional. La multiplicación de un vector por un valor escalar s se define como s\=(sV ,sV ,sV ) x
K
(A.15)
:
Por ejemplo, si el parámetro escalar s tiene el valor 2, cada componente de V se dobla y el módulo se dobla también. También podemos combinar vectores utilizando procesos multiplicativos, de diversas formas. Un método muy útil consiste en multiplicar los módulos de los dos vectores, de modo que este producto se utilice para formar otro vector o una magnitud escalar.
Producto escalar de dos vectores Podemos obtener un valor escalar a partir de dos vectores mediante el cálculo: V, "V = | V , | | V | c o s 0 , 2
2
()<6
(A.16)
A.2
Puntos y vectores
817
donde fies el más pequeño de los dos ángulos que pueden definirse entre las direcciones de ambos vectores (figura A. 17). Este esquema de multiplicación se denomina producto escalar de dos vectores. También se denomina producto interno, particularmente al hablar de productos escalares en el análisis tensorial. La Ecuación A. 16 es válida en cualquier sistema de coordenadas y puede interpretarse como el producto de las componentes paralelas de los dos vectores, donde |V | eos 6 es la proyección del vector V-, en la dirección de V,Además de expresar el producto escalar en forma independiente del sistema de coordenadas, podemos también expresar este cálculo en un sistema de coordenadas específico. Para un sistema de referencia cartesiano, el producto escalar se calcula como: 9
El producto escalar es una generalización del teorema de Pilágoras y el producto escalar de un vector por sí mismo da como resultado el cuadrado del módulo del vector. Asimismo, el producto escalar de dos vectores es cero si y sólo si los dos vectores son perpendiculares (ortogonales). El producto escalar es conmutativo:
porque esta operación produce un valor escalar. Asimismo, el producto escalar es distributivo con respecto a la suma de vectores:
v .(v |
2
+
vj
=
v -v,+v v l
r
1
í4^
Producto vectorial de dos vectores Podemos utilizar la siguiente fórmula con el fin de combinar dos vectores para producir otro vector:
V x V = u|V, HVjsin^, (
2
()<9^n
El parámetro u en esta expresión es un vector unitario (módulo 1) perpendicular tanto a V! como a V (Figura A. 18). La dirección de u está determinada por la regla de la mano derecha: rodeamos un eje perpendicular al plano que contiene a Vj y V de modo que los dedos de la mano derecha se curven desde V! aV,. El vector u estará entonces en la dirección a la que apunta el dedo pulgar. Este cálculo se denomina producto vectorial de dos vectores y la Ecuación A.20 es válida en cualquier sistema de coordenadas. El producto vectorial de dos vectores es otro vector perpendicular al plano de esos dos vectores, y el módulo del producto vectorial es igual al área del paralclogramo formado por los dos vectores. También podemos expresar el producto vectorial en términos de las componentes de los vectores dentro de un sistema de referencia específico. En un sistema de coordenadas cartesianas, calculamos las componentes del producto vectorial como: 2
2
v,xv
:
=(v v -*¡X№8k - v . A - . i ' . A . - W u
!:
"
V, X V,
FIGURA A.18. El producto vectorial de dos vectores es un vector que apunta en una dirección perpendicular a FIGURA A.17. El producto escalar de dos vectores se obtiene multiplicando las componentes paralelas.
los dos vectores originales y con un módulo igual al área del paralclogramo sombreado.
A
818
APÉNDICE A
Matemáticos para gráficos por computadora
Si designamos los vectores unitarios (módulo I ) según los ejes x, y, z como u , u y u_, podemos escribir el producto vectorial en términos de las componentes cartesianas utilizando una notación de determinantes (Sección A.5): v
v
(A.22)
U.
V,xV = 2
v.
v
2
2;
El produelo vectorial de cualesquiera dos vectores paralelos es cero. Por tanto, el producto vectorial de un vector por si mismo es cero. Asimismo, el producto vectorial no es conmutativo, sino anticonmutativo: A
V.xVj = - í V , x V , )
2 3
( - )
También se verifica que el produelo vectorial no es asociativo, es decir, V,x(V,xV )*(V,xV,)xV,
U-24)
1
Sin embargo, el producto vectorial es distributivo con respecto a la suma y resta de vectores: V x ( V , + V , ) = (V xV,) + (V,xV ) |
l
1
iA.25)
A.3 TENSORES Una generalización del concepto de vector es la clase de objetos denominados tensores. Formalmente, un tensor se define como una magnitud con un rango especificado y con ciertas propiedades de transformación cuando se convierte el tensor de un sistema de coordenadas a otro. Para sistemas de coordenadas ortogonales, las propiedades de transformación son simples e iguales a las de los vectores. Diversas propiedades tísicas de los objetos, como la tensión y la conductividad, son tensores. El rango de un tensor, junto con la dimensión del espacio en la que el tensor está definido, determina el número de componentes (también denominados elementos o coeficientes) de dicho tensor. Las magnitudes escalares y los vectores son casos especiales de la clase más general de tensores. Un escalar es un tensor de rango cero, mientras que un vector es un tensor de rango uno. Básicamente, el rango de un tensor especifica el número de subíndices utilizados para designar los elementos del tensor, mientras que la dimensión espacial determina el número de valores que pueden asignarse a cada subíndice. Así, una magnitud escalar (tensor de rango cero) tiene cero subíndices, mientras que un vector (tensor de rango uno) tiene un subíndice. Algunas veces, cualquier parámetro con un subíndice se denomina incorrectamente "unidimensional" y cualquier parámetro con dos subíndices se denomina, también incorrectamente, «bidimensional». Sin embargo, la dimensión de una magnitud depende de la representación espacial, no del número de subíndices. En el espacio bidimensional. el único subíndice de un vector puede tener dos valores, y el vector bidimensional tendrá dos componentes. En el espacio tridimensional, el único subíndice de un vector puede tener tres valores y el vector tridimensional tiene tres componentes. De forma similar, un tensor de rango dos tiene dos subíndices y en el espacio tridimensional este tensor tendrá nueve componentes (tres valores por cada subíndice).
A.4 VECTORES BASE Y TENSOR MÉTRICO Podemos especificar las direcciones coordenadas para un sistema de referencia «-dimensional utilizando un conjunto de vectores de eje, denominados ü¿, donde k = 1 , 2 , . . . , / ; . como en la Figura A. 19, en la que se ilustran los vectores de eje en el origen de un espacio curvilíneo tridimensional. Cada vector de un eje de coordenadas proporciona la dirección de uno de los ejes espaciales en un punto determinado a lo largo de ese eje.
A.2 Vectores base y tensor métrico
u
*
819
FIGURA A.19. Vectores de los ejes de coordenadas curvilíneas en el espacio tridimensional.
Estos vectores tangentes a los ejes forman un conjunto de vectores linealmente independiente, es decir, ninguno de los vectores de los ejes puede escribirse como combinación lineal de los restantes vectores de los ejes. Asimismo, todos los demás vectores del espacio podrán escribirse como combinación lineal de los vectores de los ejes, y el conjunto de vectores de los ejes se denomina b a s e o conjunto de v e c t o r e s base, del espacio. En general, el espacio se denominará espacio vectorial y la base contendrá el número mínimo de vectores necesario para representar cualquier otro vector del espacio como combinación lineal de los vectores base.
Determinación de los vectores base para un espacio de coordenadas Los vectores base en cualquier espacio se determinan a partir del v e c t o r d e posición r , que es la representación vectorial de cualquier punto del espacio. Por ejemplo, en el espacio cartesiano tridimensional, el vector de posición para cualquier punto (jr, v, z) es: f = r u + m + zu
(A.26)
(
donde u , u y u, son los vectores base unitarios para los ejes.r,>' y z. A diferencia de otros sistemas de coordenadas, los vectores base cartesianos son constantes e independientes de las coordenadas en el espacio, por lo que tendremos: v
v
« , = f dx
fc-ft oy
%M di
.27)
(A
De forma similar, para cualquier otro espacio tridimensional, podemos formular la expresión del vector de posición f(.i,, x x ) en términos de las coordenadas de dicho espacio y luego determinar los vectores base como: 2J
3
ü -|t-,
¿ = 1,2,3
¿
(A.2S)
En general, los vectores base ü¿ no son ni constantes, ni vectores unitarios, sino que están en función de las coordenadas espaciales. Como ejemplo, el vector de posición en un sistema de coordenadas polares bidimensioütól sera: r = rcos0 u + r s i n 0 ú (
(A.29)
y los vectores base en coordenadas polares serán: Ü
f
= ^ = COS0 U. + S 1 I I 0 u
or ü = — = -rslnO U , + TCOS0 II 0
00 I n este espacio, ü , que es función de 0, es un vector unitario. Pero u„, que es función tanto de r como de 0, no es un vector unitario. r
820
APÉNDICE A
Matemáticas para gráficos por computadora
Bases ortonormales A menudo, los vectores de una base se normalizan para que cada vector tenga un módulo igual a I. Podemos obtener vectores base unitarios en cualquier espacio tridimensional mediante la fórmula:
u* «
u
l¿I
¿ = 1,2,3
(AJÍ)
y este conjunto de vectores unitarios se denomina base normal. Asimismo, para sistemas de referencia cartesianos, cilindricos, esféricos y otros tipos de sistemas comunes, incluyendo las coordenadas polares, los ejes de coordenadas son mutuamente perpendiculares en cada punto del espacio y el conjunto de vectores base se denomina entonces base ortogonal. Un conjunto de vectores base unitario ortogonales se denomina base ortonormal, y estos vectores base satisfacen las siguientes ecuaciones: u
A
u = 1,
para todo/:
k
u • u =0, t
para lodo j * k
k
Aunque normalmente trataremos con sistemas ortogonales, los sistemas de referencia no ortogonales también son útiles en algunas aplicaciones, incluyendo la teoría de la relatividad y los esquemas de visualización para ciertos conjuntos de datos. Un sistema cartesiano bidimensional tiene la base ortonormal: u,=(l,0),
u =(0,l) v
Y la base ortonormal para un sistema de referencia cartesiano tridimensional es: u =(1.0,0), A
u =(0,1,0), v
u, =(0,0,1)
(AJ4)
Tensor métrico Para sistemas de coordenadas «ordinarios» (es decir, aquellos en los que podemos definir distancias y que formalmente se denominan espacios riemanicmos\ los productos escalares de los vectores base forman los elementos del denominado tensor métrico de dicho espacio:
8*
=u
> *»
Así, el tensor métrico tiene rango dos y es simétrico : g = g j. Los tensores métricos tienen varias propiedades útiles. Los elementos de un tensor métrico pueden utilizarse para determinar (1) la distancia entre dos puntos del espacio, (2) las ecuaciones de transformación para la conversión a otro espacio y (3) las componentes de diversos operadores vectoriales diferenciales (como el gradiente, la divergencia y el rotacional) dentro de dicho espacio. En un espacio ortogonal, jk
g =0,
k
A
para./**:
3 6
( - )
Por ejemplo, en un sistema de coordenadas cartesianas, en el que los vectores base son vectores unitarios constantes, el tensor métrico tiene las componentes: g ;
[I, =< 0,
s¡; =*
, (espacio cartesiano)
fc
W
J 7
)
en caso contrario
Y para ios vectores base en coordenadas polares (Ecuaciones AJO), podemos escribir el tensor métrico en la Forma matricial:
A.5 Matrices
g =
821
(A.3S)
I O ü r
(coordenadas polares)
Para un sistema de referencia en coordenadas cilindricas, los vectores base son: ü = c o s 0 u + sin0 u , p
T
ü = - p s i n 0 u, + p c o s 0 u ,
y
B
v
ü =u
(A.39)
£
Y la representación matricial del vector métrico en coordenadas cilindricas será: 1
0
0
0
p
0
0
0
1
(A.40) (coordenadas cilindricas)
En coordenadas esféricas, los vectores base son: ü , = c o s 0 s i n 0 u + s i n 0 s i n 0 U + COS0 u (
t
ü = — r sin0 sin 0 u + r c o s # s i n 0 u t
fí
ü
#
= rcos0cos0 u + r s i n 0 e o s 0 n
;
(A.4I)
v
-rsin> u .
(
Utilizando estos vectores base en la Ecuación A.35, se obtiene la siguiente representación matricial para el tensor métrico: 1
0
0
0
2
r sin 0
0
0
i
(
(coordenadas esféricas)
(/f .42)
A.5 MATRICES Una matriz es una disposición rectangular de magnitudes (valores numéricos, expresiones o funciones), denominados elementos de la matriz. Algunos ejemplos de matrices son:
(zUJ) 3.60
-0.0
2.00
-5.46
0.00
1.63
e
X
e
X
1
M
°2
Las matrices se identifican de acuerdo con el número de fdas y el número de columnas. Para los ejemplos anteriores, las matrices, de izquierda a derecha son 2 por 3, 2 por 2, 1 por 3 y 3 por 1. Cuando el número de filas es igual al número de columnas, como en el segundo ejemplo, la matriz se denomina matriz cuac/rcula. En general, podemos escribir una matriz r por c como: m,
(AA4)
m
n
2,
_ "VI
III rl
donde m representa los elementos de la matriz M. El primer subíndice de cada elemento proporciona el número de illa y el segundo subíndice proporciona el número de columna. Una matriz con una única fila o una única columna representa un vector. Así, los dos últimos ejemplos de matrices en A.43 son, respectivamente un vector fila y un vector columna. En general, una matriz puede considerarse como una colección de vectores fila o como una colección de vectores columna. jk
8 2 2 APÉNDICE A Matemáticas para gráficos por computadora Cuando expresamos diversas operaciones en forma matricial, el convenio matemático estándar consiste en representar un vector mediante una matriz columna. De acuerdo con este convenio, escribiremos la representación matricial de un vector tridimensional en coordenadas cartesianas como;
V=
(A.45)
Aunque utilicemos esta representación matricial estándar tanto para los puntos como para los vectores, existe una distinción importante entre ambos conceptos. La representación vectorial de un punto siempre asume que el vector está definido desde el origen hasta dicho punto y la distancia del punto al origen no será invariante cuando cambiemos de un sistema de coordenada a otro. Asimismo, no podemos «sumar» puntos y tampoco podemos aplicar a los puntos operaciones vectoriales, como el producto escalar y el producto vectorial.
Multiplicación por un escalar y suma de matrices Para multiplicar una matriz M por un valor escalar s, multiplicamos cada elemento ntj por dicho escalar. Como ejemplo, si k
M =
1
2
3
4
5
6
3
6
9
12
15
18
entonces, 3M =
La suma de matrices sólo está definida para aquellas matrices que teagan el mismo número de filas r y el mismo número de columnas c. Para cualesquiera dos matrices r por g, la suma se obtiene sumando los correspondientes elementos. Por ejemplo, 1.5
0.2
1.0
3.5
1.1
-10.0
-2.0
6.1
-4.0
Multiplicación de matrices El producto de dos matrices se define como una generalización del producto escalar de vectores. Podemos multiplicar una matriz m por n A por una matriz p por q B para formar la matriz producto AB, supuesto que el número de columnas de A sea igual al número de filas de B. En otras palabras, debe cumplirse que n = p. Entonces, se obtiene la matriz producto formando las sumas de los productos de los elementos de los vectores fila de A por los elementos correspondientes de los vectores columna de B. Así, para el siguiente producto: C = AB
{A.46)
obtenemos una matriz m por q C cuyos elementos se calculan como:
En el siguiente ejemplo, una matriz 3 por 2 se postmultiplica por una matriz 2 por 2, para generar una matriz producto 3 por 2:
A.5 Matrices
0'l + (-l)-3 0 2 + ( - i ) - 4 l
o -r 5 7 . ~
2
1 2 3
5 1 + 7-3
5-2 + 7-4
-21+8-3
- 2 - 2 + 8-4
=
4
8
-
r-3
823
-41
26
38
22
28
La multiplicación de vectores en notación matricial produce el mismo resultado que el producto escalan supuesto que el primer vector se exprese como un vector fila y el segundo vector se exprese como un vector columna. Por ejemplo.
[1
2
3]
= [32]
Este producto de vectores da como resultado una matriz con un único elemento (una matriz 1 por I). Sin embargo, si multiplicamos los vectores en orden inverso, obtendremos la siguiente matriz 3 por 3: 4 [1
2
8
12
3] = 5
10 15
6
12 18
Como ilustran los dos producios de vectores anteriores, la multiplicación de matrices no es conmutativa por regla general. Es decir, AB^BA (A.48) Pero la multiplicación de matrices es distributiva con respecto a la suma de matrices: {A.49)
A(B + C) = A B + A C
Traspuesta de una matriz r
La traspuesta IYl de una matriz se obtiene intercambiando las Illas y columnas de la matriz. Por ejemplo. 1
2
3
4
5
6
1
4
2
5
3
6
r
[a
b
cf =
«
1
(A. 50)
Para un producto de matrices, la traspuesta es: ( M , M
2
)
T
(AJÍ)
= M ' M f
Determinante de una matriz Si tenemos una matriz cuadrada, podemos combinar los elementos de una matriz para generar un único número, denominado determinante de la matriz. Las evaluaciones de determinantes resultan muy útiles a la hora de analizar y resolver un amplio rango de problemas. Para una matriz 2 por 2 A, el determinante de segundo orden se define como: (A.52) det A =
=
a a -a a u
n
n
n
«2!
Los determinantes de orden superior se obtienen recursivamente a partir de los valores de los determinantes de orden inferior. Para calcular un determinante de orden 2 o superior, podemos seleccionar cualquier columna k de una matriz n por n y calcular el determinante como:
8 2 4 APÉNDICE A Matemáticas para gráficos por computadora
det A = ¿ ( - I V ^ d e t A ,
(A.53)
>=>
donde detA es el determinante (n~ I) por (ti—1) de la subrnatriz que se obtiene a partir de A borrando la fila/'-ésima y la columna ¿-ésima. Alternativamente, podemos seleccionar cualquier fila j y calcular el determinante como: /A
detA = ¿ ( - l ) '
, a
^detA ,
(A.54)
y
N La evaluación de determinantes para matrices de gran tamaño (por ejemplo, n > 4) puede realizarse de manera más eficiente utilizando métodos numéricos. Una forma de calcular un determinante consiste en descomponer una matriz en dos factores: A = LL, donde lodos los elementos de la matriz L por encima de la diagonal son cero y todos los elementos de la matriz U por debajo de la diagonal son cero. Entonces, podemos calcular el producto de las diagonales tanto para L como para U y obtener detA multiplicando los dos productos diagonales. Este método se basa en la siguiente propiedad de los determinantes: det(A B) = (det A)(dei B)
(A.55)
Otro método numérico para calcular determinantes se basa en los procedimientos de eliminación gausiana que se explican en la Sección A. 14.
Inversa de una matriz Con las matrices cuadradas, podemos obtener una matriz inversa si y sólo si el determinante de la matriz es distinto de cero. Si tiene una inversa, se dice que la matriz es una matriz no singular. En caso contrario, la matriz se denomina matriz singular. En la mayoría de las aplicaciones prácticas, en las que las matrices representan operaciones físicas, lo normal es que exista la inversa. La inversa de una matriz (cuadrada) n por n M se designa M ', cumpliéndose que: 1
M M " = M~'M = I
<
A 5 Ó
>
donde 1 es la matriz identidad. "Iodos los elementos diagonales de I tiene el valor 1 y todos los demás elementos (los no situados en la diagonal) son cero. Los elementos de la matriz inversa M~ pueden calcularse a partir de los elementos de M mediante la fórmula: {
;-lr"*detM
W$ty
í (
det M donde ni~ es el elemento en la fílay-ésima y la columna A-ésima de M y M es la subrnatriz (n - 1) por (n - 1) que se obtiene al borrar la fila /í-ésima y la columnay-ésima de la matriz M. Para valores de w, podemos calcular de manera más eficiente los valores de los determinantes y los elementos de la matriz inversa utilizando métodos numéricos. H
kj
t
A.6 NÚMEROS COMPLEJOS Por definition, un número complejo z es una pareja ordenada de números reales, representada como: z = (x,y)
(A.58)
donde x se denomina parte real de z e_v se denomina parte imaginaria de z. Las partes real e imaginaria de un número complejo se designan como:
A.6 Números complejos
825
Eje imaginario
v --
•z FIGURA A.20. Componentes real e imaginaria de un punto z en el plano complejo.
lije real
. v = Re(z).
. y = Im(z)
U S 9 )
Geométricamente, un número complejo puede describirse como un punto en el plano complejo, como se ilustra en la Figura A.20. Cuando Re(r) = 0, decimos que el número complejo z es un número imaginario puro. De forma similar, cualquier número real puede representarse como un número complejo con Im(z) = 0. Así, podemos escribir cualquier número real en la forma: * = (x, 0) Los números complejos surgen como solución de ecuaciones tales como: j e
2
+ 1 = 0,
2
x -2x + 5 = 0
que no tienen ningún número real como solución. Así, el concepto de número complejo y las reglas para la aritmética compleja se han desarrollado como extensiones de las operaciones con números reales que proporcionan la solución a tales tipos de problemas.
Aritmética compleja básica La suma, la resta y la multiplicación por un escalar de los números complejos se llevan a cabo utilizando las mismas reglas que para los vectores bidimensionales. Por ejemplo, la suma de dos números complejos es: z,
+ z
2
= (*,,>-,) + (x y ) = (x, + x v, + y ) v
2
v
2
y podemos expresar cualquier número complejo como la suma: z = (x y) = (x 0) + ( 0 , j 0 y
E l producto d e dos números complejos, 2 , y 2
%
, s e dcílne como:
2
Esta definición de la multiplicación compleja da el mismo resultado que la multiplicación de números reales cuando las partes imaginarias con cero: (x,,0)(x , 0) = (x,.v ,0) 2
2
Unidad imaginaria El número imaginario puro con y = I se denomina unidad imaginaria y se escribe:
/ = (0,1)
(A.6I)
(Los ingenieros eléctricos utilizan a menudo el símboloj como unidad imaginaria, porque el símbolo / se utiliza para representar la corriente eléctrica). A partir de la regla de la multiplicación compleja, tendremos que: 2
/ = (0, 1X0, !) = ( - ! . 0)
8 2 6 APÉNDICE A Matemáticas para gráficos por computadora Por tanto, ij es el número real — 1, y i = yP\
(A. 62)
Podemos representar un número imaginario puro utilizando cualquiera de las dos siguientes formas: z= iy = (Q,y) Y un número complejo general puede expresarse en la forma: z = .r + iy
(A. 63)
Utilizando la definición de /, podemos verificar que esta representación satisface las reglas de la suma, resta y multiplicación complejas.
Conjugado complejo y módulo de un número complejo Otro concepto asociado con un número complejo es el complejo conjugado, que se define como z =x + iy
(A. 64)
Así, el complejo conjugado Z es la reflexión de z con respecto al eje .v (real). El módulo, o valor absoluto, de un número complejo se define como: (A. 65)
2
z| = V¡F = >jx +y
Este número nos da la distancia del punto z en el plano complejo con respecto al origen, lo que a veces se denomina «longitud del vector» del número complejo. Así, el valor absoluto del número complejo es simplemente una representación del teorema de Pitágoras en el plano complejo.
División compleja Para evaluar el cociente de dos números complejos, podemos simplificar la expresión multiplicando el numerador y el denominador por el conjugado complejo del denominador. Después, utilizamos las reglas de multiplicación para determinar los valores de las componentes del número complejo resultante. Asi, las partes real e imaginaria del cociente de dos números complejos se obtienen como: Z\ Z\ Z-\ Z-2
*js
^2
_U ,v, ) ( X M - V = ¡ 2 n
J
2
)
"
A-,^+y,y ^ ,V,-X,y 2
2
(A.66) 2
\
Representación en coordenadas polares de un número complejo Las operaciones de multiplicación y división de los números complejos se pueden simplificar enormemente si expresamos las parles real e imaginarias en términos de las coordenadas polares (figura A.21): z = /-(eos 9 + /sin 6)
(A.67)
También podemos escribir la forma polar de z como: 2 = W* donde e es la base de los logaritmos naturales (e
2.718281828), y
(A.68)
A.7 Cuaternios
827
Eje.v imaginario
r, - e
FIGURA A.21. Parámetros en coordenadas polares dentro del plano complejo.
Eje X real
i9
e = eos 9+ / sin 6
(A.69)
que es la fórmula de Euter. Utilizando la forma en coordenadas polares, calendamos el producto de dos números complejos multiplicando sus valores absolutos y sumando sus ángulos polares. Así, z,z
2
=r r e t
2
Para dividir un número complejo por otro, dividimos sus valores absolutos y restamos sus ángulos polares: (AJÍ)
También podemos utilizar la representación polar para calcular las raíces de los números complejos. Las raices w-ésimas de un número complejo se calculan como: (AJ2)
0 + 2kit \ • . . 16 + lkn COS
.
+/S111
¿ = 0,1,2,...,/i-l
Estas raíces descansan sobre un círculo de radio yfr cuyo centro está en el origen del plano complejo y forman los vértices de un polígono regular de n lados.
A.7 CUATERNIOS El concepto de número complejo se puede ampliar a un número mayor de dimensiones utilizando cuaternios. que son magnitudes con una parte real y tres partes imaginarias, que se escriben como: q = s + ta +jb + kc
(AJ3)
donde los coeficientes a, b y c en los términos imaginarios son números reales y el parámetro s es otro número real, que se denomina parte escalar. Los parámetros k se definen con las propiedades: /2 = j2
=
k
2
_|
=
¡j
5
=
_j¡
=
|
(
A?4)
A partir de estas propiedades, se sigue que: jk = ~kj = %
ki = ~ik= j
(AJ5)
La multiplicación por un escalar se define por analogía con las correspondientes operaciones relativas a vectores y números complejos. Es decir, cada una de las cuatro componentes del cuaternio se multiplica por el valor. De forma similar, la suma de cuaternios se define como la suma de los correspondientes elementos: H\ +
m = li
+ -v ) + /(¿i| jf a ) +j(b + b ) + k(c + c ) 2
2
{
2
}
2
(AJÓ)
La multiplicación de dos cuaternios se lleva a cabo utilizando las operaciones descritas en las Ecuaciones A.74yA.75.
8 2 8 APÉNDICE A Matemáticas para gráficos por computadora También podemos utilizar la siguiente notación de pares ordenados para un cuaternio, que es similar a la representación de pares ordenados de un número complejo; q m (.v, v)
(A.77)
El parámetro v en esta representación es el vector (a, b, c). Utilizando la notación de pares ordenados, podernos expresar la suma de cuaternios de la forma:
Podemos escribir la fórmula de la multiplicación de cuaternios de manera relativamente compacta si utilizamos las operaciones de producto escalar y producto vectorial de dos vectores, de la manera siguiente: q q = (s s - v , • v x
2
{
,. v , v
2
2
+s
2
2
v , + v, X v
2
)
(A.79)
El módulo al cuadrado de un cuaternio se define por analogía con las operaciones de números complejos, utilizando la siguiente suma de los cuadrados de los componentes de los cuaternios. tf = 5
2
(AM)
+ v v
Y la inversa de un cuaternio se evalúa utilizando la expresión:
9
'
=
-
^
(
^
-
v
(A.81)
)
de modo que, l a
A.8
a
=q V/ = (1,0)
REPRESENTACIONES N0 PARAMÉTRICAS
Cuando escribimos las descripciones de los objetos directamente en términos de las coordenadas correspondientes al sistema de referencias que estamos utilizando, la representación se denomina no paramétrica. Por ejemplo, podemos describir una superficie con cualquiera de las siguientes funciones cartesianas: / , ( x , * z ) = 0,
o
z=f (x.y) 2
(A.82)
La primera forma de la Ecuación A.82 se denomina fórmula implícita de la superficie, mientras que la segunda forma se denomina representación explícita. En la representación explícita, x e y se denominan variables independientes, y z se denomina variable dependiente. De forma similar, podemos representar una línea curva tridimensional en forma no paramétrica como la intersección de dos funciones de superficie, o bien podemos representar la curva con la pareja de funciones: y=J{x)
y
z = g(x)
(AM)
con la coordenada x como variable independiente. Los valores de las variables dependientes y y z se determinan entonces a partir de las Ecuaciones A.83 asignando valores a x para algún número prescrito de intervalos. Las representaciones no paramétricas resultan útiles para describir los objetos de un cierto sistema de referencia, pero presentan algunas desventajas a la hora de utilizarlas en algoritmos gráficos. Si queremos obtener una gráfica suave, debemos cambiar la variable independiente cuando la primera derivada (pendiente) de /(*) gW superior a 1. Esto requiere controlar de manera continua los valores de las derivadas para determinar cuándo es necesario cambiar los roles de las variables dependientes c independientes. Asimismo, las Ecuaciones A.83 proporcionan un formato muy engorroso para representar funciones multivaluadas. Por ejemplo, la ecuación implícita de un círculo centrado en el origen dentro del plano xy es: 0
s e a
2
2
x + r - r = 0
A. 10 Operadores diferenciales 8 2 9
y la ecuación explícita de y es la función multivaluada:
Fin general, una representación más conveniente para describir los objetos en los algoritmos gráficos es en términos de ecuaciones paramétricas.
A.9 REPRESENTACIONES PARAMÉTRICAS Podemos clasificar los objetos según el número de parámetros necesarios para describir las coordenadas de los mismos. Una curva, por ejemplo, en un sistema de referencia cartesiano se clasifica como un objeto euclídeo unidimensional, mientras que una superficie es un objeto euelídeo bidimensional. Cuando se proporciona la descripción de un objeto en términos de su parámetro de dimensionalidad. la descripción se denomina representación paramétrica. La descripción cartesiana de los puntos situados a lo largo de la trayectoria de una curva puede proporcionarse en forma paramétrica utilizando la siguiente función vectorial: ?(u) = (x(u\y( Az(u))
(AM)
l
donde cada una de las coordenadas cartesianas es una función del parámetro u. En la mayoría de los casos, podemos normalizar las tres funciones de coordenadas de modo que el parámetro u varíe en el rango comprendido entre 0 y 1.0. Por ejemplo, un círculo en el plano xy con radio r. y con centro en el origen de coordenadas puede definirse en forma paramétrica mediante las siguientes tres funciones: x(u) = r cos(2*w),
y(n) = r sin(2jn/),
z(u) = 0,
0
(A.85)
Puesto que esta curva está definida en el plano xy, podemos eliminar la función z(w), que tiene el valor constante 0. De forma similar, podemos representar las coordenadas de una superficie utilizando la siguiente función vectorial cartesiana: Pgfe v) = (x(u, v), £ f c v), z(«, t>))
(AM)
Cada una de las coordenada cartesianas es ahora función de los dos parámetros de la superficie u y v. Una superficie esférica con radio /• y con centro en el origen de coordenadas, por ejemplo, puede describirse mediante las ecuaciones: ,
-v
0 < u. v < I
(A.87)
z(w, i>) = rcos(/rv) El parámetro // define líneas de longitud constante sobre la superficie, mientras que el parámetro v describe líneas de latidud constante. Las ecuaciones paramétricas, de nuevo, se suelen normalizar para asignara // y a v valores en el rango comprendido entre 0 y 1.0. Manteniendo uno de estos parámetros fijo mientras se varía el otro en un subrango del intervalo unitario, podemos dibujar las lineas de latitud y longitud de cualquier sección esférica (figura A.22).
A.10 OPERADORES DIFERENCIALES Para una función continua de una única variable independiente, corno/(.v), podemos determinar la tasa a la que varía la función para cualquier valor .v concreto utilizando una función denominada derivada def(x) con respecto a x. Esta función derivada se define como:
8 3 0 APÉNDICE A Matemáticas para gráficos por computadora
FIGURA A.22. Sección de una superficie esférica descrita por líneas de ü constante y lineas de v constante en las Ecuaciones A.87.
4f dx
=
| ¡ m
f(x + Ax)-f(x) Ar
(A. 88)
y esta definición es la base para obtener soluciones numéricas a problemas que impliquen operaciones de tipo diferencial. Las formas funcionales de las derivadas de las funciones más comunes, como los polinomios y las funciones trigonométricas, pueden consultarse en las tablas de derivadas. Y para los problemas de diferenciales que impliquen funciones simples, normalmente podremos obtener soluciones cerradas. Sin embargo, en muchos casos, será necesario resolver los problemas diferenciales utilizando métodos numéricos. Cuando tenemos una función de varias variables, las operaciones diferenciales efectuadas con respecto a las variables individuales se denominan derivadas parciales. Por ejemplo, con una función tal c o m o / ( * , > \ z, /), podemos determinar la tasa de cambio de la función con respecto a cualquiera de los ejes de coordenadas, x„y o z, o con respecto al parámetro temporal /. Una derivada parcial para una variable independiente concreta se define mediante la Ecuación A.88, manteniendo constantes todas las demás variables independientes. Así, por ejemplo, la derivada parcial d e / c o n respecto al tiempo se define como:
evaluándose esta fórmula en una determinada posición espacial y en un determinado instante de tiempo. Hay una serie de operadores de derivadas parciales que aparecen de manera lo suficientemente frecuente como para asignarles nombres especiales, como el gradiente, la laplaciana, la divergencia y el rotacional. Estos operadores resultan útiles en diversas aplicaciones, como por ejemplo a la hora de determinar la geometría y orientación de los objetos, a la hora de describir el comportamiento de los objetos en ciertas situaciones, a la hora de calcular los efectos de la radiación electromagnética o a la hora de utilizar conjuntos de datos en los trabajos de visualización científica.
Operador gradiente El operador vectorial con las siguientes componentes cartesianas se denomina operador gradiente: (A.89) El símbolo V se denomina nubla, del o simplemente operador grad. Una aplicación importante del operador gradiente es a la hora de calcular un vector normal a una superficie. Cuando se describe una superficie con la representación no paramétrica f(x,y, z) - constante, la normal a la superficie en cualquier posición se calcula como: N = V/*
(Vector normal para una representación paramétrica de la superficie)
(A.90)
A. 10 Operadores diferenciales 831 •
Como ejemplo, una superficie esférica con radio r puede representarse en coordenadas locales con la representación cartesiana no paramétrica/(*, >>, z) = x + y + z = / • , y el gradiente d e / p r o d u c i r á el vector normal a la superficie ( 2 r , 2 y , 2 z > . Pero si se representa la superficie con una función vectorial paramétrica P(«, v), entonces podemos determinar la normal a la superficie utilizando la operación de producto vectorial: 2
N=
au
av
2
2
2
(vector normal para una representación parámetrica de la superficie)
Derivada direccional También podemos utilizar el operador gradiente y el producto escalar de vectores para formar un producto escalar denominado derivada direccional de una función fi
Esto nos proporciona la tasa de cambio d e / e n una dirección especificada por el vector unitario u. Como ilustración, podemos determinar la derivada direccional para la función de superficie esférica/ = x + y + z en la dirección z de la forma siguiente: 2
2,
2
f-
dz
= u V/ = C
2
2
donde u es el vector unitario según la dirección z positiva. Y para el siguiente vector unitario en el plano xy\ z
Ja derivada direccional d e / a partir de la Ecuación A.92 es:
du
V2
dx
V2
By
Forma general del operador gradiente Dentro de cualquier sistema ortogonal de coordenadas tridimensionales, podemos obtener las componentes del operador gradiente utilizando los cálculos:
En esta expresión, cada u¿ representa el vector base unitario en la dirección de la coordenada x , y g son los componentes diagonales del tensor métrico del espacio. k
kk
Operador de Laplace Podemos utilizar el operador de gradiente y el producto escalar de vectores para formar un operador escalar diferencial denominado laplaciana u operador de Laplace, que tiene la forma en coordenadas cartesianas:
832
APÉNDICE A Matemáticas para gráficos por computadora
El simbolo V- se denomina en ocasiones grado al cuadrado, del al cuadrado o nabla ed cuadrado. Y en cualquier sistema ortogonal de coordenadas tridimensionales, la laplaciana de una f u n c i ó n / ( x , ^ , z) se calcula como:
V7 =
Ì
dx,
(4-55)
+ a*.
V^^n Son muchas las aplicaciones donde surgen ecuaciones en las que interviene la laplaciana, incluyendo la descripción de los efectos de la radiación electromagnética.
Operador divergencia El producto escalar de vectores también puede utilizarse para combinar el operador gradiente con una función vectorial con el fin de producir una magnitud escalar denominada divergencia de un vector, que tiene la siguiente forma cartesiana:
dv
(A.96)
dv
div V = V - V = — - + dz dx^ + — r)y En esta expresión, V , V y V son las componentes cartesianas del vector V. La divergencia es una medida de la tasa de incremento o decrcmento de una función vectorial, como por ejemplo un campo eléctrico, en un determinado punto del espacio. En cualquier sistema ortogonal de coordenadas tridimensionales, la divergencia de un vector V se calcula como: x
y
j¡vV=V-V=
z
1
. ySitXaís
[^(>/g^V^ *i *
d
úx
m
con los parámetros Vs, V y V$ como componentes del vector V con respecto a los ejes de coordenadas, y siendo Xp x y x^ y g los elementos diagonales del tensor métrico. 2
2
kfi
Operador rotacional Otro operador diferencial muy útil es el rotacional de un vector, que se aplica utilizando el operador gradiente y el producto vectorial. Las componentes cartesianas del rotacional de un vector son: rot V = V x V =
' * ^ w f i
m
>
EÍ-ÍÍ
c)z " '():. c)x
dx
(AM)
ay
Esta operación nos da una medida de los electos rotacionales asociados con una magnitud vectorial, como por ejemplo en la dispersión de la radiación electromagnética. En un sistema ortogonal de coordenadas tridimensionales, podemos expresar las componentes del rotacional en términos de las componentes del tensor métrico, utilizando la siguiente representación en forma de determinante: (A.99) rot V = V x V = £||#22#.0
Los vectores u son los vectores base unitarios del espacio, y g son los elementos diagonales del tensor métrico. k
kk
A.11 Teoremas de transformación integrales
A.11
833
TEOREMAS DE TRANSFORMACIÓN INTEGRALES
En muchas aplicaciones, nos encontramos con problemas que implican operaciones diferenciales que es preciso integrar (sumar) en una cierta región del espacio, lo que puede ser a lo largo de un trayecto de línea recta, en toda una superficie o en todo un volumen del espacio. A menudo, el problema puede simplificarse aplicando un teorema de transformación que convierta una integral de superficie en una integral de línea, una integral de línea en una integral de superficie, una integral de volumen en una integral de superficie o una integral de superficie en una integral de volumen. Estos teoremas de transformación tienen una gran importancia a la hora de resolver un amplío rango de problemas prácticos.
Teorema de Stokes Para una función vectorial continua F(.t, y, z) definida sobre una cierta región superficial, el l e o r e m a de S t o k e s indica que la integral de la componente perpendicular del rotacional de F es igual a la integral de línea de F alrededor de la curva de perímetro C de la superficie. Es decir,
ff
(rot
J Jmpórí
F)
•
n
dA
=(£
F
r
ds
{A. 100)
Je
donde la frontera C d e b e ser «continua por tramos», lo que significa que C debe ser una curva continua o una curva compuesta por un número finito de secciones continuas, como por ejemplo arcos circulares o segmentos de línea recta. En esta fórmula, n es el vector unitario normal a la superficie en cualquier punto, dA es un elemento diferencial de área superficial, r es un vector unitario tangente a la curva de contorno Cen cualquier punto y ds es el segmento de línea diferencial a lo largo de C. La dirección de integración alrededor de C es en sentido contrario a las agujas del reloj, si estamos mirando a la parte frontal de la superficie (Sección 3.15), como se muestra en la Figura A.23.
Teorema de Green para una superficie plana Si consideramos una región en el plano xy delimitada por una curva C que sea continua por tramos (como en el leorema de Stokes), podemos enunciar el t e o r e m a d e G r e e n p a r a el p l a n o en forma cartesiana de la manera siguiente:
óx
úy
)dxdy = S> {j\dx + fdv)
(A.IOI)
Je
Aquí,/j (*,>>) yf (x*y) son dos funciones continuas definidas en toda el área plana delimitada por la curva C, y la dirección de integración alrededor de C e s en sentido contrario a las agujas del reloj. También pode2
FIGURA A.23. La integración alrededor de la línea de contorno C es en sentido contrario a las agujas del reloj en el leorema de Stokes cuando miramos a la superficie desde la región «exterior» del espacio.
8 3 4 APÉNDICE A Matemáticas para gráficos por computadora
FIGURA A.24. Las integrales de línea en el teorema de Green para el plano se evalúan recorriendo las curvas límite C, y C, de modo que la región interior (sombreada) queda siempre a la izquierda. mos aplicar el teorema de Green a una región que tenga agujeros internos, como en la Figura A.24, pero entonces deberemos integrar en el sentido de las agujas alrededor de las curvas de contorno interiores. Aunque fue desarrollado de manera independiente, el teorema de Green para un plano es un caso especial del teorema de Stokcs. Para demostrar esto, vamos a definir la función vectorial F con componentes cartesianos (f f * E n t o n e s , el teorema de Green puede escribirse en forma vectorial: v 2
n
(rolF)-u.
ma
(A. 102) F T ¿ Y
Je
donde w, es el vector unitario perpendicular al plano xy (en la dirección z), dA = dx dy, y los otros parámetros son los mismos que en la Ecuación A. 100. Podemos utilizar el teorema de Green para un plano para calcular el área de una región plana, haciendo /i = 0 yf — x. Entonces, a partir del teorema de Green, el área A de una figura plana será 2
A=\\
dxdy = &xdy J Jaren
Jt"
De forma similar, si hacemos /¡ = —y y f = 0, tendremos: 2
A
= ff J Jarea
dx dy = -á y dx J C
Sumando las dos ecuaciones de área anteriores, se obtiene; (AJOS)
Y también podemos convertir esta expresión cartesiana del área a la siguiente forma en coordenadas polares: (AJ06)
El teorema de Green para el plano puede expresarse de muchas otras formas útiles. Por ejemplo, si definimos /. = df/cfy yfj — (tf/dx para alguna función continua j\ tendremos: y
donde dfldn es la derivada direccional d e / e n la dirección de la normal saliente a la curva de contorno C.
A. 12 Área y centroide de un polígono
835
Teorema de divergencia Los dos teoremas anteriores nos proporcionan métodos para realizar la conversión entre integrales de superficies e integrales de línea. El teorema de divergencia proporciona una ecuación para convertir una integral de volumen en una integral de superficie, o a la inversa. Lstc teorema también se conoce con varios otros nombres, incluyendo los de teorema de Creen en el espacio y teorema de Causs. Para una función vectorial continua tridimensional F. definida sobre un cierto volumen del espacio, podemos expresar el teorema de divergencia en forma vectorial:
íff
livF
t
(
F.„,M
A
'
0
8
)
donde dVcs un elemento diferencial de volumen, n es el vector normal a la superficie de contomo y dA es un elemento diferencial de área superficial. Podemos utilizar el teorema de divergencia para obtener varias otras transformaciones integrales útiles. Por ejemplo, si F = V / p a r a alguna función tridimensional c o n t i n u a / tenemos la versión para volúmenes de la Ecuación A. 107, que es:
íff w ^ f f J
J
J wh
J
J
m Mirprrf .ufpcrf
m
dn
En esta ecuación, dffdn es la derivada direccional d e / e n la dirección de la normal a la superficie. A partir del teorema de divergencia, podemos hallar expresiones para calcular el volumen de una región del espacio ulilizando una integral de superficie. Dependiendo de cómo representemos la función vectorial F, podemos obtener cualquiera de las siguientes formas cartesianas para la integral de superficie:
v-\\\ ,/„„„.-
n
xdydz =
tiirprtl
=
~\
ydzdx =
zdxdy
J tJ • II • i
(
J -
&4yd£:
+
ydzdx
+
zdxdy)
(A. ¡10)
Ecuaciones de transformación de Green Podemos derivar varias otras transformaciones integrales a partir del teorema de divergencia. Las siguientes dos ecuaciones integrales suelen denominarse ecuaciones de transformación de Green, primera y segun-
da fórmulas de Creen o identidades de Creen:
m
val
2
(/v./;+y/i-vy;wi/=íí l
J ¿WpBf
fMm
UIID
OH
En estas ecuaciones,/, yf son funciones escalares continuas tridimensionales, y (tf/dn y df*Jdn son sus derivadas direccionales en la dirección de la normal a la superficie. 2
A.12 ÁREA Y CENTROIDE DE UN POLÍGONO Podemos utilizar las transformaciones integrales de la Sección A. 11 para calcular diversas propiedades de los objetos para aplicaciones infográficas. Para los polígonos, a menudo utilizamos el área y las coordenadas del
836
APÉNDICE A
Matemáticas para gráficos por computadora
k
FIGURA A.25. Un polígono definido con /; vértices en el plano xy.
!- I
I
2
centroide en aquellos programas que implican transformaciones geométricas, simulaciones, diseño de sistemas y animaciones.
Área de un polígono A partir de la Ecuación A. 103, podemos calcular el área de un polígono expresando las coordenadas cartesianas de forma paramétrica y evaluando la integral de línea alrededor del perímetro del polígono. Las ecuaciones paramétricas para los n lados de un polígono con n vértices en el plano .rv (Figura A.25) pueden expresarse en la forma:
V=v,+(v
í t l
- v )u t
donde x =*,y.v„ =y Sustituyendo la expresión diferencial dy = (y , - y )du y la expresión paramétrica de x en la Ecuación A. 103, tenemos: n+l
T |
v
k+
k
A = <^> x dy 'i
«i
II =
(
v
_
v
X - ^ - '
) [ A
''
+ (
x
í
' ^"- '
) / 2 ]
Para cada segmento de línea, el segundo y tercer términos de esta suma se cancelan con los términos similares de signos opuestos que podemos encontrar para valores sucesivos de k. Por tanto, el área del polígono se calcula mediante la fórmula:
Centroide de un polígono Por definición, el centroide es la posición del centro de masas para un objeto de densidad constante (todos los puntos del objeto que tienen la misma masa). Por tanto, las coordenadas del centroide son simplemente los
A. 12 Área y centroide de un polígono 8 3 7
valores medios de las coordenadas, calculados para todos los puntos contenidos dentro de las fronteras del objeto. Para algunas formas poligonales simples, podemos obtener el centroide promediando las posiciones de los vértices. Pero, en general, el promediado de vértices no permite localizar correctamente el centroide, porque no se tienen en cuenta las posiciones de los restantes puntos del polígono. Como se ilustra en la Figura A.26, el punto que se obtiene al promediar las coordenadas de los vértices está situado cerca de la zona con mayor concentración de vértices, mientras que el centroide se encuentra en la posición central relativa a toda el área poligonal. Podemos calcular la posición del centroide (x y) de un polígono en el plano xy promediando las coordenadas de todos los puntos situados dentro de las fronteras del polígono: t
í-iff A
.v
J
J
xdxdv =
*~
{A. 116)
i f f
=
A J Jarea
A
fin estas expresiones, f¿ y fL se denominan momentos del área con respecto a los ejesx e y, respectivamente, donde se asume que el área tiene una unidad de masa por unidad de área. Podemos evaluar cada uno de los momentos del polígono utilizando los mismos procedimientos que ya hemos empleado para calcular el área del polígono. A partir del teorema de Oreen para un plano, obtenemos una integral de línea equivalente a la integral de área y evaluamos la integral de línea utilizando las representaciones paramétricas de las coordenadas cartesianas que describen los puntos situados en las aristas del polígono. El teorema de Creen para una superficie plana (Ecuación A. 101) indica que: x
í í
1
J Jrn^
í I "T-ayV* = í ox
Para la evaluación de ¿J , podemos hacer
№
+
%® Je
M-II7)
2
f
—Ir
i
(
/i, = f i
y / , = 0 en la transformación anterior, de modo que: 2
xdxdy = i ( t x dy
(A.
J Jarea 2JC A partir de las representaciones paramétricas A.l 13 para los lados del polígono, tenemos: x
2
2
=x +2x (x k
k
kti
-X )M + (X^, -x )V 4
para cada uno de los // lados, etiquetados como k = 1,2
4
n. Por tanto.
838
APÉNDICE A
Matemáticas para gráficos por computadora
=xí(-v . +A )U y „-T ,,v ) i
1
i
í
4
i
(AV/9)
i
2
Para la evaluación de / i , hacemos las sustituciones /j = -~y yf = 0 en el teorema de (ireen y obtenev
2
/i=JJ k
ydxdy = ^ y d x
(A.I20)
Utilizando las representaciones paramétricas A. 113 para evaluar la integral de línea, tenemos
o Dado cualquier conjimlo de vértices de un polígono, podemos entonces usar las expresiones correspondientes A, p y fi en las Ecuaciones A.l 16 para calcular las coordenadas del centroide del polígono. Puesto que la expresión (x y ~x y ) aparece en los cálculos de las tres magnitudes. A, fi y fJL, calcularemos dicha expresión una sola vez para cada segmento de linea. v
v
k
k+l
k+[
k
x
A.13 CÁLCULO DE LAS PROPIEDADES DE LOS POLIEDROS Para obtener las propiedades de los poliedros se utilizan métodos similares a los de los polígonos. La única diferencia es que ahora calcularemos el volumen espacial, en lugar de un área, y obtendremos el centroide promediando las coordenadas de todos los puntos comprendidos dentro del volumen del poliedro. El volumen de cualquier región espacial se define en coordenadas cartesianas como:
L
uhdz
{ A
'
2 2 )
Esta integral puede convertirse en una integral de superficie utilizando alguna de las ecuaciones de transfonuación A.l 10. Para un poliedro, la integral de superficie puede entonces evaluarse utilizando una representación paramétrica de los puntos situados en cada cara del sólido. Calculamos las coordenadas del centroide de un poliedro utilizando métodos similares a los que se emplean para los polígonos. Por definición, la posición del centroide en coordenadas cartesianas para una región del espacio (con unidad de masa por unidad de volumen) es el promedio de todos los puntos comprendidos dentro de dicha región:
Ш, i
!
dxdydz = y
ydxdydz = —
(A. 123)
De nuevo, podemos convertir las integrales de volumen en integrales de superficie, sustituir las represen
taciones paramétricas de las coordenadas cartesianas y evaluar las integrales de superficie para las caras del poliedro.
A. 14
Métodos numéricos
839
A.14 MÉTODOS NUMÉRICOS En los algoritmos infográfícos, a menudo es necesario resolver sistemas de ecuaciones lineales, de ecuaciones no lineales, de ecuaciones integrales y de otras formas funcionales. Asimismo, para visualizar un conjunto discreto de puntos de datos, puede que resulte útil mostrar una curva continua o una función de superficie continua que se aproximen a los puntos que componen el conjunto de datos. En esta sección, vamos a resumir brevemente algunos algoritmos comunes para la resolución de diversos problemas numéricos.
Resolución de sistemas de ecuaciones lineales Para una serie de v a r i a b l e s ^ , con k = 1, 2 , . .., //, podemos escribir un sistema de n ecuaciones lineales de la forma siguiente:
ax n
+ ---+a x
x
ln
tl
=b
2
(A. 124)
donde los valores de los parámetros a^y b¡ son conocidos. Este conjunto de ecuaciones puede expresarse en la forma malricial:
AX=B
(A. 125)
donde A es una matriz cuadrada n por n cuyos elementos son los coeficientes X es la matriz columna de valores Xj y B es la matriz columna de valores /y Resolviendo la ecuación matncial para despejar X, obtenemos: X = A 'B Este sistema de ecuaciones puede resolverse si y sólo si A es una matriz no singular, es decir, si su determinante es distinto de cero. En caso contrario, la inversa de la matriz A no existe. Un método para resolver el sistema de ecuaciones es la regla de Cramer:
donde A es la matriz que se obtiene al sustituir la columna ¿-ésima de la matriz A por los elementos de B. Este método es adecuado para problemas que tengan unas pocas variables. Sin embargo, para más de tres o cuatro variables, el método es extremadamente ineficiente, debido al gran número de multiplicaciones necesarias para calcular cada determinante. La evaluación de un único determinante n por n requiere más de n\ multiplicaciones. Podemos resolver el sistema de ecuaciones de manera más eficiente utilizando variantes de la eliminación gausiana. Las ideas básicas de la eliminación gausiana pueden ilustrarse con el siguiente sistema de dos ecuaciones: k
+2x =-4
Xl
2
ÍAJ28)
1x^Ax =\ 2
Para resolver este sistema de ecuaciones, podemos multiplicar la primera ecuación por -3 y luego sumar las dos ecuaciones para eliminar el término x lo que nos da la ecuación: v
-2x = 13 2
que tiene la solución x - - 13/2. Entonces, podemos sustituir este valor en cualquiera de las ecuaciones originales para obtener la solución correspondiente a x,, que es 9. Podemos emplear esta técnica básica para 2
840
APÉNDICE A Matemáticas para gráficos por computadora
resolver cualquier sistema de ecuaciones lineales, aunque se han desarrollado algoritmos para realizar de forma más eficiente las etapas de eliminación y sustitución. Una modificación del método d e eliminación gausiana e s l a d e s c o m p o s i c i ó n L U ( o f a c t o r i z a c i ó n L U ) para la resolución de sistemas de ecuaciones lineales. En este algoritmo, primero factorizamos la matriz A en dos matrices, denominadas matriz diagonal inferior L y matriz diagonal superior U de modo que A=Lü Todos los elementos de la matriz L situados por encima de su diagonal tienen el valor 0, y todos los elementos de la diagonal tienen el valor I. Todos los elementos de la matriz U situados por debajo de la diagonal tienen el valor 0. Entonces, podemos escribir la Ecuación A. 125 como: L U X =B
(A.I30)
Esto nos permite resolver los dos siguientes sistemas de ecuaciones, que son mucho más simples. L Y = B,
UX=Y
(A.I3I)
Una vez obtenidos los valores de los elementos de la matriz Y en la Ecuación A. 1 3 1 , podemos usarlos en el segundo sistema de ecuaciones para calcular los elementos de la matriz X. Como ejemplo, la siguiente ecuación ilustra la factorización para una matriz de coeficiente de tamaño 2 por 2: A =
3i]
№
í i
M&
o ][ 2
.4 1 _
0
3 1 -7
Un método para calcular los elementos de las matrices de factorización está dado por el siguiente sistema de ecuaciones, donde u¡, son los elementos de la matriz triangular superior U y l¡j son los elementos de la matriz triangular inferior L :
(A. 132)
La eliminación gausiana es susceptible, en ocasiones, a graves errores de redondeo, y otros métodos pueden que no produzcan una solución precisa. En tales casos, puede que podamos obtener una solución utilizando el método de Gauss-Seidel. Este método también constituye una forma eficiente de resolver el sistema de ecuaciones lineales cuando conocemos los valores aproximados de la solución. En la técnica de Gauss-Seidel, comenzamos con una «estimación» inicial de los valores de las variables x y luego calculamos repetidamente una serie de aproximaciones sucesivas, hasta que la diferencia entre dos valores sucesivos para cada x sea pequeña. En cada paso, calculamos los valores aproximados de las variables mediante las fórmulas: k
k
b . - a ^ - a ^
Ajt
x, = _h -a x -o x 1
2i
{
2y
i
ax 2n
n
(A. ¡33)
A. 14 Métodos numéricos 841
Si podemos reordenar la matriz A de modo que cada elemento diagonal tenga una magnitud superior a la suma de las magnitudes de los otros elementos situados en esa fila, entonces está garantizado que el método (iauss-Seidel converge hacia una solución.
Determinación de raíces de ecuaciones no lineales Una raíz de una función/(.v) es un valor de.v que satisface la e c u a c i ó n / ( r ) = 0. En general, la función f(x) puede ser una expresión algebraica, como por ejemplo un polinomio, o puede incluir funciones trascendentes. Una expresión algebraica es aquella que sólo contiene ios operadores aritméticos, exponentes, raíces y potencias. Las funciones transcendentes, como por ejemplo las funciones trigonométricas, logarítmicas y exponenciales, están representadas por series infinitas de potencias. Las raíces de una ecuación no lineal pueden ser números reales, números complejos o una combinación de números reales y complejos. En ocasiones, podemos obtener soluciones exactas para todas las raíces, dependiendo de la complejidad de la ecuación. Por ejemplo, sabemos cómo hallar una solución exacta para cualquier polinomio de grado menor o igual que 4, y las raíces de una ecuación transcendente simple tal como sin x = 0 son x = kn para cualquier valor entero de k. Pero en la mayoría de los casos de interés práctico, necesitamos aplicar procedimientos numéricos para obtener las raíces de una ecuación no lineal. Uno de los métodos más populares para hallar las raíces de ecuaciones no lineales es el algoritmo de Newton-Raphson. Se trata de un procedimiento iterativo que aproxima /'(.v) mediante una función lineal en cada paso de la iteración, como se muestra en la Figura A.27. Comenzamos con una «estimación» inicial -v para el valor de la raíz, y luego calculamos la siguiente aproximación a la raíz, .v,, determinando dónde corta con el eje x la línea tangente en x . En .v , la pendiente (primera derivada) de la curva es: ()
{)
0
¡M§ÉI dx
x (t
(A., 34)
A'|
Por tanto, la siguiente aproximación a la raíz es:
d o n d e / ' ( . v ) designa la derivada d e / ( . Y ) evaluada enx = * . Repetimos este proceso para cada aproximación que calculemos hasta que la diferencia entre las aproximaciones sucesivas sea "lo suficientemente pequeña". Además de resolver los problemas que impliquen variables reales, el algoritmo de Newton-Raphson puede aplicarse a una función de una variable c o m p l e j a / ( r ) , a una función de varias variables y a sistemas de funciones no lineales, reales o complejas. Asimismo, si el algoritmo de Newton-Raphson converge hacia una raíz, convergerá de forma más rápida que cualquier otro método de determinación de raíces. Pero el hecho es que este algoritmo no siempre converge. Por ejemplo, el método falla si la derivada f'(x) toma el valor 0 en algún punto de la iteración. Asimismo, dependiendo de las oscilaciones de la curva, las aproximaciones sucesivas pueden diverger con respecto a la posición de la raíz. Otro método, que es más lento pero cuya convergencia está garantizada, es el método de la bisección. En este algoritmo, debemos identificar un intervalo .v que contenga una raíz. Entonces, aplicamos un procedimiento de búsqueda binaria dentro de dicho intervalo para ir cercando la raíz en un intervalo cada vez más 0
0
FIGURA A.27. Aproximación de una curva en un valor inicial x* mediante una línea recta que sea tangente a la curva en dicho punto.
842
APÉNDICE A
Matemáticas para gráficos por computadora
pequeño. Primero examinamos el punió medio del intervalo para determinar si la raiz se encuentra en la mitad superior o inferior del mismo. Este procedimiento se repite para cada subintervalo sucesivo basta que la diferencia entre las posiciones centrales sucesivas sea más pequeño que un cierto valor preestablecido. Puede acelerarse el método interpolando posiciones x sucesivas en lugar de dividir por la mitad cada subintervalo (método de la falsa posición).
Evaluación de integrales La integral es un proceso de suma. Para una función de una única variables, la integral de/(.v) es igual al área «bajo la curva», como se ilustra en la Figura A.28. Para inlegrandos simples, podemos determinar a menudo una forma funcional de la integral, pero en general es necesario evaluar las integrales utilizando método numéricos. A partir de la definición de la integral, podemos formar la siguiente aproximación numérica: l /W & % & Í № $ k
(A.
m
136)
La función f (x) es una aproximación de la/(.v) en el intervalo x . Por ejemplo, podemos aproximar la curva mediante un valor constante en cada subintervalo y sumarle las áreas de los rectángulos resultantes (Figura A.29). Esta aproximación mejora, hasta cierto punto, a medida que reducimos el tamaño de subdivisiones del intervalo que va desde a hasta b. Si las subdivisiones son demasiado pequeñas, puede que los valores de las sucesivas áreas rectangulares se pierdan dentro de los errores de redondeo. Si se utilizan aproximaciones polinómicas para la función en cada subintervalo, generalmente se obtienen mejores resultados que con los rectángulos. Utilizando una aproximación lineal, las subáreas resultantes son trapezoides y el método de aproximación se denomina entonces regla del trapezoide. Si utilizamos un polinomio cuadrálico (parábola) para aproximar la ecuación en cada subintervalo, el método se denomina regla de Simpson y la aproximación de la integral será: k
FIGURA A.28. La integral de/(x) es igual al área comprendida entre la función y el eje x en el intervalo que va desde a hasta b.
k
FIGURA A.29. Aproximación de una integral mediante la suma de las áreas de pequeños rectángulos.
A. 14 Métodos n uméricos 84 3
FIGURA A.31. Una posición aleatoria (\, y) generada dentro de un área rectangular que encierra la función /(.r) en el intervalo que va de a hasla />.
FIGURA A.30. Una función con oscilaciones de alta frecuencia. donde n es un múltiplo de 2 y donde = a.
X
k
x
k-1
A*,
k = 1,2,. ... n
Para una función con una amplitud que varíe de forma muy rápida, como el ejemplo de la Figura AJO, puede que sea difícil aproximar de manera precisa la función en los distintos subintervalos. Asimismo, las integrales múltiples (las que incluyen varias variables de integración) no son fáciles de evaluar mediante la regla de Simpson ni mediante los otros métodos de aproximación. En estos casos, podemos aplicar las técnicas de integración de Monte Cario. El término Monte Cario se utiliza para describir cualquier método que utilice procedimientos basados en números aleatorios para resolver el problema determinista. Aplicamos el método Monte Cario para evaluar una integral generando n posiciones aleatorias dentro de un área rectangular que contenga a/(.v) en el intervalo que va desde a hasta b (Figura A.3I). Entonces, podemos calcular una aproximación a la integral mediante la fórmula: f"
f(x)dx~h(b-a)
n
Jb
(A. 139) „
donde el parámetro h es la altura del rectángulo y el parámetro w es el número de puntos aleatorios comprendidos entre/(,v) y el ejex. Calculamos una posición aleatoria (.v, y) en la posición rectangular generando primero dos números aleatorios, r, y y luego realizando las operaciones: c o u m
« = $m ~ firn i
* = « "Ni <'> -al
v = y.
+ rh :
(A. 140)
Pueden aplicarse métodos similares a las integrales múltiples. En los cálculos de.v e>> en A. 140, asumimos que los números aleatorios r, y r¡¡ están distribuidos uniformemente en el intervalo (0, I). Podemos obtener r, y r a partir de una función generadora de números alcatorios incluida en una biblioteca matemática o estadística, 0 bien podemos utilizar el siguiente algoritmo, denominado generador lineal de congruencias: 2
+ r(mod ni),
k = 1,2,3,...
(A.I4I)
donde los parámetros a, c, m y / son enteros e / es un valor inicial denominado semilla. El parámetro /// se elige lo mayor posible para una máquina concreta, eligiéndose los valores d e a y £ de forma que la cadena de números aleatorios sea lo más larga posible antes de que se repita un valor. Por ejemplo, en una máquina que represente los enteros mediante 32 bits, podemos hacer m — 2 - 1, a = 1664525 y C = 1013904223. ()
tí
3 2
8 4 4 APÉNDICE A Matemáticas para gráficos por computadora
Resolución de ecuaciones diferenciales ordinarias Cualquier ecuación que tenga operadores diferenciales se denomina ecuación diferencial. Las magnitudes pueden cambiar sus valores de forma continua desde una posición de coordenada a otra. También pueden cambiar a lo largo del tiempo en cada posición lija y pueden cambiar con respecto a muchos otros parámetros, como por ejemplo la temperatura o la aceleración de giro. Una ecuación que incluya las derivadas de una función de una única variable se denomina ecuación diferencial ordinaria. Para resolver una ecuación diferencial podemos determinar una forma funcional que satisfaga la ecuación o podemos emplear métodos de aproximación numérica para determinar los valores de la magnitud en intervalos seleccionados. Para resolver una ecuación diferencial, también necesitamos conocer uno o más valores iniciales. Una ecuación que sólo incluya la primera derivada de una magnitud, que se denominará ecuación diferencial de primer orden, requiere un único valor inicial. Una ecuación que contenga tanto primeras como segundas derivadas, que se denominará ecuación diferencial de segundo orden, requiere dos valores iniciales. Y de forma similar para las ecuaciones que incluyan derivadas de orden superior. Hay dos clasificaciones básicas para especificar los valores iniciales. Un problema de valor inicial es aquel en el que las condiciones conocidas se especifican para un único valor de la variable independiente. Un problema de valor de contorno es aquel en el que las condiciones conocidas se especifican en las fronteras correspondientes a la variable dependiente. Un ejemplo simple de problema de valor inicial sería la ecuación diferencial de primer orden: dx m — =f(xj), dt
ÍA.I42)
A
x(J ) = x t)
Q
donde v representa alguna variable dependiente que varia con el tiempo t (la variable independiente),/(.v, /) es la función conocida de variación con el tiempo para la primera derivada de v y x es el valor dado de x para el tiempo inicial / . También podemos escribir esta ecuación en la forma: Q
0
dx =f(x, t) dt Y, a partir de la definición de la derivada, podemos utilizar intervalos finitos para aproximar los diferenciales de la forma siguiente: Av
A
~f(x ,t )At , k
k
k=i),\
t
n
(A. 143)
donde A.v¿ = x , — x y t = - /¿, para n pasos temporales. Normalmente, lomaremos intervalos de tiempo iguales y utilizaremos los siguientes cálculos increméntales para determinar los valores x en cada paso temporal, dado el valor de .v en / : A f
k
k
0
Q
.r
t f l
=.r /(t ,/ )A/ i +
A
A
(A. 144)
Este procedimiento numérico se denomina método de Euler y permite aproximar x con segmentos de línea recta en cada intervalo temporal A/. Aunque el método de Euler es un procedimiento simple de implemcntar, en general no resulta muy preciso. Es por ello que se han desarrollado mejoras a este algoritmo numérico básico a partir de la siguiente expansión en serie de Taylor, incorporando términos de orden superior en la aproximación de la ecuación diferencial: x{t + A/) = x[t) + x(l)At + ^x (t)Ar H— Puesto que x'(t)= f(x, /), tendremos que x"(/)= f'(x, t) y así sucesivamente para las derivadas de orden superior. Un método más preciso y más ampliamente utilizado para evaluar una ecuación diferencial de primer orden es el algoritmo de Runge-Kutta, también denominado algoritmo de Kunge-Kutta de cuarto orden. liste procedimiento se basa en una expansión en serie de Taylor de cuarto orden. El algoritmo para el método de Runge-Kutta es
A. 14 Métodos numéricos 8 4 5
a=f(x j )At t t
b
=
f(x +a/2j +At/2)At k
k
c= f(x. + 6 / 2 , / . + A / / 2 ) A / í/í ¡46) d x
kM
=
f(x +t\t +At/2)At k
k
= x + (a + 2£ + 2c + ¿/)/6,
¿=0,1
k
;í-1
Podemos aplicar métodos similares para obtener la solución de ecuaciones diferenciales ordinarias de orden superior. La técnica general consiste en utilizar la expansión en serie de Taylor de x para incluir términos en x'\x"\ etc., dependiendo del orden de la ecuación diferencial. Por ejemplo, de la serie de Taylor podemos obtener la siguiente aproximación para la segunda derivada:
№
J f e t f
S ^ í
(A. 147)
Resolución de ecuaciones diferenciales parciales Como cabría esperar, las ecuaciones diferenciales parciales son, por regla general, más difíciles de resolver que las ecuaciones diferenciales ordinarias, pero podemos aplicar métodos similares y sustituir las derivadas parciales por diferencias finitas. Vamos a considerar primero una f u n c i ó n / ( x , /) que dependa sólo de la coordenada .v y del tiempo /. Podemos reducir una ecuación diferencial parcial que incluya df/dx y df/dt a una ecuación diferencial ordinaria sustituyendo la derivada espacial por diferencias finitas. Esto nos permite sustituir la función de dos variables por una función de un único subíndice y de una única variable, que será el tiempo: f(xj)^f{x j)->f (t) k
(A.I48)
k
Las derivadas parciales se sustituyen entonces por las siguientes expresiones:
9/_/,„-/> dx dt
KM
Ax dt
Después, resolvemos las ecuaciones para un número finito de posiciones x utilizando las condiciones iniciales o de contorno que se hayan especificado. Para las derivadas de orden superior, podemos utilizar las expansiones en serie de Taylor para obtener aproximaciones mediante diferencias finitas. Como ejemplo, podemos utilizar la siguiente aproximación para la segunda derivada parcial d e / c o n respecto a x : d f(xj) ^ fMU)-2fk№/,.,) 2
2
dx
l50)
2
Ax
Y cuando tengamos funciones definidas sobre superficies o volúmenes del espacio, podemos dividir el
espacio en una cuadrícula regular y utilizar diferencias finitas para cada punto del espacio. Otra técnica que se suele aplicar a las ecuaciones diferenciales parciales es el método de los elementos finitos. Se especifica una cuadrícula de puntos en el dominio de interés, que podría ser una superficie o un volumen del espacio, y luego se resuelven las ecuaciones acopladas en las posiciones de nodo utilizando la técnica de variaciones. Según este método, se utiliza una solución funcional aproximada en lugar de las ecuaciones en diferencias finitas. Dependiendo del problema, se especifica una integral para alguna magnitud, como la
8 4 6 APÉNDICE A Matemáticas para gráficos por computadora energía potencial o el error residual. Entonces, podemos aplicar algún procedimiento, como el análisis de números cuadrados, para minimizar la energía potencial o el error residual. Esta minimización nos proporciona valores para los parámetros desconocidos en la función que aproxima a la solución.
Métodos de ajuste de curvas por mínimos cuadrados para conjuntos de datos Cuando una simulación informática o un problema de visualización científica produce un conjunto de valores de datos, normalmente resulta conveniente determinar una forma funcional que describa dicho conjunto. El método estándar para obtener una función que se ajuste a los datos proporcionados es el algoritmo de los mínimos cuadrados. Para aplicar este método, primero elegimos un tipo general para la función, como por ejemplo una función lineal, polinómica o exponencial. Después, debemos determinar los valores de los parámetros de*la forma funcional que hayamos elegido. Por ejemplo, una función que sea una recta bidimensional puede describirse mediante dos parámetros: la pendiente y el punto de corte con el eje>\ Los parámetros de la función se obtienen minimizando la suma de los cuadrados de las diferencias entre los valores teóricos de la función y los valores reales de los datos. Para ilustrar este método, vamos a considerar primero un conjunto bidimensional de n puntos de datos, cuyas coordenadas designamos mediante (x , y ) con k = 1, 2 , . . n. Después de seleccionar la forma funcional /(.v) que podemos utilizar para describir la distribución de datos, establecemos una expresión para la función del error £, que será la suma de los cuadrados de las diferencias entre f(x ) y los valores de datos k
k
k
JL
.
151)
• i
Los parámetros de la función f(x) se determinan entonces minimizando la expresión de error E. Como ejemplo, si queremos describir el conjunto de datos mediante la función lineal: /(*) = a
+
a
0
\
x
entonces, E
) + <*l + 2 < W *
=¿ b í - 2 * K+
(AJ52)
Puesto que el error E es una función de dos variables (a y o¡), podremos minimizar E mediante las siguientes dos ecuaciones acopladas: 0
ríe-
"
^ = Zt-2.v +2a + 2 ^ J = 0 t
oa
fí
(í
k = i
(A. ¡53)
|^ = I l - 2 . y - r , + 2 da,
p
4
V A +
2^;]= 0
Entonces, podemos resolver este sistema de dos ecuaciones lineales utilizando la regla de Cramer. que nos da:
0 = n
( I- ^ ) ( I , y Q - ( I ^ ) ( I , . ^ ) (
t
(
D
o, — D donde el denominador en estas dos expresiones es:
(A.154)
A. 14 Métodos numéricos 8 4 7
n
D II
(A./55)
= Podemos efectuar cálculos similares para otras funciones. Por ejemplo, para el polinomio;
necesitaremos resolver un sistema de n ecuaciones lineales para determinar los valores de los parámetros a . Y también podemos aplicar el método de ajuste por mínimos cuadrados a funciones de múltiples variables/ (*,, j r , . . . . . x ) que pueden ser lineales o no lineales con respecto a cada una de las variables. k
2
m
Bibliografía AKELEY,K. y T.JERMOLUK(198X). «HighPerlbrmancc Polygon Rendering», en los an ionios de SIGGRAPH'88, Computer Graphics, 22(4), págs. 239-246. AKELEY, K. (1993). «RealityEngine Graphics», en los artículos de S1GGRAP1E93, Computer Graphics, págs. 109-116.
BARNSLEY. M. F., A. JACQUIN, F. MALASSENET, L. REUTER y D. SLOAN (1988). «Harnessing Chaos for Image Synlhesis», en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 131-140. BARNSLEY,M. F. (1993). Fractals Everywhere, Second Edition, Academic Press, San Diego, CA.
AKENfNE-MÖLLER, T. y E HAINES (2002). Real-Time Rendering, Second Edition, A. K. Peters, Natick, MA.
BARNSLEY, M. F. y L. P. I1URD, (1993). Fractal Image Compression, AK Peters, Wellesly, MA.
AMANATIDES, J. (1984). «Ray Tracing with Cones», en los artículos de SIGGRAPIF84, Computer Graphics, 18(3), págs. 129-135.
BARR, A. II. (1981). «Superquadrics and AnglePreserving Trans fbrrnations», IEEE Computer Graphics and Applications, 1(1), págs. 11-23.
AN J Y O , K., Y. USAMI y T. KURI11ARA (1992). «A Simple Method for Extracting the Natural Beauty of llair», en los artículos de SIGGRAPH'92, Computer Graphics, 26(2), págs. 111-120.
BARSKY, B. A. y J. C. BEATTY (1983). «Local Control of Bias and Tension in Beta-Splines», ACM Transactions on Graphics, 2(2), págs. 109-134.
APPLE COMPUTER, INC. (1987). Human Interface Guidelines: The Apple Desktop Interface, Addison-Wesley, Reading, MA.
BARSKY, B. A. (1984). «A Description and Evaluation of Various 3-D Models», IEEE Computer Graphics and Applications, 4( I), págs. 38-52.
ARVO, J. y D. KIRK (1987). «Fast Ray Tracing by Ray Classification», en los artículos de SIGGRAPIE87, Computer Graphics, 21(4), págs. 55-64.
BARZEL, R. y A. II. BARR (1988). «A Modeling System Based on Dynamic Constraints)), en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 179-188.
ARVO, J., ed. (1991), Graphics Gems II, Academic Press, San Diego, CA. ATHERTON, P. R. (1983). «A Scan-Line Hidden Surface Removal Procedure for Constructive Solid Geomelry», en los artículos de SIGGRAPH'83, Computer Graphics, 17(3), págs. 73-82.
BARZEL. R. (1992). Physically-Based Modeling for Computer Graphics, Academic Press, San Diego. CA.
BARAFF, D. (1989), «Analytical Methods for Dynamic Simulation of Non-Penetrating Rigid Bodies», en los artículos de SIGGRAPIE89, Computer Graphics, 23(3), págs. 223-232. BARAFF. D. y A. WITKIN (1992). «Dynamic Simulation of Non-Penetrating Flexible Bodies», en los artículos de SIGGRAPFE92. Computer Graphics, 26(2), págs. 303 J08.
BAUM, D. R., S. MANN, K. P. SMITH y J. M. WENGET(I99I). «Making Radiosíty Usable: Automatic Preprocessing and Meshing Techniques for the Generation of Accurate Radiosity Solutions», en los artículos de S I G G R A P H ^ I , Computer Graphics, 25(4), págs. 5 1 - 6 1 . BERGMAN, L. D., J. S. RICHARDSON, D. C. RICHARDSON y F. P. BROOKS, JR. (1993). «VIEW- an Exploratory Molecular Visualization System with User-Definable Interaction Sequences)), en los artículos de
850
Bibliografía
SIGGRAPH'93, Computer Graphics, págs. 117-126. BÉZIER, P. (1972). Numerical Con/rol: Mathematics and Applications, translated by A. R. Forrest and A. F. Pankhurst, John Wiley & Sons, Londres. B1RN, J. (2000). [digital] Lighting & Rendering, New Riders Publishing, Indianapolis, IN. BISHOP,*^, y D. M. W1EMER (1986). «Fast Phong Sliading», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 103-106. BLAKE, J. W. (1993). PH1GS and PHIGS Plus, Academic Press, Londres. BLESER, T. (1988). «TAE Plus Styleguide User Interface Description», NASA üoddard Space Flight Center, Greenbelt, MO. BLINN, J. F. y M. E. NEWELL (1976). «Texture and Reflection in Computer-Generated Images», Communications of the ACM, 19(10), págs. 542-547. BLINN, J. F. (1977). «Models of Light Reflection for Computer-Synthesized Pictures;», en los artículos de SIGGRAPH'77, Computer Graphics, 11(2), págs. 192-198. BLINN, J. F. y M. E. NEWELL (1978). «Clipping Using Homogeneous Coordinates», en los artículos de SIGGRAPrT78, Computer Graphics, 12(3), págs. 245-251. BLINN, J. F. (1978). «Simulation of Wrinkled Surfaces», en los artículos de SIGGRAPH'78, Computer Graphics, 12(3), págs. 286-292. BLINN, J. F. (1982). «A Generalization of Algebraic Surface Drawing», ACM Transactions on Graphics, 1(3), págs. 235-256. BLINN, J. F. (1982). «Light Reflection Functions for Simulation of Clouds and Dusty Surfaces», en los artículos de SIGGRAP1T82, Computer Graphics, 16(3), págs. 21-29. BLINN, J. F. (1993). «A Trip Down the Graphics Pipeline: The Homogeneous Perspective Transform», IEEE Computer Graphics and Applications, 13(3), págs. 75-80. BLINN, J. (1996). Jim Blinn's Corner:ATrip Down the Graphics Pipeline, Morgan Kauffman, San Francisco, CA. BLINN, J. (1998). Jim Blinn's Corner: Dirty Pixels, Morgan Kauffman, San Francisco, CA.
BLOOMENTHAL, J. (1985). «Modeling the Mighty Maple», en los artículos de SIGGRAPIF85, Computer Graphics, 19(3), págs. 305-312. BONO, P. R., J. L. ENCARNACAO, F. R. A. HOPGOOD, et al. (1982). «GKS: The First Graphics Standard», IEEE Computer Graphics and Applications, 2(5), págs. 9-23. BOUQUET, D. L. (1978). «An Interactive Graphics Application to Advanced Aircraft Design», en los artículos de S1GGRAPIF78, Computer Graphics, 12(3), págs. 330-335. BOURG, D. M. (2002). Physics for Game Developers, O'Reilly & Associates, Sebastopol, CA. BRESENHAM, J. E. (1965). «Aigorithm for Computer Control of a Digital Plotter», IBM Systems Journal, 4( 1), págs. 25-30. BRESENHAM, J. E. (1977). «A Linear Algorithm for Incremental Digital Display of Circular Ares», Communications of the ACM, 20(2), págs. 100-106. BROOKSJR., F. P. (1986). «Walkthrough: A Dynamic Graphics System for Simulating Virtual Buildings», Interactive 3D, BROOKS JR., F. P. (1988). «Grasping Reality Through Illusion: Interactive Graphics Serving Science», CHI '88, págs. 1—11. BROOKS JR., F. P., M. OUH-YOUNG, J. J. BATTER y P. J. KILPATRICK (1990). «Projecl GROPE—Haptic Display for Scientific Visualization)), en los artículos de SIGGRAPFF90, Computer Graphics, 24(4), págs. 177-185. BROWN, J. R. y S. CUNNINGHAM (1989). Programming the User Interface, John Wiley & Sons, Nueva York. BROWN, C. W. y B. J. SHEPHERD (1995). Graphics File Formats, Manning Publications, Greenwich, CT. BRUDERL1N, A. y T. W. CALVERT (1989). «Goal-Directed, Dynamic Animation of Human Walking», en los artículos de S1GGRAP1P89, Computer Graphics, 23(3), págs. 233-242. BRUNET, P. e I. NAVAZO (1990). «Solid Representation and Operation Using Extended Octrees», ACM Transactions on Graphics, 9(2), págs. 170-197.
Bibliografía
BRYSON, S. y C. LEV1T (I992). «The Virtual Wind Tunnel», IEEE Computer Grapbics and Applications, 12(4), págs. 2 5 - 3 4 . CALVERT, T., A. BRUDERLIN, J. DILL, T. SCHIPHORST y C. WEILMAN (1993). «Desktop Animation of Multiple Human Figures», IEEE Computer Graphics and Applications, 13(3), págs. 18-26. CAMBELL, (i., T. A. DEFANTI, J. FREDER1KSEN, S. A. JOYCE y L. A. LESKE (1986). «Tvvo Bit/Pixel Full-Color Fncodtng», en los artículos de S I G G R A P H ^ ó , Computer Graphics, 20(4), págs. 215-224. CARPENTER, L. (1984). «The A-Bufier: An Antialiased Hidden-Surface Melhod», en los artículos de SIGGRAPH*84, Computer Graphics, 18(3), págs. 103-108. CHEN, S. E., H. E. RUSHMEILR, G MILLER y D. TURNER (1991). «A Progressive Multi-Pass Method for (i loba I Illumination», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 165-174. CHIN, N. y S. FEINER (1989). «Ncar Real-Time Shadow Generation Using BSP Trees», en los artículos de SiGGRAPH'89, Computer Graphics, 23(3), págs. 99-106. CHUNG, J. C, et al. (1989). «Exploring Virtual Worlds with Head-Mounted Visual Displays», Artículos de SPIE (Society of Photo-Optical Instrumentation Engineers, ahora denominada International Society for Optical Engineering) Conference on Three-Dimensional Visualization and Display Technologies, 1083, enero de 1989, págs. 15-2*0. COHEN, M. F. y D. P. GREENBERG (1985). «The Hemi-Cube: A Radiosily Solution for Complex Lnvironments», en los artículos de SIGGRAPH'85, Computer Graphics, 19(3), págs. 31-40. COHEN, M. F.. S. E. CHEN, J. R. WALLACE y D. P. GREENBERG (1988). «A Progressive Rellnemenl Approach to Fast Radiosity Image Generation», en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 75-84. COHEN, M. F. y J. R. WALLACE (1993). Radiosity and Realistic Image Synthesis, Academic Press, Boston, MA.
851
COOK, R. L. y K. E. TORRANCE (1982). «A Reflectance Model for Computer Graphics». ACM Transactions on Graphics, 1(1), págs. 7-24. COOK, R. L., T. PORTER y L. CARPENTER (1984). «Distribuled Ray Tracing», en los artículos de SIGGRAPH'84, Computer Graphics, 18(3), págs. 137-145. COOK, R. L. (1984). «Shade Trees», en los artículos de SIGGRAPH'84, Computer Graphics, 18(3), págs. 223-231. COOK, R. L. (1986). «Stochastic Sampling in Computer Graphics», ACM Transactions on Graphics, 6(1), págs. 51-72. COOK, R. L . , L. CARPENTER y E. CATMULL (1987). «The Reyes Image Rendering Architecture», en los artículos de SIG(iRAPH'87, Computer Graphics, 21(4), págs. 95-102. COQUILLART, S. y P. JANCENE (1991). «Animated Free-Form Deformation: An Interactive Animation Technique», en los artículos de S I G G R A P i r 9 | , Computer Graphics, 25(4), págs. 2 3 - 2 6 . CROW, F. C. (1977a). «The Aliasing Problem in Computer-Synthesized Shaded Images», (\nnmunications of the ACM, 20( 11), págs. 799-805. £ ROW, F. C. (1977b). «Shadow Algorithms for Computer Graphics», en los artículos de SIGGRAPH'77, Computer Graphics, 11(2), págs. 242-248. CROW, F. C. (1978). «The Use of Grayscale for Improved Raster Display of Vectors and Characters», en los artículos de SIGGRAPH'78, Computer Graphics, 12(3), págs. 1-5. CROW, F. C. (1981). «A Comparison of Antialiasing Techniques», IEEE Computer Graphics and Applications, 1(1), págs. 40-49. CROW, F. C. (1982). «A More Flexible Image Generation Environment)), en los artículos de SIGGRAPIF82, Computer Graphics, 16(3), págs. 9 - 1 8 . CRUZ-NEIRA, C, D. J. SANDIN y T. A. DEFANTI (1993). «Surround-Screen Projection-Based Virtual Reality: The Design and Implementation of the CAVE», en los artículos de SIGGRAPH' 93, Computer Graphics, págs. 135-142.
852
Bibliografía
CUNNINGHAM, S., N. K. CRAIGH1LL, M. W. FON (i, J. BROWN y J. R. BROWN, eds. (1992). Computer Graphics Using ObjectOriented Programming, JohnWiley & Sons, Nueva York. CUTLER, E., D. GILLY y T. O'REILLY, eds. (1992). The X Window System in a Nutshell, Second Edition, O'Reilly & Assoc., Inc., Sebastopol, CA. CYRUS, M. y J. BECK (1978). «Generalized Twoand Three-Dimensional Clipping)), Computers and Graphics, 3( I), págs. 23-28. DAY, A. M. (1990). «The Implementation of an Algorithm to Find the Convex Hull of a Set of Three-Dimensional Points»^4CA/ Transactions on Graphics, 9( I), págs. 105-132. DEERING M. (1992). «High Resolution Virtual Reality», en los artículos de SIGGRAP1F92, Computer Graphics, 26(2), págs. 195-202. DEERING, M. F. y S. R. NELSON (1993). «Leo: A System for Cost-Effective 3D Shaded Graphics», en los artículos de SIGGRAPH'93, Computer Graphics, págs. 101-108. DEMERS, O. (2002). (digital] Texturing & Painting, New Riders Publishing, Indianapolis, IN. DEPP, S. W. y W. E. HOWARD (1993). «Flat-Panel Displays», Scientific American, 266(3), págs. № 97. DE REFFYE, P., C. EDEL1N, J. F R A N ^ O N , M. JAEGER y C. PUECH (1988). «Planl Models Faithful to Botanical Structure and Develop
ment)), en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 151-158. DEROSE, T. D. (1988). «Geometric Continuity, Shape Parameters y Geometric Constructions for Catmull-Rom Splines», ACM Transactions on Graphics, 7( 1), págs. 1-41. DIGITAL EQUIPMENT CORP. (1989). «Digital Equipment Corporation XUI Style Guidc», Maynard, MA. DOCTOR, L. J. y J. G. TORBERG (1981). «Display Techniques for Octree-Encoded Objects», IEEE Computer Graphics and Applications, 1(3), págs. 29-38. DORSEY, J. O., F. X. SILLION y D. P. GREENBERG (1991). «Design and Simulation of Opera Lighting and Projection Effects», en los
artículos de SIGGRAPir9l, Computer Graphics, 25(4), págs. 41-50. DREBIN, R. A., L. CARPENTER y P. HANRAIIAN (1988). «Volume Rendering)), en los artículos de SKiGRAPir88, Computer Graphics, 22(4), págs. 65-74. DURRETT, H. J.. ed. (1987). Color and the Computer, Academic Press, Boston. DUVANENKO. V. (1990). «Improved LineSegment Clipping», Dr. Dohb's Journal, julio de 1990. DYER, S. (1990). «A Dataflow Toolkit for Visualization)), IEEE Computer Graphics and Applications, 10(4), págs. 60-69. EARNSHAW. R. A., ed. (1985). Fundamental Algorithms for Computer Graphics, SpringerVerlag, Berlín. EDELSBRUNNER, H. (1987). Algorithms in Computational Geometry, Springer-Verlag, Berlín. EDELSBRUNNER, H. y E. P. MUCKE (1990). «Simulation of Simplicity: A Technique to Cope with Degenerate Cases in Geometric Algorithms», ACM Transactions on Graphics, 9(1), págs. 66-104. ELBER, G y E.COHEN(1990). «Hidden-Curve Removal for Free-Form Surfaces», en los artículos de SIGGRAPH'90, Computer Graphics, 24(4), págs. 95-104. ENDERLE, G, K. KANSY y G PFAFF (1984). Computer Graphics Programming: GKS—The Graphics Standard, Springer-Verlag, Berlín. PARIN, G (1988). Curves and Surfaces for (\*mputer-Aided Geometric Design, Academic Press, Boston, MA. FARIN, G. y D.HANSF0RD(I998). The Geometry Toolbox for Graphics and Modeling, A. K. Peters, Natick, MA. FEDER, J. (1988). Fractals, Plenum Press, Nueva York. FEYNMAN, R. P., R. B, LEIGHTON y M. L. SANDS (1989). The Feyntnan Lectures on Physics, Addison-Wesley, Reading, MA. FISHKIN. K. P. y B. A. BARSKY (1984). «A family of New Algorithms for Soil Filling», en los artículos de S1GGRAPIF84, Computer Graphics, 18(3), págs. 235-244.
Bibliografia FIUMI:. E, L. (19X9). The Mathematical Structure of Raster Graphics, Academic Press, Boston. FOLEY, J. D., A. V A N D A M , S . K. FEINER y J. F.HUGHES (1990). Computer Graphics: Principles and Practice. Second Edition, Addison-Wesley, Reading, MA. FOURN1ER, A., IX FUSSEL y L. CARPENTER ( 19X2). «Computer Rendering of Stochastic Models», Communications of the ACM, 25(6), págs. 371-384. FOURNIER, A. y W. T. REEVES (1986). «A Simple Model of Ocean Waves», en los artículos de S l G G R A P i r 8 6 , Computer Graphics, 20(4), págs. 75-84. FOWLER, D. R., II. MEINIIARDT y P. PRUSINKIEWICZ (1992). «Modeling Seashells», en los artículos de SIGGRAPIE92, Computer Graphics, 26(2), págs. 379-387. FRANKLIN, W. R. y M. S. KANKANHALLI (1990). «Parallel Object-Space Hidden Surface Removal», en los artículos de SIGGRAP1F90, Computer Graphics, 24(4), págs. 87-94. FREEMAN, H. ed. (1980). Tutorial and Selected Readings in Interactive C 'omputer Graphics, IEEE Computer Society Press, Silver Springs, MD. IRENKEL, K. A. (1989). «Volume Rendering», Communications of the ACM, 32(4). págs. 426-435. FRIEDER, G, D. GORDON y R. A. REYNOLD (1985). «Back-to-Front Display of Voxel-Based Objects», IEEE Computer Graphics and Applications, 5(1 ), págs. 52-60.
853
GARDNER, T. N. y H. R. NELSON (1983). «Interactive Graphics Developments in Energy Exploration», IEEE Computer Graphics and Applications, 3(2), págs. 33-34. GARDNER, G. Y. (1985). «Visual Simulation of Clouds», en los artículos de SIGGRAPIE85, Computer Graphics, 19(3), págs. 297-304. GASCUEL, M.-P. (1993). «An Implicit Formulation for Precise Contact Modeling between Flexible Solids», en los artículos de SIGGRAPIF93, Computer Graphics, págs. 313-320. GASKINS, T. (1992). PHIGS Programming Manual, O'Reilly & Associates, Sebastopol. CA. GHARACHORLOO, N., S. GUPTA, R. F. SPROULL y I. E. SUTHERLAND (1989). «A Characterization of Ten Rasterization Techniques», en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 355-368. GIRARD, M. (1987). «Interactive Design of 3D Computer-Animated Legged Animal Motion», IEEE Computer Graphics and Applications, 7(6), págs. 3 9 - 5 1 . GLASSNER, A. S. (1984). «Space Subdivision for Fast Ray Tracing», IEEE Computer Graphics and Applications, 4( 10), págs. 15-22. GLASSNER, A. S. (1986). «Adaptive Precision in Texture Mapping», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 297-306. GLASSNER, A. S. (1988). «Spacetime Ray Tracing for Animation», IEEE Computer Graphics and Applications, 8(2), págs. 60-70.
FRIEDHOFF, R. M. y W. BENZON (1989). The Second Computer Revolution: Visualization, Harry N. Abrams, Nueva York.
GLASSNER, A. S., ed. (1989a). An Introduction to Ray Tracing, Academic Press, San Diego, CA.
FU, K. S. y A. ROSENFELD (1984). «Pattern Recognition and Computer Vision», Computer, 17(10), págs. 274-282.
GLASSNER, A. S. (1989b). 3D Computer Graphics: A User's Guide for Artists and Designers. Second Edition, Design Books, Lyons & Bufford Publishers, Nueva York.
FUJIMOTO, A. y K. 1WATA (1983). «Jag-Free Images on Raster Displays», IEEE Computer Graphics and Applications, 3(9), págs. 26-34. FUNKHOUSER, T. A. y C. H. SEQUIN (1993). «Adaptive Display Algorithms for Interactive Frame Rates during Visualization of Complex Virtual Environments», en los artículos de SIGGRAPH'93. Computer Graphics, págs. 247-254.
GLASSNER, A. S., ed. (1990). Graphics Gems, Academic Press, San Diego, CA. GLASSNER, A. S. (1992). «Geometrie Substitution: A Tutorial», IEEE Computer Graphics and Applications, 12(1), págs. 22-36. GLASSNER, A. S. (1995). Principles of Digital Image Synthesis, Vols. 1-2, Morgan Kaufmann, San Francisco, CA.
854
Bibliografía
GLASSNER, A. S. (1999). Andrew Glassners Notebook: Recreational Computer Graphics, Morgan Kaufmann, San Francisco, CA. GLASSNER, A. S. (2002). Andrew Glassners Other Notebook: Further Recreations in Computer Graphics, A. K. Peters, Natick, MA. GLHICHER, M. y A. W1TKIN (1992). «Throughthe-Lens Camera Control», en los artículos de SIGGRAPIF92, Computer Graphics, 26(2), págs. 331-340. GOLDSMITH, J. y J. SALMON (1987). «Aulomatic Creation of Object Hierarchies for Ray Tracing». IEEE Computer Graphics and Applications, 7(5), págs. 14-20. GOMES, J., L. DARSA, B. COSTA y L. VELHO (1999). Warping and Morphing of Graphical Objects, Morgan Kaufmann. San Francisco, CA. GONZALEZ, R. C. y P. W1NTZ (1987). Digital Image Processing, Addison-Wesley, Reading, MA. GOOCH. B. y A. GOOCH (2001). Non-Photorealistic Rendering, A. K. Peters, Natick, MA. GORAL, C. M„ K. E. TORRANCE, D. P. GREENBERG y B. BATTAILE (1984). «Modeling the Interaction of Light Between Diffuse Surfaces». en los artículos de SIGGRAPH 84, Computer Graphics, 18(3), págs. 213-222. GORDON, D. y S. CHEN (1991). «Front-to-Back Display of BSP Trees», IEEE Computer Graphics and Applications, 11(5), págs. 79-85. ,
GORTLER, S. J., P. SCHRODER, M. F. COHEN y P. HANRAIIAN (1993). «Wavelet Radiosity», en los artículos de SKÍGRAPIF93, Computer Graphics, págs. 221 230. GOURAUD, H. (1971). «Continuous Shading of Curved Surfaces», IEEE Transactions on Computers, C-20(6), págs. 623-628. GREENE, N., M. KASS y G MILLER (1993). ^Hierarchical Z-BulTer Visibility», en los artículos de SIG(¡RAPH 93, Computer Graphics, págs. 231-238. GROTCH. S. L. (1983). «Three-Dimonsional and Stereoscopic Graphics for Scientific Data Display and Analysis», IEEE Computer Graphics and Applications, 3(8), págs. 31-43. ,
HAEBERLI, P. y K. AKELEY (1990). «The Accumulation Buffer: I hardware Support for High-Quality Rendering)), en los artículos de
SIGGRAPH'90, Computer Graphics, 24(4). págs. 309-318. HALL, R. A. y D. P. GREENBERG (1983). «A Testbed for Realistic Image Synthesis», IEEE Computer Graphics and Applications, 3(8), págs. 10-20. HALL, R. (1989). Illumination and Color in Computer Generated Imagery, Springer-Verlag, Nueva York. HALLIDAY. D., R. RESNICK y J. WALKER (2000). Fundamentals of Physics, Sixth Edition, John Wiley & Sons. Nueva York. HANRAHAN, P. y J. LAWSON (1990). «A Language for Shading and Lighting Calculations)), en los artículos de SIGG R A P H ^ O , Computer Graphics, 24(4), págs. 289-298. HARDY, V. J. (2000). Java 2D API Graphics, Sun Microsystems Press, Palo Alto, CA. HART, J. C, 1>. J. SANDIN y L. II. KAUFFMAN (1989). «Ray Tracing Deterministic 3D Fractals», en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 289-296. HART, J. C. y T. A. D K F A N T I (1991). «Eflleient Antialiased Rendering of 3-D Linear Fractals)), en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 91-100. HAWRYLYSHYN, P. A., R. R. TASKER y L. W. ORGAN (1977). «CASS: Computer-Assisted Stereotaxic Surgery», en los artículos de SIGGRAPH'77, Computer Graphics, 11(2). págs. 13-17. HE, X. D., P. O. HEYNI-N, R. L. PHILLIPS, K. E. TORRANCE, D. H. SALESIN y D. P. GREENBERG (1992). «A Fast and Accurate Light Reflection Model». en los artículos de SIGG R A P t F 9 2 , Computer Graphics, 26(2), págs. 253-254. HEARN, D. y P. BAKER (1991). «Scientifie Visualization: Anlntroduction», Eurographics VITechnical Report Series, Tutorial Lecture 6, Viena, Austria. HFCKBERT, P. S. (1982). «Color Image Quantization for frame Buffer Display)), en los artículos de SIGGRAPH'82, Computer Graphics, 16(3), págs. 297-307. HECKBERT, P. S. y P. HANRAIIAN (1984). «Beam Tracing Polygonal Objects», en los
Bibliografía artículos de SIGGRAPH'84, Computer Graphics, 18(3), págs. 119-127. HECKBERT, P. S., ed. (1994). Graphics Gems IV, Academic Press Professional, Cambridge, MA. HENDERSON, L. R. y A. M. MUMFORD (1993). The CGM Handbook, Academic Press, San Diego, CA. IIOPGOOD, F. R. A., D. A. DUCE, J. R. GALLOP y D. C. SUTCLIFFE (1983). Introduction to the Graphical Kernel System (GKS), Academic Press, Londres. IIOPGOOD, F. R. A. y D. A. DUCE (1991). A Primer for PHIGS, John Wiley & Sons, Chichester, Inglaterra. HORSTMANN, C. S. y G. CORNELL (2001). Core Java 2, Vols, l-ll. Sun Microsystems Press, Palo Alto, CA. HOWARD, T. L. J., W. T. HEWITT, R. .1. HUBBOLD y K. M. WYRWAS (1991). A Practical Introduction to PHIGS and PHIGS Plus, Addison-Wesley, Wokingham, Inglaterra.
855
JENSEN, H.W. (2001). Realistic Image Synthesis Using Photon Mapping, A. K. Peters, Natick, MA. JOHNSON. S. A. (1982). «Clinical Varifocal Mirror Display System at the University of Utah», Proceedings o/SP/E, 367, agosto de 1982, págs. 145-148. K AJÍ YA, J. T. (1983). «New Techniques for Ray Tracing Procedurally Defined Objects», ACM Transactions on Graphics, 2(3). págs. 161-181. KAJIYA, J. T. (1986). «The Rendering Equalion», en los artículos de SIGGRAPH'86. Computer Graphics, 20(4), págs. 143 150. KAJIYA, J. T. y T. L. KAY (1989). «Rendering Fur with Thrcc-Dimensional Tcxtures», en los artículos de SIGGRAPI-TS9, Computer Graphics, 23(3), págs. 271-280. KAPPEL, M. R. (1985). «An Ellipse-Drawing Algorithm for Fasler Displays», in Eundamental Algorithms for Computer Graphics, SpringerVerlag, Berlín, págs. 257-280.
HUFFMAN, D. A. (1952). «A Method for the Construction of Minimum-Redundancy Codes», Communications of the ACM, 40(9). págs. 1098-1101.
KAY, T. L. y J. T. KAJIYA (1986). «Ray Tracing Complex Scenes», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 269-278.
HUGHES, J. F. (1992). «Scheduled Fourier Volume Morphing». en los artículos de SIGGRAP1F92, Computer Graphics, 26(2), págs. 43 46.
KAY, D. C. y J. R. LEVINE (1992). Graphics File Formats, Windcrest/McGraw-Hill, Nueva York.
IIUITRIC, H. y M. NAHAS (1985). «B-Spline Surláces: A fool for Computer Painling», IEEE Computer Graphics and Applications, 5(3), págs. 39-47. 1MMEL, D. S., M. F. COHEN y D. P. GREENBERG (1986). «A Radiosity Method for NonDiffuse Environments", en los artículos de SIGGRAPH"86. Computer Graphics. 20(4). págs. 133-142. ISAACS, P. M. y M. F. COHEN (1987). «Conlrolling Dynamic Simulation with Kinematic Constraints, Behavior Functions y Inverse Dynamics», en los artículos de SIGCiRAPH'87, Computer Graphics, 21(4). págs. 215-224. JARV1S, J. F., C. N. JUDICE y W. H. NINKE (1976). «A Survey of Techniques for the Image Display of Continuous Tone Pictures on Bilevel Displays». Computer Graphics and image Processing. págs. 13 40.
KELLEY, A. D., M. C. MALIN y G M. NIELSON (1988). «Terrain Simulation Using a Model of Stream Erosion», en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 263-268. KENT, J. R., W. E. CARLSON y R. E. PARENT (1992). «Shape Transformation for Polyhedral Objects», en los artículos de SIGGRAPH'92. Computer Graphics, 26(2), págs. 47-54. KERLOW, I. V. (2000). The Art of 3-D Computer Animation and Imaging, John Wiley & Sons, Nueva York. KILGARD, M. J. (1996). OpenGL Programming for the X Window System, Addison-Wesley. Reading, MA. KIRK, D. y J. ARVO (1991). «Unbiased Sampling Techniques for Image Synthesis». en los artículos de SIGGRAPI-I'91, Computer Graphics* 25(4), págs. 153-156. KIRK, D., ed. (1992). Graphics Gems ill. Academic Press. San Diego. CA.
856
Bibliografía
KNUDSEN, J. (1999). Java 2D Programming, O'Reilly & Associates, Sebastopol. CA. KNUTH,D. E. (1987). «Digital Halftones by Dot Diffnsion», ACM Transactions on Graphics, 6(4), págs. 245-273. KOCH AN EK, D. H. U. y R. H. BARTELS (1984). «Inleipoiating Splines with Local Tension, Continuity y Bias Control», en los artículos de SIGGRAPH*84, Computer Graphics, 18(3), págs. 3 3 - 4 1 . KOH, E.-K. y D. HEARN (1992). «Fasl Generation and Surface Structuring Methods for Terrain and Other Natural Phenomena», en los artículos de Enrographics'92, Computer Graphics Forum, 11(3), págs. C I 6 9 - 1 8 0 . KOR1EN, J. U. y N. I. BADLER (1982). «Techniques for Generating the Goal-Directed Motion of Articulated Structures)), IEEE Computer Graphics and Applications, 2(9), pags. 71-81. KORIEN, J. U . y N . I. BADLER (1983). «Temporal antialiasing in Computer-Generated Animalion», en los artículos de SI(iGRAPH'K3, Computer Graphics, 17(3), págs. 377-388. KREYSZIG, E. (1998). Advanced Engineering Mathematics, Eighth Edition, John Wiley & Sons, Nueva York. LASSETER, J. (1987). «Principies of Traditional Animation Applied to 3D Computer Animalion», en los artículos de SIGGRAPIT87, Computer Graphics, 21(4), págs. 35 44. LATIIROP, O. (1997). The Way Computer Graphics Works, John Wiley & Sons, Nueva York. LAUREL, B. (1990). The Art of Human-Computer Interface Design, Addision-Wesley. Reading, MA. LENGYEL, E. (2002). Mathematics for 3D Game Programming eft Computer Graphics, Charles River Media, llingham, MA. LEVOY, M. (1990). «A Hybrid Ray Tracer for Rendering Polygon and Volume Dala». IEEE Computer Graphics and Applications, 10(2), págs. 33-40. LEWIS, J.-P. (1989). «Algorithms for Solid Noise Synlhesis», en los artículos de SK ¡GRAPH'89, Computer Graphics, 23(3), págs. 263-270.
LIANG, Y.-D. y B. A. BARSKY (1983). «An Analysis and Algorithm for Polygon Clipping.)) Communications of the ACM, 26( 11), págs. 868-877. LIANG, Y.-l). y B. A. BARSKY (1984). «A New Concept and Method for Line Clipping)), ACM Transactions on Graphics, 3(1). págs. 1-22. LINDLEYC.A. (1992). Practical Ray Tracing in C John Wiley & Sons, Nueva York. LISCII1NSKI, P„ F. TAMPIERI y D. P. GREENBERG (1993). «Combining Hierarchical Radiosity and Discontinuity Meshing», en los artículos de S I G G R A P i r 9 3 , Computer Graphics, págs. 199-208. l
LITWINOWICZ, P. C. (1991). «lnkwell:A2 /i-D Animation System», en los artículos de SIGG R A P H ' 9 1 , Computer Graphics, 25(4). págs. 113-122. LODD1NG, K. N. (1983). «Iconic Interfacing)), IEEE Computer Graphics and Applications, 3(2), págs. 11-20. LORE, T.-S., D. TAN, H.-S. SEAH y M.-H. ER (1992). «Rendering Fireworks Displays», IEEE Computer Graphics and Applications, 12(3), págs. 3 3 - 4 3 . LOOMIS, J., H. POIZNER, U. BELLUGI, A. BLAKEMORE y J. HOLLERBACH (1983). «Compuler-Graphics Modeling of American Sign Language», en los artículos de SIGG R A P I E 8 3 , Computer Graphics, 17(3), págs. 105-114. LOPES, A. y K.BRODLIE(2003). «Improving the Robustness and Accuracy of the MarchingCubes Algorithm for Isosurfaces», IEEE Transactions on Visualization and Computer Graphics, 9(1), págs. 16-29. LORENSON, W. E. y H. CLINE (1987). «Marching Cubes: A High-Resolution 3D Surface Construction Algorithm)), en los artículos de SIGGRAP1E87, Computer Graphics, 21(4), págs. 163-169. MACK1NLAY, J. D.. S. K. CARD y G. G ROBERTSON (1990). «Rapid Controlled Movement Through a Virtual 3D Workspace)), en los artículos de SIGGRAPH'9(), Computer Graphics, págs. 171-176. MACKINLAY, J. D., G G. ROBERTSON y S. K. CARD (1991). «The Perspective Wall: Detail
liibhografia and Context Smoothly Integrated)), CHI '91, págs. 173-179. MAESTRI, (i. (1999). [digital] Character Animation 2. Volume I— Essential Techniques, New Riders Publishing, Indianapolis, IN. MAESTRI, G (2002). [digital] Character Animation 2, Volume 2—Advanced Techniques, New Riders Publishing, Indianapolis, IN.
857
MIAÑO, J. (1999). Compressed Image File Formats, Addison-Wesley/ACM Press, Nueva York. MILLER, G S. P. (1988). «The Motion Dynamics of Snakes and Worms», en los artículos de SIGGRAPIF88, Computer Graphics. 22(4), págs. 169-178.
MAGNENAT-TI IALMANN. N. y D. THALMANN (1987). Image Synthesis. SpringerVerlag, Tokyo.
MILLER, J. V., D. E. BREEN, W. E, LORENSON, R. M. O'BARA y M. J. WOZNY (1991). «Geometricaily Deformed Models: A Method for Extracting Closed Geometric Models from Volume Data», en los artículos de SIGGRAPfr91, Computer Graphics, 25(4), págs. 217-226.
MAGNENAT-TI IALMANN, N. y D. THALMANN (1991). «Complex Models for Animating Synthetic Actors», IEEE Computer Graphics and Applications, 11(5), págs. 32-45.
MITCHELL, D. P. (1991). «Spectrally Optimal Sampling for Distribution Ray Tracing», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 157-165.
MANDELBROT, B. B. (1977). Eructáis: Form, Chance, and Dimension, Freeman Press, San Francisco.
MITCHELL, D. P. y P. HANRAIIAN (1992). «Illuminalion from Curved Rclleelors», en los artículos de SIGGRAPII'92, Computer Graphics, 26(2), págs. 283 291.
MAGNENAT-TIIALMANN, N. y D. THALMANN (1985). Computer Animation: Theory and Practice, Springer-Verlag. Tokyo.
MANDELBROT, B. B. (1982). The Fractal Geometry of Nature, Freeman Press, Nueva York. MANTYLA, M. (1988). An Introduction to Solid Modeling, Computer Science Press, Rockville, MD.
MITROO, J. B., N. HERMAN y N. I. BADLER (1979). «Movies from Music:Visualizing Music Compositions)), en los artículos de S1GGRAPIF79, Computer Graphics, 13(2). págs. 218-225.
MAX, N. L. y D. M. LERNER (1985). «A Two-and a-Half-D Motion Blur Algorithm)), en los artículos de SIGGRAPH'SSj Computer Graphics, 19(3), págs. 85-94.
MIYATA. K. (1990). «A Method of Generating Stone Wall Patterns», en los artículos de SKiGRAPIF90, Computer Graphics, 24(4). págs. 387-394.
MAX, N. L. (1986). «Atmospheric Illumination and Shadovvs», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 117-124.
MOLNAR, S., J. EYLES y J. POULTON (1992). «PixelFIow: High-Speed Rendering Using Image Composition)), en los artículos de SIGGRAPIF92, Computer Graphics, 26(2). págs. 231-240.
MAX. N. L. (1990). «Cone-Spheres)), en los artículos de SlG(iRAPH'9(), Computer Graphics, 24(4), págs. 59-62. MCCARTHY, M. y A. DESCARTES (1998). Reality Architecture: Building JDlVorlds with Java andVRML, Prentice-Hall Europe, Reino Unido. MEYER, G. W. y D. R GREENBERG (1988). «Color-Defective Vision and Computer Graphics Displays», IEEE Computer Graphics and Applications. 8(5), págs. 28-40. MEYERS. D.. S. SKINNER y K.SLOAN(l992). «Surfaces from Contours)), ACM Transactions on Graphics, 11(3), págs. 228-258.
MOON, F. C. (1992). Chaotic and Fractal Dynamics, John Wiley & Sons, Nueva York. MOORE, M. y J. WILHELMS (1988). «Colusión Detection and Response lor Computer Animation)), en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 289-298. MORTENSON, M. E. (1985). Geometric Modeling. John Wiley & Sons, Nueva York. MURAKI, S. (1991). «Volumetrie Shape Description of Range Data Using the 'Blobby Model», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 227-235.
858
fíihliúgm¡M
MUSGRAVE, F, K., C. E. KOLB y R. S. MACE (1989). «The Synthesis and Rendering of Eroded Fractal Terrains», en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 41-50. MYERS, B, A. y W. BUXTON (1986). «Creating High-Interactive and Graphical User Interfaces by Demonstration», en los artículos de S1GGRAPH'86, Computer Graphics, 20(4), págs. 249-258. NAYLOR, B., 1 AMANATIDES y W. TIIIBAULT (1990). «Merging BSP Trees Yields Polyhedral Set Operations», en los artículos de SIGGRAPH^X), Computer Graphics, 24(4), págs. 115-124. NICHOLL, T. M., D. T. LEE y R. A. NICHOLL (1987). «An Efficient New Algorithm for 2D Line Clipping: Its Development and Analysis», en los artículos de SIGGRAPH'87, Computer Graphics, 21(4), págs. 253-262. NIELSON, G M.. B. SHRIVER y L. ROSENBLUM, ed. (1990). Visualization in Scientific Computing, IEEE Computer Society Press, Los Alamitos, CA. NIELSON, G M. (1993). «Scattered Data Modeling», IEEE Computer Graphics and Applications, 13(1), págs. 60-70. NISIIIMURA, H. (1985). «Object Modeling by Distribution Function and a Method of Image Generation», Journal Electronics Comm. Conf '85, J68(4), págs. 718-725. NISI UTA, T. y E. NAKAMAE (1986). «Continuous-Tone Representation of ThreeDimensional Objects Illuminated by Sky Light», en los artículos de SIGGRAPH'86. Computer Graphics, 20(4). págs. 125-132. NISHITA, T., T. SIRAI, K. TADAMURA y E. NAKAMAE (1993). «Display of the Earth Taking into Account Atmospheric Scattering", en los artículos de SIGGRAPir93, Computer Graphics, págs. 175-182. NORTON. A. (1982). «Generation and Display of Geometric Fractals in 3-D», en los artículos de SIGGRAPIE82, ('omputer Graphics, 16(3), págs. 61-67. NSF INVITATIONAL WORKSHOP (1992). «Research Directions in Virtual Environments»,
en los artículos de SIGGRAPH'92, Computer Graphics, 26(3). págs. 153-177. OKABE. H.. II. IMAOKA, T. TOMIHAy II. N1WAYA (1992). «Three-Dimensional Apparel C A D System», en los artículos de SIGGRAPH'92. Computer Graphics, 26(2), págs. 105-110. OLANO, M., J. C. HART.W. HEIDRICH y M. McCOOL (2002). Real-Time Shading, A. K. Natick, MA. OPPENHEIMER, P. E. (1986). «Real-Time Design and Animation of Fractal Plants and Trees», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 55-64. O'ROURKE, M. (1998). Principles of ThreeDimensional Computer Animation, Revised Edition, W. W. Norton, Nueva York. OSF/MOTIF (1989). OSF/Motif St vie Guide, Open Software Foundation. Prentice-Hall, Englewood Cliffs, NJ. PAETH, A. W., ed. (1995). Graphics Gems % Morgan Kaufmann, San Diego, CA. PAINTER, .1. y K. SLOAN (1989). «Anlialiased Ray Tracing by Adaptive Progressive Refinement». en los artículos de SIGGRAPI F89, Computer Graphics, 23(3), págs. 281-288. PALMER, I. (2001). Essential Java 3D Fast, Springer-Verlag. Londres. PANG A. T. (1990). «Linc-Drawing Algorithms for Parallel Machines», IEEE Computer Graphics and Applications. 10(5), págs. 54-59. PAO. Y C. (19X4). Elements of Computer-Aided Design. John Wiley & Sons. Nueva York. PARENT. R. (2002). Computer Animation: Algorithms and Techniques. Morgan Kaufmann, San Francisco, CA. PAVLIDIS, T. (1982). Algorithms For Graphics and Image Processing, Computer Science Press. Rockville. Ml). PAVLIDIS, T. (1983). «Curve Fitting with Come Splines», A CM Transactions on Graphics, 2( I), págs. 1-31. PHACHEY. D. R. (1986). «Modeling Waves and Suri», en los artículos de SIGGRAPH'86, Computer Graphics, 20(4). págs. 65-74.
Bibliografia PEITGEN, H.-ü. y P. H. RICHTER (1986). The Beauty of Fractals, Springer-Verlag, Berlín. PEITGEN, H.-O. y D. SAUPE, eds. (1988). The Science of Fractal Images, Springer-Verlag. Berlín. PENTLAND, A. y J. WILLIAMS (1989). «Good Vibrations: Modal Dynamics for Graphics and Animation», en los artículos de SIGGRAPIE89, Computer Graphics, 23(3), págs. 215-222. PERLIN, K. y E. M. HOFFERT (1989). «Ilypertexture», en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 253-262. PHONG, B. T. (1975). «Illumination for ComputerGenerated Images», Communications of the ACM, 18(6), págs. 311-317. PIEGL, L. y W. TILLER (1997). The NURBS Book, Springer-Verlag, Nueva York.
PINEDA, J. (1988). «A Parallel Algorithm for
Polygon Rasteri/alion», en los artículos de SIGGRAPIT88, Computer Graphics, 22(4), págs. 17-20. PITPEWAY, M. L. V. y D. J. WATKINSON (1980). «liresenham's Algorithm with Gray Scale». Communications of the ACM, 23( 11 ), págs. 625-626. PLATT, J. C. y A. II. BARR (1988). «Constraint Methods for Flexible Models», en los artículos de SIGGRAPH'88, Computer Graphics, 22(4), págs. 279-288. POCOCK. L. y .1. ROSEBUSH (2002). The C 'omputer Animator s Technical Handbook. Morgan Kaufmann, San Francisco. CA. POTMESIL, M. y I. CHAKRAVARTY (1982). «Synthctic Image Generation with a Lens and Aperture Camera Model». At 'M Transactions on Graphics. 1(2), págs. 85-108. POTMESIL. M. y I. CHAKRAVARTY (1983). «Modeling Motion Blur in Computer-Generated Images», en los artículos de SIGGRAPH'83. Computer Graphics, 17(3), págs. 389-399. POTMESIL, M. y E. M. HOFFERT(1987). «FRAMES: Software Tools for Modeling. Rendering and Animation of 3D Scenes», en los artículos de SIGGRAPIF87, Computer Graphics, 21(4), págs. 85-93. POTMESIL. M. y E. M. HOFFERT (1989). «The Pixel Machine: A Parallel Image Computer», en
859
,
los artículos de SIGGRAPH 89, Computer Graphics, 23(3), págs. 6 9 - 7 8 . PR ATT. W. K. (1978). Digital Image Processing, JohnWiley & Sons, Nueva York. PREPARATA, F. P. y M. I.SHAM0S(I985). Computational Geometry, Nueva York.
Springer-Verlag.
PRESS,W. H., S. A. TEUKOLSKY,W. T. VETTERLING y B. P. FLANNERY (1993). Numerical Recipes in C: The Art of Scientific Computing, Second Edition, Cambridge University Press, Cambridge, Inglaterra. PRESS.W. H., S. A. TEUKOLSKY, W. T. VETTERLING y B. P. FLANNERY (2002). Numerical Recipes in C + + : The Art of Scientific Computing, Second Edition, Cambridge University Press, Cambridge, Inglaterra. PRESTON, K., FAGAN, HUANG y PRYOR (1984). «Computing in Medicine», Computer, 17(10), págs. 294-313. PRUSINKIEW1CZ, P.,M. S.HAMMEL y E. MJOLSNESS (1993). «Animation of Plant Development», en los articulos de SIGGRAPIE93, Computer Graphics, págs. 351-360. PRUYN, P. W. y D. P. GREENBERG (1993). «Exploring 3D Computer Graphics in Cockpit Avionics», IEEE Computer Graphics and Applications, 13(3), págs. 28-35. OUEK, L.-H. y D. HEARN (1988). «Ellicicnt Space-Subdivision Methods in Ray-Tracing Algorithms». University of Illinois, Department of Computer Science Report UIUCDCS-R-881468. RAIBERT, M. H. y J. K. HODGÍNS ( 1991 ). «Animalion of Dynamic Legged Locomotion», en los artículos de S I G G R A P H ^ I , Computer Graphics, 25(4), págs. 349-358. RAO. K. R. y P. YIP (1990). Discrete Cosine Transform, Academic Press, Nueva York. REEVES. W. T. (1983a). «Particle Systems: A Technique for Modeling a Class of Fuzzy Objects», ACM Transactions on Graphics, 2(2), págs. 91-108. REEVES,W. T. (1983b). «Particle Systems -A Technique for Modeling a Class of Fuzzy Objccts», en los artículos de SIGGRAPH'83, Computer Graphics, 17(3), págs. 359-376.
860
Bibliografia
REEVES, W. T. y R. BLAU (1985). «Approximate and Probabilistic Algorithms for Shading and Rendering Structured Particle Systems», en los artículos de SIGGRAPH'85, Computer Graphics, 19(3), págs. 313-321. REEVES, W. T., D. II. SALESIN y R. L. COOK (1987). «Rendering Antialiased Shadows with Depth Maps», en los artículos de SIGGRAPH' 87, Computer Graphics, 21(4), págs. 283-291. REQUICHA« A. A. G. y J. R. ROSSIGNAC (1992). «Solid Modeling and Beyond», IEEE Computer Graphics and Applications, 12(5), págs. 31-44.
«The Detailed Semantics of Graphics Input Devices», en los artículos de SIGGRAPIT82, Computer Graphics, 16(3), págs. 3 3 - 3 8 . RUBINE, D. (1991). «Specifying Gestures by Example», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4). págs. 329-337. RUSHMEIER, II. y K. TORRANCE ( 1987). «The Zonal Method for Calculating Light Intensities in the Presence of a Participating Medium», en los artículos de SIGGRAPH'S?, Computer Graphics, 21(4), págs. 293-302.
REYNOLDS, C. W. (1982). «Computer Animation with Scripts and Actors», en los artículos de SIGGRAPH'82, Computer Graphics, 16(3), págs. 289-296.
RUSHMEIER, H. E. y K. E. TORRANCE (1990). «Extending the Radiosity Method to Include Specularly Retlccting and Translucent Materials», ACM Transactions on Graphics, 9(1), págs. 1-27.
REYNOLDS, C. W. (1987). «Flocks, Herds y Schools: A Distributed Behavioral Model», en los artículos de SIGGRAPIE87, Computer Graphics, 21(4), págs. 25-34.
SABELLA, P. (1988). «A Rendering Algorithm for Visualizing 3D Scalar Fields», en los artículos de SIGGRAPH'88, Computer Graphics, 22(4). págs. 51-58.
RHODES, M. L., et al. (1983). «Computer Graphics and An Interactive Stereotactic System for CT-Aided Neurosurgery», IEEE Computer Graphics and Applications, 3(5), págs. 31-37.
SABIN, M. A. (1985). «Contouring: The State of the Art», in Fundamental Algorithms for Computer Graphics, R. A. Earnshaw, ed.. Springer-Verlag, Berlín, págs. 411-482.
RIESENFELD, Coordinates Graphics». Applications,
R. F. (1981). «Homogeneous and Projective Planes in Computer IEEE Computer Graphics and 1(1), págs. 50-55.
ROBERTSON. P. K. (1988). «Visualizing Color Gamuts: A User Interface for the Effective Use of Perceptual Color Spaces in Data Displays», IEEE Computer Graphics and Applications, 8(5), págs. 50-64. ROBERTSON. G. G.. J. D. MAC KIN LAY and S. K. CARD (1991). «Cone Trees: Animated 3D Visualizations of Hierarchical Information», CHI 'W.págs. 189-194. ROGERS, D. F. y R. A. EARNSHAW. eds. (1987). Techniques for Computer Graphics, SpringerVerlag, Nueva York.
SAKAGUCHI. H., S. L. KENT y T. COX (2001). The Making of Fitta/ Fantasy, The SpiritsWitlnn, Brady Games, Indianapolis, IN. SALESIN, D. y R. BARZEL ( 1993). «Adjustable fools: An Object-Oriented Interaction Mclaphor», ACM lYansactions on Graphics, 12(1), págs. 103-107. SAMET, II. y M. TAMMINEN (1985). «Buitrees. CSG Trees and Time», en los artículos de SIGGRAPIF85. Computer Graphics, 19(3), págs. 121 130. SAMET, II. y R. E. WEBBER (1985). «Sorting a Collection of Polygons using Quadtrees», ACM Transactions on Graphics, 4(3), págs. 182-222.
Graphics.
SAMET, H. y R. E. WEBBER (1988a). «Hierarchical Data Structures and Algorithms for Computer Graphics: Part I », IEEE Computer Graphics and Applications. 8(4), págs. 5 9 - 7 5 .
ROGERS, D. F. (1998). Procedural Elements for Computer Graphics, McGraw-Hill, Nueva York. ROSENTHAL, D. S. II., .1. C. MICHENER, G. PFAFF, R. KESSEMER y M. SABIN (1982).
SAMET, H. y R. E. WEBBER (1988b). «Hierarchical Data Structures and Algorithms for Computer Graphics: Part 2», IEEE Computer Graphics and Applications, 8(3). págs. 4 8 - 6 8 .
ROGERS. D. F. y J. A. ADAMS (1990). Mathematical Elements for Computer McGraw-Hill, Nueva York.
Bibliografìa SCHACHTER, B. J.. ed. (1983). Computer Image Generation, John Wiley & Sons, Nueva York. SCHEIELER, R. W. y J. GETTYS (I986). «The X Window System», ACM Transactions on Graphics, 5(2), págs. 79-109. SCHOENEMAN,C, J.DORSEY, B. SM ITS, J.ARVO y D. GREENBERG (1993). «Painting with Light», en los artículos de SIGGRAPH'93, Computer Graphics, págs. 143-146. SCHRODER, P. y P. HANRAI IAN (1993). «On the Form Factor Between Two Polygons», en los artículos de SlGGRAPir93. Computer Graphics, págs. 163-164. SCHWARTZ, M. W., W. B. COWAN y J. C. BEATTY (1987). «An Experimental Comparison of RGB, Y1Q, LAB. HSV y Opponent Color Models», ACM Transactions on Graphics, 6(2). págs. 123-158. SEDERBERG, T.W. y E.GREEN WOOD (1992). «A physically Based Approached lo 2-D Shape Bending», en los artículos de SIGGRAPH 92, Computer Graphics, 26(2), págs. 25-34. ,
SIDERBERG, T.W., P. GAO, GWANG y H.MtJ (1993). «2D Shape Blending: An Intrinsic Solution to the Vertex Path Problem», en los artículos de SIGGRAPH'93, Computer Graphics, págs. 15-18. SEGAL, M. (1990). «Using Tolerances to Guarantee Valid Polyhedral Modeling Results», en los artículos de SIGGRAPH'90, Computer Graphics, 24(4), págs. 105-114. SEGAL. M., C. KOROBKIN. R. V A N WIDENFELT. J. FORAN y P. IIAEBERL1 (1992). «Fast Shadows and Lighting Effects Using Texture Mapping», en los artículos de SIGGRAPH'92, Computer Graphics. 26(2), págs. 249-252. SELM AN, D. (2002). Java 3D Programming, Manning Publications, Greenwich, CT. SEQUIN, C. H. y E. K. SMYRL(1989). «Parameterized Ray-Tracing», en los artículos de SIGGRAPIFX9, Computer Graphics, 23(3), págs. 307-314. SHERR, S. (1993). Electronic Displays, John Wiley & Sons, Nueva York. SHILLING A. y W. STRASSER (1993). «EXACT: Algorithm and Hardware Architecture for an
861
Improved A-Buífer», en los artículos de SIGG R A P H ' 9 3 , Computer Graphics, págs. 85-92. SHIRLEY, P. ( 1990). «A Ray Tracing Method for Illumination Calculation in Diffuse-Specular Scenes», Graphics interface '90, págs. 205-212. SHIRLEY. P. (2000). Realistic Ray Tracing, A. K. Peters, Natick, MA. SHNEIDERMAN, B. (1986). Designing the User Interface, Addison-Wesley, Reading. MA. SHOEMAKE, K. (1985). «Animating Rotation with Quaternion Curves», en los artículos de SIGGRAPH'85, Computer Graphics, 19(3), págs. 245-254. SHREINER, D.. ed. (2000). OpenGL Reference Manual. Third Edition. Addison-Wesley, Reading. MA. SIBERT, J. L.,W. D. HURLEY y T.W. BLESER (1986). «An Object-Oriented User Interface Management System», en los artículos de S I G G R A P i r 8 6 , Computer Graphics, 20(4), págs. 259-268. SILLION, F. X. y C. PUECH (1989). «A General Two-Pass Method Integrating Specular and Diffuse Reflection", en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 335-344. SILLION, F. X., J. R. ARVO, S. II. WESTIN y D. P. GREENBERG (1991). «A Global Illumination Solution for General Reflectance Distributions)), en los artículos de SIGGRAPH'91. Computer Graphics, 25(4), págs. 187 196. SILLION, F. X. y C. PUECH (1994). Radiosity and Global Illumination, Morgan Kaufmann. San Francisco. CA. SIMS. K. (1990). «Particlc Animation and Rendering Using Data Parallel Computation», en los artículos de SIGGRAPH'90, Computer Graphics, 24(4). págs. 405-413. SIMS, K. (1991). «Artificial Evolution for Computer Graphics», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4). págs. 319-328. SMITI I, A. R. ( 1978). «Color Gamut Transform Pairs», en los artículos de SIGGRAPH'78. Computer Graphics, 12(3), págs, 12-19, SMITH. A. R. (1979). «Tini Fili», en los artículos de SIGGRAPH'79, Computer Graphics, 13(2), págs. 276-283.
862
Hibliografía
SMITH, A. R. (1984). «Plañís, Fractals y Formal Languages», en los artículos de SIGGRAPí F84. Computer Graphics, 18(3), págs. 1 —10.
( 1990). «A Critical Evaluation of PEX», IEEE Computer Graphics and Applications, 10(6). págs. 65-75.
SMITH. A. R. (1987). «Planar 2-Pass Texture Mapping and Warping», en los artículos de SK ÍGR A PH'87, Computer Graphics, 21(4), págs. 263-272.
SUTHERLAND. 1. E. (1963). «Sketchpad: A Man-Machine Graphical Communication System», AF1PS Spring Joint Computer Conference, 23, págs. 329-346.
SMITS, B. E., J. R. ARVO y D. H. SALESIN (1992). «An Importance-Driven Radiosity Algorithm», en los artículos de SIGGRAPí F92, Computer Graphics, 26(2), págs. 273-282.
SUTHERLAND, I. E. y G W. Hodgman (1974). «Reentran! Polygon Clipping". Communications of the ACM, 17(1), págs. 32-42.
SNYDER, .1. M. y J.T. KAJ1YA (1992). «Generative Modeling: A Symbolic System for Geometric Modeling». en los artículos de SICiGRAPH'92, Computer Graphics, 26(2). págs. 369-378. SNYDER, J. M., A. R. WOODBURY, K. FLEISCHER, B CURRIN y A. II. BARR (1993). «Inlerval Methods Ibi Multi-Poinl ( ollisions between Time-Dependent Curved Surfaces», en los artículos de SIGGRAPÍ 1*93, Computer Graphics, págs. 321-334. SOW1/RAL, IL, K. RUSH FORTH y M. DEERING (2000). The Java 3D API Specification, Second Edition, Addison-Wesley, Reading. MA. SPROULL, R. F. e I. E. SUTHERLAND (1968). «A Clipping Divider», AFIPS Fall Joint Computer Conference. STAM. J. y E. FlUME (1993). «Turbulent Wind Fields for Gaseous Phenomena", en los artículos de SIGGRAPIF93, Computer Graphics, págs. 369-376. STETTNER, A. y D. P. GREENBERG ( I W l . «Computer Graphics Visualization Tor Acoustic Simulation», en los artículos de SIGGRAPÍ F89. Computer Graphics, 23(3). págs. l°>5-2()(>. STRASSMANN, S. (1986). «Ilairy Brushes», en los artículos de SIGGRAPH'86. Computer Graphics, 20(4), págs. 225 232. STRAUSS, P. S. y R. CAREY (1992). «An ObjectOriented 3D Graphics Toolkit», en los artículos de SIGGRAP1F92, Computer Graphics. 26(2). págs. 341-349. STROTHOTTE. T. y S. SCHLECHTWEG (2002). Non-Pbotorealistu Computer Graphics: Modeling, Rendering, and Animation, Morgan Kaufmann. San Francisco. CA. 1
SUNG, H. C. K., G. ROGERS y W. J. KUBITZ
SUTHERLAND, I. E., R. F. SPROULL y R. SCHUMACHER (1974). «A Characterization o f f e n Hidden Surface Algorithms". ACM Computing Surveys, 6( 1 ), págs. 1-55. SWEZEY, R. W. у E. G DAVIS (1983). «A Case Study of Human Factors Guidelines in Computer Graphics», IEEE Computer Graphics
and Applications, 3(8), págs. 21-30. TAKALA. Т. у J. HAHN (1992). «Sound
Rendering», en los artículos de SIGGRAPtF92, Computer Graphics, 26(2), págs. 211 220. TANNAS, JR., L. E., ed. (1985). Flat-Panel Displays and CRTs, Van Nostrand Reinhold. Nueva York. TAUBMAN, D. у M. MARCELLIN (2()()\). JPEG 2000:
Image-Comfuvssion
Fundamentals,
Standards, and Practice, Kluwer Academic Publishers. Norwell. MA. TELLER, S. у P. IIANRAHAN ( 1993). «Global Visibility Algorithms for Illumination Computa tions", en los artículos de SIGGRAPIГ93. Computer Graphics, págs. 239-246.
TERZOPOULOS, D., .1. PLATT, A. II. BARR, et al. (1987). «Elastically Deformable Models», en los artículos de SIGGRAPH'87, Computer Graphics. 21(4), págs. 205-214. THALMANN.N.M.and D.THALMANN( 1985). Computer Animation: Theoty and Practice, Springer-Verlag, Tokyo. TI IALMANN. D.. ed. (1990). Scientific \t\uatization and Graphics Simulation, John Wiley & Sons, Chichester, Inglaterra. THIBAULT, W. С. у В. F. NAYLOR (1987). «Set Operations on Polyhedra using Binary Space Partitioning Trees». en los artículos de SIG-
GRAPH'87, Computer Graphics, 21(4), págs. 153-162.
Bibliografía THOMAS. II. y W. LKFKON (1997). Disney's Art of Animation from Mickey Mouse to Hercules, Hyperion Press, Nueva York. THOMAS, F., O. JOHNSON y C. JOHNSTON (1995). The Illusion of Life: Disney Animation, Hyperion Press, Nueva York. TOR BERG, I, G. (1987). «A Parallel Processor Architecture for Graphics Arithmetic Operations)), en los artículos de SIGGRAPH'87, Computer Graphics, 21(4), págs. 197-204. TORRANCE, K. E. y E. M. SPARROW (1967). «Theory for Off-Specular Reflection from Roughened Surfaces». Journal of the Optical Society of America, 57(9), págs. 1105-1114.
863
VON HERZEN, B., A. H. BARR y H. R. ZATZ (1990). «Géométrie Collisions for TimeDependent Parametric Surfaces», en los artículos de SIGGRAPir90, Computer Graphics, 24(4), págs. 39-48. WALLACE, V. L. (1976). «The Semantics of Graphic Input Devices», en los artículos de SIG(iRAPIF76, Computer Graphics, 10(1), págs. 61-65. WALLACE, J. R., K. A. ELMQUIST y E. A. HAINES (1989). «A Ray-Tracing Algorithm for Progressive Racliosity», en los artículos de SIGGRAPH'89, Computer Graphics, 23(3), págs. 315-324.
TRAVIS, D. (1991). Effective Color Displays, Academic Press, Londres. TUFTE, E. R. (1990). Envisioning Information, Graphics Press, Cheshire, CN. TUFTE, E. R. (1997). Usual Explanations: images and Quantities, Evidence and Narrative, Graphics Press, Cheshire, CN. TUFTE, E. R. (2001). The Visual Display óf Quantitative Information, Second Edition, Graphics Press, Cheshire, CN. TURKOWSKI, K. (1982). «Antialiasing Through the Use of Coordinate Transformations)), ACM Transactions on Graphics, 1(3), págs. 215-234. UPSON, C. y M. KEELER (1988). «VBUFFER: Visible Volume Rendering)), en los artículos de SIGGRAPIF88, Computer Graphics, 22(4), págs. 59-64. UPSON, C, et al. (1989). «The Application Visualization System: A Computational Environment for Scientific Visualization)), IEEE Computer Graphics and Applications, 9(4), págs. 30-42.
WALSH, A. E. y D. GEHRINGER (2002). Java 3D, Prentice-Hall, Upper Saddle River, NJ. WANGER, L. R., J. A. FERWERDA y D. P. GREENBERG ( 1992). «Perceiving Spatial Relationships in Computer-Generated Images», IEEE Computer Graphics and Applications, 12(3). págs. 44-58.
UPSTILL, S. (1989). The Render Man Companion, Addison-Wesley, Reading, MA. VAN W1JK, J. J. (1991). «Spot Noise-Texture Synthesis for Data Visualization)), en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 309-318. VEENSTRA, J. y N. AHUJA (1988). «Une Drawings of Octree-Represented Objects)), ACM Transactions on Graphics, 7(1), págs. 61-75. VELHO, L. y J. D. M. GOMES (1991). «Digital Halftoning with Space-Filling Curves», en los artículos de SIGGRAP1F91, Computer Graphics, 25(4), págs. 81-90.
WEGHORST, IL, G. HOOPER y D. P. GREENBERG (1984). «Improved Computational Methods for Ray Tracing», ACM Transactions on Graphics, 3(1), págs. 52-69. WEIL. J. (1986). «The Synthesis of Cloth Objects», en los artículos de SIGGRAPH 86, Computer Graphics, 20(4), págs. 49-54. WEILER, K. y P. ATHERTON (1977). «HiddenSurface Removal Using Polygon Area Sorting", en los artículos de SIGGRAPH'77, Computer Graphics, 11(2), págs. 214-222. WEILER, K. (1980). «Polygon Comparison Using a Graph Représentation», en los artículos de
WARN, D. R. (1983). «Lighting Controls for Synthetic Images», en los artículos de SIGGRAPH'83, Computer Graphics, 17(3), págs. 13-21. WATT, A. (1989). Fundamentals of ThreeDimensional Computer Graphics, AddisonWesley, Wokingham, Inglaterra. WATT,M. (1990). «Light-Water Interaction Using Backward Beam Tracing», en los artículos de S1GGRAPIE90, Computer Graphics, 24(4), págs. 377-386. WATT, A. y M. WATT (1992). Advanced Animation and Rendering Techniques, AddisonWesley, Wokingham, Inglaterra.
1
864
Bibliografía
SIGGRAPH'80, Computer Graphics, 14(3), págs. 10-18. WEINBERG, R. (1978) «Computer Graphics in Support of Space-Shuttle Simulation», en los artículos de S1GGRAPIF78, Computer Graphics, 12(3), págs. 82 86. WELCH, T. (1984). «A Technique for HighPerformance Dala Compression», IEEE Computer, 17(6), págs. 8-19. WERNECKE, J. (1994). The Inventor Mentor, Addison-Wesley, Reading, MA. WESTIN, S. II., J. R. ARVO y K. E. TORRANCE (1992). «Predicting Reflectance Functions from Complex Surfaces», en los artículos de SIGGRAPH'92, Computer Graphics. 26(2), págs. 255-264. WESTOVER, L. (1990). «Footprint Evaluation for Volume Rendering)), en los artículos de SIGGRAPH'90, Computer Graphics, 24(4), págs. 367-376. WHITTED, T. (1980). «An Improved Illumination Model for Shaded Display», Communications o f the A C M i 23(6), págs. 343-349. WHITTED, T. y D. M. WEIMER (1982). «A Software Testbed for the Development of 3D Raster Graphics Systems», ACM Transactions on Graphics, 1(1), págs. 4 3 - 5 8 . WHITTED, T. (1983). «Antialiased Line Drawing Using Brush Extrusión», en los artículos de S1GGRAPH 83, Computer Graphics, 17(3), págs. 151-156. ,
WILHELMS, J. (1987). «Toward Automatic Motion Control», IEEE Computer Graphics and Applications, 7(4), págs. 11-22. WILHELMS, J. y A. VAN GELDER (1991). «A Coherent Projection Approach for Direct Volume Rendering)), en los artículos de S1GGRAPW9\, Computer Graphics, 25(4), págs. 275-284. WILHELMS, J. y A. VAN GELDER (1992). «Octrees for Faster lsosurface Generation», ACM Transactions on Graphics, 11(3), págs. 201-227. WILLIAMS, L. (1983). «Pyramidal Parametrics», en los artículos de SIGGRAPH'83, Computer Graphics, 17(3), págs. 1-11. WILLIAMS, L. (1990), «Performance-Driven Facial Animation», en los artículos de
SIGGRAPH'90, Computer Graphics, 24(4), págs. 235-242. WITKIN, A. y W. WELCH (1990). «Fast Animation and Control of Nonrigid Structures)), en los artículos de SIGGRAPH'90, Computer Graphics, 24(4), págs. 243-252. WITKIN, A. y M. KASS (1991). «ReactionDiflusíon Textures», en los artículos de SIGGRAPH"9I, Computer Graphics, 25(4), págs. 299-308. WOLFRAM, S. (1984) «Computer Software in Science and Mathematics)), Scientific American, 251(3), 188-203. WOLFRAM, S. (1991). Mathematics AddisonWesley. Reading, MA. WOO, A., P. P O U L I N y A . FOURNIER (1990). «A Survey of Shadow Algorithms)), IEEE Computer Graphics and Applications, 10(6), págs. 13-32. WOO M., J. NEIDER, T. DAVIS y D. SHREINER (1999). OpenGL Programming Guide, Third Edition, Addison-Wesley, Reading, MA. WRIGHT, W. E. (1990). «Parallelization of Bresenham's Line and Circle Algorithms)), IEEE Computer Graphics and Applications, 10(5), págs. 6 0 - 6 7 . WU, X. (1991). «An Efficient Antialiasing Technique)), en los artículos de SIGGRAPH'SM, Computer Graphics, 25(4), págs. 143-152. WYSZECKI, G. y W. S. STILES (1982). Color Science, John Wiley & Sons, Nueva York. WYV1LL, G, B. WYV1LL y C. MCPHEETERS (1987). «Solid Texturing of Soft Objects», IEEE Computer Graphics and Applications, 7( 12), págs. 20-26. YA EG ER, L., C. UPSON y R. MYERS (1986). «Combining Physical and Visual Simulation: Creation of the Planet Jupiter for the Film 'WM- «, en los artículos de SIGGRAPH'86, Computer Graphics, 20(4), págs. 85-94. YAGEL, R., D. COHEN y A. KAUFMAN (1992). «Discrete Ray Tracing)), IEEE Computer Graphics and Applications, 12(5), págs. 19-28. YAMAGUCH1, K.,T. L. KUN11 y F. FUJIMURA (1984). «Octree-Related Data Structures and Algorithms)), IEEE Computer Graphics and Applications, 4(1), págs. 53-59.
Bibliografía
YESSIOS, C. I. (1979). «Computer Drafting of Stones, Wood, Plant y Ground Materials», en los artículos de SIGGRAPH'79, Computer Graphics, 13(2), págs. 190-198. YOUNG, D. A. (1990). The X Window SystemProgramming and Applications with Xt, OSF/Motif Edition, Prentice- Hall, Englewood Cliffs, NJ. ZELEZNICK, R. C, et al. (1991). «An ObjectOriented Framework for die Integration of Interactive Animation Techniques», en los artículos de SIGGRAPH'91, Computer Graphics, 25(4), págs. 105-112. ZELTZER, D. (1982). «Motor Control Techniques for Figure Animation)), IEEE Computer Graphics and Applications, 2(9), págs. 53-60.
865
ZHANG,Y. y R. E.WEBBER(1993). «Space Diffusion:An Improved Parallel Halftoning Technique Using Space-Filling Curves», en los artículos de SIGGRAPH'93, Computer Graphics, págs. 305-312. ZIV, J. y A. LEMPEL ( 1977). «A Universal Algorithm lor Sequential Data Compression», IEEE Transactions on Information Theory, 23(3), págs. 337 343. ZIV. J. y A. LEMPEL (1978). «Compression of Individual Sequences via Variable-Rate Coding», IEEE Transactions on Information Theory, 24(5), págs. 530-536.
Indice 4 conexiones, método de relleno. 208 8 conexiones, método de relleno, 208
A Absolutas, coordenadas, 87 Absoluto, valor (número imaginario), 826 Aceleración gravitatoria, 121-2 Acelerador: ánodo (TRC), 36 tensión (TRC), 36 Adobe Photoshop, formato, 804 AGL (Apple GL), 75 Alámbrico: algoritmos de visibilidad, 566-8 imágenes, 127-8 métodos de variación de la intensidad eoñ la profundidad, 356-7 Algoritmo basado en diccionario, 795 Algoritmo de Bresenham: círculo, 105 6 línea, 96-100 Algoritmo de húfer de profundidad (detección de visibilidad), 549-52 Algoritmo de difusión de errores, 612-3 de puntos, 613 Algoritmo de inundación-relleno, 211 Algoritmo de los cubos en marcha (véase Isosuperficies) Algoritmo de ordenación de profundidad, 556-8 Algoritmo de sustitución, 795 Algoritmo de visibilidad por subdivisión de área, 559-62 Algoritmo del pintor (ordenación de profundidad). 556 Algoritmo lineal de relleno suave, 200-2
Algoritmos de dibujo de líneas. 92-102 Bresenham, 96 100 DDA, 94-95 especificación de valores del búfer de imagen, 102-3 métodos paralelos, 100—102 poli linea*. 100 Algoritmos de línea de barrido: detección de superficies visibles, 554-6 generación de elipse, 113-20 generación de un círculo, 106-11 métodos de relleno de contomos curvos, 207 propiedades de coherencia, 203 relleno de polígonos, 202-6 relleno de polígonos convexos, 206 segmentos lineales, 92-103 Algoritmos de recorte, 322 bidimensional, 323-48 código exterior, 324 códigos de región, 324, 402-3 coordenadas homogéneas, 402-3 curvas, 346. 407-8 de líneas de Cyrus-Beck, 330 de líneas de Liang-Barsky, 330-3 de líneas de Nichol-Lee-Nichol, 333-5 de polígonos de Liang-Barsky, 345 de polígonos de Sutherlandllodgman, 338-43 de polígonos de Weiler-Atherton, 343-5 métodos paralelos, 338-9 métodos paramélricos, 330-1 poliedros, 406-8 polígonos. 336-46, 406-7
polígonos cóncavos, 343-5 puntos, 323, 403 recorte de líneas de CohenSulherland, 324-9 segmentos lineales, 323-36, 404-7 texto, 347-8 tridimensional, 401 9 Algoritmos de relleno de área: antialiasing, 226 X áreas de contorno curvo, 207 áreas de contorno irregular. 207-11 método de inundación-relleno, 211 método de las 4 conexiones, 208 método de las 8 conexiones, 208 método de línea de barrido, 202-6 método de relleno de contorno, 207-10 métodos paralelos, 204-5 mezcla de color. 200-2 mosaico, 200 patrones de relleno, 199-200 polígonos, 202-6 polígonos convexos, 206 relleno cuadriculado, 200 relleno suave, 200 relleno tintado, 200 Algoritmos de relleno de contomo: región con 4 conexiones, 208 región con 8 conexiones, 208 Algoritmos del punto medio: generación de círculos, 106-11 generación de elipses. 113-20 Algoritmos generadores de círculos, 104-11, 120-3 Bresenham, 105-6 del punto medio, 106- 11 Algoritmos paralelos: generación de curvas, 124
868
índice
Algoritmos paralelos (cont) relleno de áreas, 204-5 visuali/ación de líneas, 100-102 A lias ing, 221 Alineación (texto), 220 Alta definición, monitor de vídeo, 38 American National Standards Institute(ANSI), 73, 803 Amplitud de onda dominante. 737 Analizador diferencial digital (DDA), algoritmo de líneas, 94-95 Angstrom, 736 Ángulo: campo de visión, 387-9 de incidencia (luz), 585 6 dirección, 815 fase, 767-8 reflexión especular, 588 refracción, 598, 622 rotación, 240 Ángulo de excentrieidad, 113 Ángulo interior (polígono), 129 Ángulo sólido, 814 Animación, 252-3, 755 aceleraciones, 764-7 anticipación, 759 aplicaciones, 6, 7, 26, 28-31 cinemática, 761, 768-9, 770-1 cinemática inversa, 768-9, 770-1 compresión y expansión, 759 definiciones de objetos, 758 descripción de escenas, 760 dinámica, 768-9 dinámica inversa, 768-9 dirigida por objetivos, 768 diseño, 757-9 doble búfer, 756-7 efectos panorámicos, 365 en tiempo real, 52-53, 755 errores de redodendo y de aproximación, 252-3, 772 especificación de acciones, 760 especificación de movimiento, 767-9 especificación directa de movimiento, 767-8 física, 761,768-9 fotograma a fotograma, 755
fotograma clave, 758 fotogramas intermedios, 758 funciones, 760 grados de libertad de un cuerpo rígido, 760-1 guión. 758 lenguajes, 760-1 mediante tabla de colores, 757 métodos de barrido, 757 morfismo, 27-28, 31, 762-4 movimiento periódico submuestreado, 770- I movimientos periódicos, 771-2 personajes articuladas, 769-71 rotacional, 252-3, 771-2 seguimiento, 760 según la ley del movimiento de Newton, 768-9 sistema basado en fotogramas clave, 760, 761 7 sistema de scripts, 761 sistema parametri/ado, 761 $рИщ Kochunek-Bartels, 444 submuestreada, 770-1 tasas de muestreo, 771-2
técnicas tradicionales de dibujos animados, 759-60 lemporización, 759 transformaciones de tabla de color. 757 variación del centro de atención, 760 velocidad de imagen, 756-7 velocidad de imagen irregular, 757 Animación por computadora, 755-75 (véase también Animación) ANSÍ (American National Standards Institute), 73, 803 Anriatiasingy 221 (véase también Muestreo) fases de píxel, 221, 225 nitrado, 224 frecuencia de muestreo de Nyquist, 221 fronteras de un área, 226-8 fronteras de una superficie, 226-8 función de filtro gausiana, 225-6 intervalo de Nyquist muestreo, 221
mapa de texturas, 652-3 máscara de ponderación, 223 método de Pitteway-Watkinson, 227-8 muestreo de un área. 221, 224 muestreo eslocástico. 634-5 postfiltrado. 221 prefiltrado. 221 segmentos de líneas, 221-5 superficie de ponderación, 224-5 supermuestreo, 221 trazado de rayos, 632-3 API (Application prograniming interface), 70 Aplicaciones, 3 33 (véase también Aplicaciones gráficas) de entretenimiento, 28-31 de formación, 19-23 Aplicaciones gráficas: agricultura. 14, 18 animaciones, 6, 7, 27, 28-31 anuncios. 7, 25-28 arquitectura, 9 10 arte, 23-28 (véase también Arte por computadora) astronomía, 12, 31 CAD, 5 10 CAM, 7 ciencias físicas, 12-19, 31 diseño. 5 10 diseño de oficinas, 9-10 edición, 23, 25, 27 educación, 19-23 entrenamiento, 19-23 entretenimiento, 28-31 fabricación, 7 geología, 31 gráficas y diagramas, 3-5 ingeniería, 5-8 interfaces gráficas de usuario, 32-33 matemáticas, 12-13,25-27 medicina, 31-32 modelado, 5-10, 12-19 negocios, 3,5, 12, 18, 27-28 procesamiento de imágenes, 31-32 realidad virtual, 10-11 simulaciones, 6-7, 10-11, 12-23
índice simuladores, 19-23 simuladores de vuelo, 19-22 visualización científica, 12-19 Apple GL (AGL), 75 Aproximación por tramos (sp/ine), 123,432 Árbol binario de particionamiento en el espacio, 492, 558-9 {véase también BSP, árbol) Árbol cuaternario, 489 Árbol octal, 489-92 elemento de volumen, 491 generación, 489-92 métodos de detección de visibilidad, 492, 562-3 operaciones CSG, 492 voxel, 491 Archivo de barrido en bruto, 791 Archivo de imágenes, 791 (véase también Formatos de archivo gráfico) configuraciones, 791-2 métodos de compresión, 793-801 métodos de reducción de color, 792-3 principales formatos, 801-5 Archivo vectorial, 42 Archivos de cabecera para OpenGL, 76 Área rellena, 127 atributos, 199-202 entorno curvo, 207-11 interior, 132-4 operaciones lógicas, 200--1 polígono, 128-39 regla del número de vueltas distinto de cero, 132-4 regla par-impar, 132 Arista (polígono), 128 efectos de costura, 214 indicador (OpenGL), 214-6 vector, 129-30 Aristas activas, lista de, 205 Arrastre, 696 Arte por computadora, 23-28, 62- 3, 191 Asistido por computadora: cirugía, 31 -32 diseño (CAD), 5
educación y formación, 19-23 fabricación (CAM), 7-9 proyecto y diseño (CADD), 5 Atenuación angular de la intensidad (fuente luminosa), 581-3 Atenuación radial de la intensidad (fuente luminosa), 579-80 Atributos de marcador, 220
B Bandas de mach, 617 barrido: animaciones, 757 archivo (búfer), 39 fuente, 153 operaciones, 38-41, 50-54 Barrido TC (Tomografía computerizada), 31 Barrido de textura, 652-3 Barrido en orden de imagen (mapeado de textura), 652-3 Barrido en orden de píxel (textura), 652-3 Base: normal, 819-20 ortogonal, 819-20 ortonormal, 819-20 vectores de coordenadas, 818-9 Base normal, 819-20 ticia-spline, 465-6 condiciones de continuidad, 465-7 periódica cúbica, 466 Bézier: conversiones de ü-splines, 469-70 curva cerrada, 450-1 curva cúbica, 451-3 curvas, 445-54 funciones de mezcla, 445-6 matriz, 453 propiedades, 450 superficies, 454 técnicas de diseño, 450-1 Big endian, 791 Bitblt (transferencia de bloques de bits), 265 Bitmap, 40, 148 (véase también Búfer de imagen)
869
BMP. 805 Brillo (luz), 737 BSP: algoritmo de visibilidad, 559-60 árbol, 492 B-spline: abierto, 461-4 control local, 454-6 conversiones de Bézier, 469-70 cuadrática, 458-9 cúbica, 460-1 curvas, 454-64 fórmulas de recursión de Cox-deBoor, 456 funciones de mezcla, 456,461 matriz, 461 no uniforme, 464 no uniforme racional (NURB), 467-9 parámetro de grado, 455 parámetro de tensión. 461 periódica, 457-64 propiedades, 454-5,456-7 racional, 467-9 superficies, 464-5 uniforme, 457-Í4 vector de nudo, 456 Búfer: A, algoritmo, 553-4 auxiliar, 151-2 color, 39, 150-1 (véase también Búfer de refresco) derecho, 150-1 de profundidad, 150-1, 549 de refresco, 39 frontal, 150-1, 772 izquierdo, 150-1 luminoso (trazado de rayos), 628-30 patrón, 150-1, 187 trasero, 150-1, 772 z (búfer de profundidad), 549 Búfer de imagen. 39, 86 cálculos de dirección, 102-3 comando getPixcl, 87 comando setPixel, 87 operaciones de barrido, 38-41 planos de bits, 40
870
índice
Búfer de imagen,
38. 86 {com.)
profundidad, 40 resolución. 39
Cañón de electrones, 36
(véase tam-
bién Tubo de rayos catódicos) Cara frontal (polígono), 137-8
labia de búsqueda, 181-2, 604
Cara posterior (polígono). 137-8
transferencias de bloques de bits,
Caracola, 165-68
265
Carácter
c
altura, 217
Cabeceras (archivos de imagen), 791
caché de fuentes, 153-4
C A P (computer-aided design), 5
color, 220
(.'ADD (computer-aided drafting and
con kern, 217
atributos, 217-20
design), 5
cuadricula, 53, 153
Centroide (polígono), 836-7 CG API (computer-graphics application programming interface), 70 C(iM (computer-graphics metafile), 803 C I K (International Commission on Illumination), 739 Cierre de superficie (radiosidad), 640-1 Cilindricas, coordenadas. 812-3, 820-1 Cinemática, 761,768-9, 770-1
Caja de botones, 58, 59
cuerpo, 217
Cálculos de masa (CSG), 488-9
espaciado proporcional, 153, 217
Cálculos de volumen (CSG). 488-9
fuente, 153
de confusión, 632
C A M (computer-aided manufac-
fuente de caracteres, 153
ecuaciones, 104-6
rúente de mapa de bits, 53, 153
propiedades, 104
turing), 7-9 Cámara:
fuente de trazo, 153
{véase también Animación) Círculo:
simetría, lo4
círculo de confusión, 632
fuente digitalizada, 153
CM Y, modelo de color, 745-7
ecuación de la lente fina, 631
fuentes de contorno, 153
C M Y K , modelo de color, 746
efectos de enfoque, 630-2
legible, 153
Codificación aritmética, 798-9
efectos de objetivo, 634-5
línea base, 217
Codificación de longitud de recorri-
modelo de visualization, 355-6,
linea inferior. 217
360-1
línea superior, 217
do, 54, 794 Codificación mediante coseno dis-
número f, 63 I
linea tope, 217
parámetros (modelo de ilumina-
monoespaciado, 153
Código de salida, 324
pol¡marcador, 153 4
Códigos (trazado de rayos), 634-5
precisión del texto, 220
Códigos de región (recorte):
ción), 602 profundidad de campo, 632
creto, 799-801
primitivas, 153-4
bidimensional, 324
bidimensional, 242 4, 246
recorte, 347-8
tridimensional. 402 3
composición, 248
sans-serif, 153
diferencial, 242
serif, 153
reflexión ambiente, 587
direcciones generales de camhio
símbolo marcador, 153-4
reflexión difusa, 584-5
tamaño en puntos. 217
reflexión especular, 588-9, 590-1
Cambio de escala:
de escala, 250-1 factores, 242, 284-5
trazo descendente, 217
inverso, 246-7, 287
vector vertical, 218
métodos de barrido, 265 no uniforme (diferencial), 242 parámetros (factores), 242, 284 5 posición fija, 242, 284-5 representación matricial. 246,
Características psicológicas del color, 737 Caras poligonales de adición de detalle, 650
Coeficiente:
transparencia, 600 Coeficientes binomiales, 445-6 Cohen-Sutherland, recorte de lineas de, 324-9 Color:
(véase también Luz; Fuentes
luminosas)
Cardioide, 165-68
brillo, 737
Cartesianas, coordenadas, 809, 811
características psicológicas, 737
tridimensional. 284 7
CAVE, I 6,688
codificación (visualización de
uniforme, 242
Celda:
284-5
Cambio del centro de atención (animación), 760 C a m p o de gravedad, 698 9 Candela (fuente luminosa estándar), 739-40
datos), 529
codificación, 54
complementario, 738
recorrido (trazado de rayos),
conceptos intuitivos, 738-9
627-8
consideraciones de selección, 751
Cels. 761
cromaticidad, 737
Centro de proyección, 380
espectral, 735 6, 740-1
Indice espectro (c l éptromagnét i co), 735 6 gama, 738 iluminante C, 740
Continuidad de orden cero:
mezcla. 78-79, 185-6
esféricas, 813, 821
paramétrica, 434
homogéneas. 89, 245
geométrica, 435 paramétrica, 434
modelos de iluminación, 594 6
ejes, 812-3
geométrica, 434-5
Continuidad de primer orden:
luminaneia, 596-7, 740, 744
Continuidad de segundo orden
locales (maneado de imagen), 658-9 locales (modelado), 71, 784-5 maestras, 71
percepción, 737
geométrica, 435
modelado. 71-72, 785
primario, 738
paramétrica, 434
normalizadas, 71-72
pureza, 737, 742
Continuidad paramétrica (spline), 434
ortogonales, 812-3
puro, 737. 739
Contorno:
polares, 788-89, 813^1
real, sisiema, 44
rectángulo, 86
posición actual. 87
saturación, 737
recuadro, 86
proyección normalizada, 361,
sombras, 734
volumen, 626
tintas. 739
Contorno (borde de intensidad),
tonalidades, 739
605-7
tono, 737 Columna: número, 86 vector (matriz), 82!-2 G'ommission Internationale de rÉclairage(CIE), 739
líquido, 45-46 Compresión con pérdidas, 794
370-2. 379, 392-5 regla de la m a n o derecha, 71,811 regia de la mano izquierda, 812-3
Contornos de línea, 530-2
relativas, 87
Contracción (tensor), 536
selección, 692
Control:
transformación, 267-9, 291-2
grato, 433
universales, 71-72
icono, 724-5
visualización, 71-72
operaciones, 73
Componentes nemáticos de cristal
Coordenadas de visualización:
polígono, 433
tridimensionales, 307, 308, 809
punto (spline), 432
regla de la mano derecha, 812-3
rejilla (TRC), 37
tridimensionales, 355-6, 811
superficie (terreno fracial), 506-7
uvn, 363-4
de archivos, técnicas, 793-801
Control local (spline), 454-5, 456
Copo de nieve (fracial), 496-7
sin pérdidas, 794
Controlado por objetivos, movi-
Corrección gamma, 604-5
y expansión (animación), 759 Computadora cliente, 69
miento, 768 Controlador
Concatenación (matriz), 247
de vídeo, 50-53
Condiciones de continuidad (spline):
gráfico, 53 Convexo:
geométrica, 434-5
ángulo, 131-2
paramétrica, 434 Condiciones de contomo
(spline),
435, 438,441-2 Conjugado (número complejo), 826 Conjunto de (Vacíales invariantes,
Cono: de visión (visualización en perspectiva), 383
Coordenadas:
Constante de amortiguamiento, 768 Constante de tuerza. 526-7
Cox-delioor, fórmulas de recursión, 456
bién Geometría sólida constructiva) Cuadrícula:
cartesianas, 51, 71-72, 809, 811
carácter, 53, 153
cilindricas, 812-3. 820 1
en construcción interactiva de
curvilíneas, 812-3
de pantalla, 71, 86-87, 395, 809,
Trazado de rayos)
polígonos), 214
( S( i, métodos. 486-9 (véase tam-
polígono, 129, 206
hexagonal (IISV), 747
(véase también
Costura (huecos en las aristas de los
Cramer, regla de, 839
de dispositivo. 71
trazado, 633
Cosenos directores, 815
división de polígonos, 131-2
filtro, 225-6
receptores, 742
Correspondencia de lenguaje, 74
armazón, 432, 457-8
absolutas, 87
494
871
812
imágenes, 696 Cuaternio, 827-8 construcciones Iractales, 519 inverso, 827-8
de superficie, 812-3
módulo, 827-8
de textura. 650
multiplicación. 827-8
de un píxel (cuadricula de panta-
multiplicación por un escalar,
lla), 86-87, 124-5
827-8
872
índice
Cuaternio, 827-8 (cont.) parte escalar, 827-8 parte vectorial, 827-8 representación mediante par ordenado, 827-8 rotaciones, 280-4 suma, 827-8 términos imaginarios, 826-7 Cubo unitario (volumen de visualización), 370-2, 378-9, 392-5 Cuerpo: no rígido, 526-9 personaje. 217 Cuerpo rígido: grados de libertad, 760-1 transformación, 238-9, 241, 253 4 Cursor de mano (digitali/ador), 62 Curva: algoritmos paralelos, 124 aproximación mediante líneas rectas, 121 atributos, 193-5 B-spiine, 454-64 caracola, 165-68 cardioide, 165-68 circulo, 104-11, 120-3 consideraciones de simetría, 104, 113,121 construcción por tramos, 123, 432, 435 cuatro hojas, 165-68 de ajuste, 437 de respuesta del monitor, 604-5 elipse, 111-20, 120-3 espiral, 165-68 fraetal, 492-3, 497-9, 507-21 hipérbola, 121-2 Koch( fraetal), 497-8 parábola, 121-2 polinómica, 123 {véase también Curva spline) recorte, 346 representaciones paramélricas. 121, 123 secciones cónicas, 120-3 supercuádrica, 422-4 tres hojas, 165-68 Curva spline, 123,431-69
aproximación, 432 armazón convexo, 432, 457-8 Beta-¿/j//>/í\ 465-7
Bézier, 445-54 B-spiine, 454-64 cardinal, 441-4 Catmull-Rom, 441-2 condiciones de continuidad, 434 condiciones de contorno, 435 continuidad geométrica, 434-5 continuidad paramétrica, 434 control local, 454-5, 456 conversiones, 469-70 de visualization, 470-4 funciones base, 435, 436 funciones de mezcla, 435. 436 graft) de control, 433 hermítica, 438-41 interpolación, 432 interpolación cúbica, 437-44 Kochanek-Bartels, 444 matriz base, 436 natural, 438 NURB, 467 Overhauser, 441-2 parámetro de continuidad, 444-5 parámetro de desplazamiento. 444-5, 454. 466 parámetro de tensión, 444-5 polígono característico, 433 polígono de control, 433 puntos de control. 432 racional, 467 9 representación matricial, 435 vector de nudo, 456 Curvas cuádricas, 420-2 Curvilíneas, coordenadas, 812-3 Cyrus-Beck, recorte de lineas de, 330
D B&tbs de entrada gráfica, 6X9 Datos en bruto, 791 DDA, algoritmo de lineas, 94-95 Deflexión: (véase también Tubo de rayos catódicos) bobinas, 36, 37 corriente, 37 magnética (TRO, 37
placas, 37, 38 Del, 830 al cuadrado, 832 Delta-delta, IRC de máscara de sombra, 42 Dentado, 92 (véase también Antialiasing) Derivada parcial. 829-30 Descarga de gas, pantallas, 44 Descomposición LU, 840 Desenfoque de movimiento, 635-7 Despiece, 359 Desplazamiento del punto medio (fraetal), 504 6 Detalles de superficies, 647-59 caras poligonales, 650 mapcado de entorno, 646 mapeado de relieve, 656 8 mapeado de texturas, 650-6 mapcado del sistema de referencia, 658 9 texturado proccdimental, 655-6 Detección de líneas visibles, 566-8 (véase también Variación de la intensidad con la profundidad) Detección de superficies visibles, 358, 547-68 algoritmo del pintor (ordenación de profundidad), 556 clasificación de algoritmos, 547-8 comparación de algoritmos, 564-5 eliminación de caras ocultas. 548-9 gráficas de contomo de superficie, 566 método de líneas de barrido. 554-6 método de ordenación de la profundidad, 556-8 método de proyección de rayos. 563^1 método de subdivisión del área. 559-62 método del árbol BSP, 559-60 método del búfer A, 553-4 método del búfer de profundidad. 549-52 método del espacio de imagen, 547 métodos alámbricos, 566-8
índice métodos de árbol octal, 492, 562-3 métodos del espacio de objetos, 547
Diodo emisor de luz (LED), 44
derivada, 831
Ecuación de una lente fina, 631
fuente luminosa, 580
Ecuación punto-pendiente de una
Dispositivo, coordenadas de, 71
variación de la intensidad con la
Dispositivos de entrada:
profundidad, 567-8
falsa posición, 842 Determinación de raices por bisección, 841 Determinante, 823-4 Diagrama cromático, 740-1 colores complementarios, 741
E
Direccional:
superficies curvas, 565-6
Determinación de raices mediante
873
línea, 92-93 Ecuaciones diferenciales
caja de botones, 58, 59
ordinarias, 844-5
clasificación lógica, 689-94
parciales, 845-6
conmutadores, 58 de trazo, 690 diales, 58, 59 digitalizador, 62-64 digitalizadores sónicos tridimensionales, 63
Educación y formación, aplicaciones, 19-23 Efectos atmosféricos (modelo de iluminación), 601 Efectos de ampliación o reducción, 306
gamas de colores, 741
dispositivo de cadena, 690
iluminante C, 740
dispositivo de elección, 690-2
cie, 583-4 (véase también Modelo
linea púrpura, 740
dispositivo de selección, 690,
de iluminación)
longitud de onda dominante, 741-2 pureza, 742 Diagramas de contorno, 530 2
692-4 dispositivo de trazo, 690 dispositivo evaluador, 690-1 dispositivo localizador, 690
Efectos de iluminación de superfi-
Efectos de pantalla dividida, 313, 320-2 Efectos globales de iluminación, 583-4,618-619, 638 44
Diagrama de tiempos, 5
cleciroguante, 61
Efectos panorámicos. 306
Dibujo de gráficas, 3-5, 160-65
escáner, 64
Ejes:
(véase también Gráfica)
joystick, 61
inclinación, 263-4, 290-1
Diferencias finitas, 845 6
lápiz óptico, 66
principales, 369, 383
Diferencias hacia adelante, 471-2
lógicos, 689-94
reflexión, 260, 290
Difusa:
panel táctil, 64-66
coeficiente de reflexión, 584-96
ratón Z, 60
reflexión, 583-8
ratón, 59-60
transmisión, 598
sistemas de voz. 67
Digitalización, 53-54, 86
spacebail, 60-61
Digital i/ador. 62-64
tableta gráfica, 61-63
acústico, 63 cursor de mano, 62-63
teclado, 58
irackbaü, 60-61
electromagnético, 63
Dispositivos de impresión, 67-69
pluma, 61-63
Distancia:
rotación, 240 Klcctroguante, 61-62
(véase tam-
bién Realidad virtual) Electromagnético: espectro, 735-6 radiación, 182, 735 Electrostático: deflexión (TRC), 37, 38 enfoque (TRC). 37 impresora, 67-68
precisión, 63
punto a linea. 692-4
Elemento de imagen (píxel), 39
resolución, 63
trayectoria de trazado de rayos.
Elemento de volumen, 491
sónico, 63 tridimensional, 63 Dimensión, 818-9 de similaridad (fractal), 495-6 euelídea. 492-3, 4 % fraccional, 492-3, 495-6 fractal, 492-3, 494-7 recuadro, 495-6 topológica, 495-6 Dinámica, 768 -9 (véase también Animación)
622-3 Divergencia: operador, 832 teorema, 835 División de polígonos cóncavos
Eliminación de caras posteriores, 548-9 Elipse: algoritmo del punto medio, 113-20
método vectorial, 130-1
ángulo de excentricidad, 113
métodos rotaciones, 130-1
ecuaciones, 11143, 121-2
División de polígonos convexos, 131-2 Doble búfer, 52-53, 756-7 Doble refracción. 598
propiedades, 111-20 punto de enfoque, 111-12 simetría, 113 Elipsoide, 420-1
874
índice
Energía; del Ibión. 638
Factor de rellectividad (radiosidad), 640-1
distribución (fuente luminosa), 737
Factores de forma (radiosidad), 640-1
función (modelado de tejidos), 528
Fakespaee Pinch, electroguantes, 50
niveles cuánticos, 37
Filamento ( T R O , 36
radiante, 638-9
Filtro:
[véase también Antialiasing)
Entrelazado de líneas de barrido, 40
cono, 225-6
Errores de redondeo y de aproxima-
función, 224
ción (animación), 252-3, 772 Escala de grises, 182 Escala diferencial, 242 Escaneado (patrones de textura), 652 Hscáner de imágenes, 64
Esfera: cálculos de intersección con rayos, 623-5 ecuaciones, 420, 829-30 Esféricas, coordenadas, 813-4, 821 Espacio riemaniano, 820-1 Especificación de movimiento, 767 Espectro de frecuencias (electromagnético), 735-6
métodos fractales. 795 P C X , 805 PICT, 804 PNCi, 803-4 reducción de color de corte medio, 793 reducción de color por popularidad, 792-3 reducción de color uniforme, 792
gausiano, 225-6
representación geométrica, 792
recuadro, 225-6
SPIFF, 802-3
Físico: animaciones, 761, 768-9 modelado, 526-9
larga, 805 técnicas de compresión de archivos, 793-801
Fluctuación, 634 5
T G A , 805
Focos, 580
TIFF, 803
Forma funcional
transformación de coseno inverso,
explícita, 828-9
799-800
implícita, 828-9
X B M , 804
Forma polar (número complejo), 826-7 Formatos de archivo gráfico: Adobe Photoshop, 804
X P M , 804 Formatos híbridos. 792 Fósforo, 36 Fotograma:
Espejo vari focal, 47
algoritmo de diccionario, 795
animación, 755
Espejo vibratorio, 47
algoritmo de sustitución, 795
área de pantalla, 39
Espiral, 165-68
archivo de barrido, 791
Estación de trabajo gráfica, 54-58
archivo de barrido en bruto, 791
Fotogramas clave (animación), 758
Estado:
big endian, 791
Fotogramas intermedios (anima-
velocidad, 756-7
máquina, 179
B M P , 805
parámetros, 180
cabecera, 791
Fotón, 37, 638-9
sistema, 179
C G M , 803
Fractal:
variables, 180
codificación aritmética, 798-9
autoafines, 494
Estándares software, 73-74
codificación Hulfman, 795-8
auto-elevación al cuadrado, 494,
Estercoradian, 814
codificación L Z W , 794-5
Estilos de relleno, 199-200
codificación por coseno discreto,
Estructura (subsección de imagen), 156
799-801 codificación por longitud de reco-
Euclídea:
rrido, 794
ción), 758
507-21 auto-inversos, 494, 521 auto-similares, 494, 497-9 características, 492-3 características de auto-similari-
dimensión, 492-3,496
compresión con pérdidas, 794
métodos geométricos, 492
compresión sin pérdidas, 794
características del terreno, 505-7
configuraciones, 791-2
clasificación, 494
datos en bruto, 791
conjunto de Julia, 508
formato híbrido, 792
conjunto de Mandelbrot, 513-9
Euler: fórmula, 826- 7
(véase también
Número complejo) método (resolución de ecuaciones diferenciales), 844 Extensión de coordenadas. 86
GIF, 805
conjunto invariante, 494
JF1F, 802-3
construcciones afines, 501-4
JPEG, 801-3
construcciones geométricas,
hule endian, 79]
F Factor de opacidad, 600
dad, 492-3
497-501
MacPaint, 804
copo de nieve, 496-7
metaarchivo, 792
curva de Koch, 496-7
frutice curva de Peano, 496 9
atenuación angular de la intensi-
desplazamiento del punto medio,
dad, 581-3
504-6
579-80
dimensión de Hausdorfl-
429-31 ("unción de filtro, 225-6
brillo, 737
Besicovitch, 495-6
eliminación, 839 función de densidad (relieve),
atenuación radial de la intensidad,
dimensión, 492-7
teorema, 834-5
candela, 740
Ciauss-Seidel. método, 840
dimensión de recuadro, 495-6
compleja, 582-3, 635
Generación de sptines:
dimensión de similaridad, 495-6
direccional, 580
dimensión fraceional, 492-3,
distribución de energía, 737
495 6
875
método de diferencias finitas. 471-2
energía radiante, 638 9
método de I lomer, 470-1
espacio de Peano, 498-9
flujo radiante. 638-9
métodos de subdivisión, 472-4
estadísticamente auto-similar, 494.
foco, 580
Generador (fracial), 496-7
frecuencia dominante, 737
Generador de congruencia lineal,
499 501 generador, 496-7
infinitamente distante, 579
843-4
iniciador, 496-7
intensidad, 182, 638 9
métodos de desplazamiento alea-
longitud de onda dominante, 737
torio del punto medio, 500,
luminancia, 183, 596-7. 740, 744
Geometría de objetos, 125-7
504 6
parámetros de pantalla, 582-3
Geometría sólida constructiva
Generador de números aleatorios, 843-4
métodos de inversión, 519 21
potencia radiante, 638-9
(CSG), 486-9
métodos de recubrimiento de
puntual, 578
cálculos de masa, 488-9
recuadros, 495-6 métodos de recubrimiento topològici). 496 métodos de subdivisión, 494-6 movimiento browniano, 501-4
cálculos de volumen, 488-9 métodos de árbol octal, 492
vector de dirección, 586-7
métodos de proyección de rayos,
Warn, modelo de. 582-3
486-9
Función de densidad (objeto sin
movimienlo browniano fraceional. |0l-4
radiancia espectral, 638-9 radiosidad, 638 9, 640-1
Corma), 429-31 Función de perturbación (mapcado
procedimientos de generación, 494 representación mediante cuaternios. 519
de relieve). 656 Funciones base, 435 (véase
primitivas, 85 (véase también
también
Funciones de mezcla)
frecuencia dominante, 737
Funciones de ajuste de color. 738
Fresnel, leyes de la refracción, 588
I-unciones de atenuación (luz). 579-80, 581-3
Fnistum, 384 5, 386-92
ftp (file-transfer protocol), 70 Fuente, 153
realimentación de eco, 695
(véase también Tipo de
letra >
retrollamada, 81, 695 Funciones de mezcla
Primitivas de salida gráfica) reglas de producción, 521-4 representaciones (archivos de imagen). 792 tablas (polígono), 135-6
Funciones de entrada, 73, 694-5
f-stop, 631
continuidad (spline), 434-5 modelo, 779
Función de relieve. 656
superficies de control, 506-7
plano de partida, 488 Geométrico:
[spline), 435
transformaciones, 73. 237 (véase
también
Transformaciones)
(icstor de ventana, 32 gctPixel, procedimiento, 87
caché, 150-1
Bézier, 445-6
GIFF, 805
de barrido, 153
Q-spline, 456, 461
G K S (Graphical Kemcl System), 73
de contorno. 1 53
cardinal, 443
GL (Graphics Library), 73
de trazos, 153
hermítica, 440
Glifo, 536
legible. 153
Funciones de retrollamada, 81, 695
mapa de bits, 53, 153
Funciones diferenciales, 844-5
monoespaciada, 153 proporcional. 153, 217
G
función de dirección de visualización, 396-7 función de ventana de recorte
sans-serif, 153
G a m a (color), 738
scrif, 153
Gauss:
Fuente luminosa, 578-83
G L U (OpenGL Utility), 75
distribución, 38
bidimensional, 78-79 función de ventana de selección, 712-3
876
índice (eont.)
G L U (OpenGL Ulility)
funciones de ajuste, 484—5 funciones de curvas
íl-spiine,
(iradientc (grad), operador. 830-1 Grados de libertad, 760-1
Hercio, 40
Gráfica:
Hipérbola, 121-2
480-2
de barras. 3-5. 162-163
funciones de superficie B-spline, 482-4 funciones para superficies cuádricas, 425-8 ventana de visualización, 78-79
de liempos, 5 tridimensional, 3-5
llorner. método de faetorización de
(véase también Gráfica) Gráficos empresariales, 12, 529
(véase también Visualización de
la ventana de visualización, 158-61,317
Homogéneas, coordenadas, 89, 245 Hooke, ley de, 526-7
Gráficas y diagramas, 3 5, 160-65
función de cambio de tamaño de
datos)
explorador Mosaic, 70
717-9
H T M L (hypertext markup langua-
función de cajas de botones, 711
http (hypertext transfer protocol),
318-9
Netscape Navigator, 70
ra), 425
protocolo de transferencia de
función de tetera, 425
Huffman, codificación, 795-8 Hypertext Markup Language
I Iconos, 33
de comando, 724-5 Iluminante C, 740
70
función de superficie cúbica (tete-
HSV, modelo de color, 747-8
de aplicación, 724-5
ge), 70
función de cursor de pantalla,
polinomios, 470-1
H S B , modelo de color (véase H S V )
( H T M L ) , 70
Gráficos por Internet:
función de creación de menús.
HLS, modelo de color, 750-1
de sectores, 3-5, 163
Gráficas de contomo superficial, 566
G L U T (OpenGL Uliliry Toolkil). 76 creación de submenús, 7 2 0 3
tamaño de punto, 38
archivos (ftp), 70
Imágenes de tono continuo, 605-6
(véase también Semitono) Impresoras, 67-68
función inactiva, 319, 772
sitio ftp, 70
de chorro de tinta, 67
funciones de atributo de carácter,
TCP/IP, 69-70
ile impacto, f>7
U R L (uniform resource locator),
de matriz de puntos, 67
220 funciones de caracteres. 155 funciones de consulta, 316-7, 320, 720-1
de no impacto, 67
69-70 World Wide Web, 69
electrotérmica, 68 Inclinación
Graftal, 524
funciones de dial, 711
Gramática L, 524
en la dirección x, 263-4
funciones de modificación de
Gramáticas de formas, 521-4
en la dirección y, 264
Graphical Kernel System (GKS), 73
en la dirección z, 290-1
menús, 723-4 funciones de ratón. 700-5, 705-9
(ireen:
índice de refracción, 598
ecuaciones de transformación, 835
Iniciador (fractal), 496-7
funciones de tableta, 710
identidades, 835
Instancia, 779
funciones de teclado, 705-9
teorema en el espacio, 835
funciones de spaceball, 710
funciones para poliedros regulares, 416-9 funciones para superficies cuádricas, 424-5 gestión de múltiples menús, 720 gestión de ventanas de visualización. 76-78, 78-79, 158-61, 315-20 menú actual. 720 (il.X (extensión O p e n G L al sistema X window), 75 Gouraud, representación superficial, 614-7 Grad al cuadrado. 832
teorema en el plano, 833-4 (iuión (animación), 757
(véase también
Modelado) Intensidad, 182, 638-9, 639-40
(véase también Modelos de iluminación; Radiosidad)
H
atenuación angular, 581-3 atenuación radial, 579-80
parámetro, 89 I lausdorff-Besicovitch, dimensión,
Haz de electrones:
corrección gamma, 604-5 haz de electrones (TRC), 37
495-6
(véase también
Tubo de rayos catódicos)
interpolación (representación de Gouraud), 614-7
convergencia, 37
matriz (mapeado de entorno), 646
deflexión electrostática, 37, 38
niveles (sistema), 603
deflexión magnética, 36, 37
Interfaz gráfica de usuario:
enfoque, 37
coherencia, 726
intensidad, 37
componentes, 724-7
índice diálogo con el usuario, 724
Lambert, ley del coseno, 583-4
banda de frecuencias. 735
diseño, 724-7
Lápiz (digitalizador), 61
blanca, 736, 737
facilidades de ayuda, 725-6
Lápiz óptico, 66
brillo, 737
iconos, 724-5
L C D (pantalla de cristal líquido),
color espectral, 735
menús, 724-5
45-47
cromaticidad, 737
minimi/.aeión de la memoriza-
de matriz activa, 46-47
diagrama cromático, 740-1
de matriz pasiva, 47
de fondo (ambiente), 583-4
ción, 726
877
modelo del usuario, 724
L E D (diodo emisor de luz), 46
espectro electromagnético, 735-6
múltiples niveles de experiencia.
Liang-Barsky, recorte:
frecuencia, 38, 735
725-6 realimenlación, 726-7 tratamiento de errores, 726 ventanas, 724-5 Interfa/ I B M OS/2 para O p e n G L (P(iL), 75 Interfaz Windows para O p e n G L ( W G L ) , 75 International Standards Organi/ation
luminancia, 183, 596-7, 740, 744
Línea: antialiasing, 221-5
período, 735
atributos, 188-92
propiedades, 735-7
ecuación punto-pendiente, 92-93
pureza, 737
ecuaciones, 93
tono, 737
extremos, 189
velocidad, 736
opciones de pincel y pluma. 191-2 representación paramétrica, 323,
barrido (mapeado de textura), 652 cinemática, 768-9, 770-1
longitud de onda, 735
polígonos, 345
(ISO), 73, 74, 803 Inversa:
330,380-1
L Z W , codificación, 794-5
M MacPaint, formato, 804
variaciones de intensidad, 225-6
cuaternio. 827-8
Línea base (carácter), 217
dinámica, 768-9
Línea de barrido, 39
matriz, 824
iluminante C, 740
líneas bidimensionales, 330-3
Maestras, coordenadas, 71, 785 Malla (polígono), 129, 141-5,416 cuadrilátera, 143-5,416
entrelazado, 40
triangular, 141-3, 416
transformación coseno. 799-800
Línea digilalizada en escalera, 92
Mandelbrot, conjunto, 513-9
transformaciones geométricas, 246
Linca escalonada, 92
Mapeado
ISO (International Standards Organization). 73, 74, 803 Isolfneas, 530-2
Línea inferior (carácter), 217
de entorno, 646
Linea púrpura (en diagrama cromáti-
de fotones, 646-7
co), 740
de patrones, 650
(véase también
Isosuperfícies, 530-2
Línea superior (carácter), 217
J
Lincas de campo, 534
de reflexión, 646
Lineas de (lujo, 534
de relieve, 656-8
JFIF, 802-3
Líneas punteadas, generación, 190-1
del sistema de referencia, 658-9
Joystick:
Lista de aristas:
ventana a visor, 306, 310-3
isomélrico, 61
activas, 205-6
móvil, 61
en tablas de polígonos, 135-6
sensible a la presión (isomélrico),
ordenadas. 204-5
61
Mapeado de texturas)
Mapeado de texturas: barrido en orden de imagen, 652-3
Little endian, 791
barrido en orden de pixel, 652-3
JPEG, 801-3
Locales, coordenadas, 71, 784-5
barrido inverso, 652-3
Julia, conjunto, 508
Longitud de onda (luz), 735
bidimensional (superficie), 651-5
K
LLJ, descomposición, 840
coordenada r, 654-5
Luminancia, 183, 596-7, 740, 744
coordenada .v, 650-1, 654-5
Koch, curva (copo de nieve fraetal), 496-7 Kochanek-Hartéis, spline, 444
L Lado (polígono), 128
Luz:
(véase también Color;
Modelos
coordenada /, 651, 654-5
de iluminación; Representación de
coordenadas, 650-1
superficies)
espacio, 650-1
ambiente (fondo), 584
bién
(véase tam-
Modelos de iluminación)
ángulo de incidencia, 585-6
funciones, 650-1 matriz, 650-1,651,654-5 mip maps, 655
tndiá
878
Mapeado de texturas: ( c o n / . ) patrones de reducción, 655
Método vectorial (división de polígonos), 130-1
método de Gauss-Seidel, 840 método de la falsa posición, 842
proeedimental, 655-6
Métodos de banda elástica, 696
método de Newton-Raphson. 841
sólido, 654-5
Métodos de compresión (archivos de
métodos de Monte (.'arlo, 843
tcxel, 650-1 tridimensional (volumen), 654-5 unidimensional (lineal), 650-1
imagen), 793-801 Métodos de desplazamiento aleatorio del punto medio, 504-6
problemas de valor de contorno, 844 problemas de valor inicial, 844
Marcador (carácter), 153 4
Métodos de dibujo, 695-9
regla de C'ramer, 839
Máscara, 148, 199
Métodos de división de polígonos
regla de Simpson, 842
de pixeles, 148 de ponderación del píxel, 223 de sombra. 42-43 Material
rotacional, 130 I Métodos de partieionamiento del espacio (trazado de rayos): adaptativo, 627
elástico (objeto no rígido), 526-9
búfer de luz, 628-30
opaco, 597
haces de rayos, 628 30, 631
transparente, 597
uniforme, 627
traslúcido, 597 Matriz, 821-4
Métodos de posicioiíamiento (interactivos), 695
regla del trapezoide. 842 sistemas de ecuaciones lineales, 839-40 Mínimos cuadrados, ajuste de datos. 846-7 Mip m a p (patrón de reducción de texturas), 655 Modelado: conceptos básicos, 779-82
alealorización, 611
Métodos de pseudocolor, 529
coordenadas. 71, 784 5
base ( s p l i n e ) , 436
Métodos de subdivisión:
coordenadas locales, 784 5
Bézier, 453
árbol BSP. 4 »2, 559-60
coordenadas maestras, 785
ñ-spline,
461
l
árbol octal, 489-92. 562-3
de módulos, 781
cambio de escala, 246, 284-5
generación de fractalcs, 494-6
físico, 526-9
caracterización de s p l i n e s (base),
generación de s p l i n e s , 472-4
geométrico, 779-80
trazado de rayos adaptativo,
instancia, 779
436 cardinal, 441 2 columna, 821-2 concatenación, 251-2, 823 cuadrada, 821-2 de entorno. 646 determinante. 823-4 de vértices (OpenGL), 146 7 fila, 821 2 hermítica, 439 40
632-3 trazado de rayos uniforme, 627 Métodos del espacio de imagen (detección de visibilidad), 547 Métodos interactivos de entrada. 689-94 Métodos numéricos: ajuste de dalos por mínimos cuadrados, 846-7
identidad, 824
algoritmo de Runge-Kutta, 844
inclinación, 263-4, 290-1
descomposición LlI, 840
inversa, 824
determinación de raíz, 841-2
multiplicación escalar, 822 3
diferencias finitas, 845-6
multiplicación, 823
ecuaciones diferenciales ordina-
no singular. 824 reflexión, 260-2, 290 rotación, 246, 272-4, 279-80, 281-2
rias, 844-5 ecuaciones diferenciales parciales, 845-6
jerarquías de símbolos, 781-2 jerárquico, 237, 784-7 paquetes, 782-4 representaciones, 779-81 símbolos, 779 tejidos, 528 transformaciones, 71 -72, 237, 785-7 Modelado sólido: geometría sólida constructiva. 486-9 representaciones de barrido, 485-6 Modelo básico de iluminación. 586-97 Modelo de color, 738 aditivo, 740, 743
ecuaciones no lineales, 841-2
C M Y , 745-7
singular. 824
eliminación gausiana, 839
C M Y K . 746
suma, 822
evaluaciones de integral, 842-3
conversión H S V - R G B . 749-50
transposición, 823
generador de números aleatorios,
conversión R G B - C M Y , 746
traslación, 245-6, 270
843 4
conversión R G B - Y I Q , 745
Menús, 717-24
método de bisección, 841
diagrama cromático, 740-1
Metaarchivo, 792
método de Euler. 844
funciones de ajuste de color, 738
Ìndice HLS, 750-1 HSB (igual que HSV) USV, 747-8 primarios, 738 primarios CIÉ estándar, 739-40 primarios CIÉ, 739-40 RGB, 42-44, 180-1,742-4 sustractivo (CMY), 745-7 teoría de los tres estímulos de la visión, 742 valores de cromatieidad, 740 valores XYZ normalizados, 740 XYZ, 739 40 YC C ,145 YIQ, 745 YUV, 745 Modelo de metabolas, 430-1 Modelo de objetos suaves, 430 I Modelos de iluminación, 577 ángulo de incidencia, 585-6 ángulo de reflexión especular, 588 ángulo de refracción, 598 atenuación angular de la intensidad, 581-3 atenuación radial de la intensidad, 579-80 r
h
coelleientes de reflexión. 585-88 coeficiente de reflexión ambiente, 586-7 coeficiente de reflexión difusa. 584-88 coeficiente de reflexión especular, 588-9 coeficiente de transparencia, 600 componentes de iluminación RGB, 594-6 consideraciones de color, 594-6 efectos atmosféricos, 601 efectos de iluminación de superficie, 583-4 efectos de refracción, 598-9 emisiones superficiales, 592-3 exponente de reflexión especular, 588-9 factor de opacidad, 600 focos, 580 Fresnel, leyes de la reflexión, 588-9 fuentes luminosas, 578-83
índice de refracción, 598 Lamben, ley del coseno, 585 ley de Snell, 598 luminancia, 596-7 luz ambiente (de fondo), 584-5 luz de fondo, 583^t material opaco, 597 material traslúcido, 597 modelo básico, 563-97 modelo de Phong, 588-93 múltiples fuentes luminosas, 592 parámetros de cámara, 602 radiosidad. 638-45 reflector ideal difuso, 585 reflector lambertiano, 585 reflexión difusa, 583-4, 584-8 reflexión especular, 583-4, 588-92 reflexiones combinadas difusaespecular, 592 sombras, 601-2 transmisión difusa, 598 transparencia, 597, 600 vector de la fuente luminosa, 586-7 vector de reflexión especular. 588 vector de transmisión, 599-600 vector del observador, 588 vector del punto medio, 590-2 Warn, fuente luminosa, 582-3 Modos de entrada, 694-5 por mueslreo, 694 por solicitud, 694 Módulo, 781 Módulo (complejo), 826 Monitor, 35 (véase también Monitor de vídeo) Monitor compuesto, 43 Monitor de vídeo, 35-58 (véase también Tubo de rayos catódicos) alta definición, 38 barrido, 38-41 barrido aleatorio, 41-42 caligráfico, 41 color completo, 44 color real, 44 compuesto, 44 descarga de gas, 44 diseño de un TRC, 3 5 ^ 1
879
electro!uminisecnte, 44-46 clectroluminiscenle de película fina, 44 emisivo, 44 estaciones de trabajo, 54 estereoscópico, 47-50 LCD (pantalla de cristal líquido), 45-46 LED (diodo emisor de luz), 44 45 matriz activa, 46-47 matriz pasiva, 47 multi-panel, 54-58 no emisivo, 44 pantalla de plasma, 44, 45 pantalla de gran tamaño, 54-58 pantalla plana. 44-47 resolución, 38 RGB, 42-44 servidor gráfico, 69 TRC color, 42-44 TRC de almacenamiento, 36 TRC de refresco, 36-41 tridimensional, 47 vectorial, 41 Monitor en color: (véase también Monitor de vídeo) compuesto, 44 delta-delta, 44 en línea, 43 máscara de sombra, 42-44 penetración de haz, 42 RGB, 42-44 sistema de color completo, 44 sistema de color real, 44 Monitores gráficos, 35 58 {véase también Monitor de vídeo) Monte Cario, métodos, 843 Morfismo, 27-28, 31, 762-4 Mosaico de superficies, 199-200 Movimiento browniano, 501-3 fracciona!, 501-4 Movimiento rígido, 253-4 Movimientos de animación periódicos, 771-2 Muelle: constante, 526-7 red (cuerpo no rígido), 526-7 Muestreo: (véase también Antíaliasing)
880
índice
Mucstrco
(cont.)
imaginario puro, 825
búfer de refresco predeterminado,
adaptativo, 632
longitud de un vector, 826
de área, 221.224, 632
módulo, 826
150-1
de lincas, 93, 220-3
operaciones aritméticas, 825, 826
búfer de selección, 711
de un segmento de línea, 93,
parte imaginaria, 824
búfer derecho, 150-1
búfer de refresco, 78 79
parte real, 824
búfer frontal, 150-1
estocástico, 634-5
raíces, 827
búfer izquierdo, 150-1
frecuencia de Nyquist, 221
representación mediante par
búfer trasero, 150-1
220-3
intervalo de Nyquist, 221
ordenado, 824
máscaras de ponderación, 223
representación polar, 826-7
ponderado, 223
valor absoluto, 826
búferes, 150-1 búferes de color, 78-79, 150-1, 187
postfíltrado, 221
Número de linea de barrido, 86
pretlltrado, 221
Número de vueltas, 132
supermuestreo, 221
Número f, 631
coeficiente alpha, 183, 78
velocidad (animación). 771-2
Número imaginario, 825
coeficientes de atenuación radial
Multum in parvo (mip map). 655
puro, 825
B-spline),
Nabia, 829-30
467-9
Nyquist:
al cuadrado, 832 National Televisión System Committee fNTSC), 604, 743, 744
traseras, 663-4
de la intensidad, 661
N U R B (Nonuniform rational
N
cálculos de iluminación de caras
color de destino, 185 color de la fuente, 185 colores de la fuente luminosa, 660
frecuencia de muestreo, 221
constantes simbólicas, 74—75
intervalo de muestreo, 221
coordenadas de textura, 669-70, 672-3, 673^*
O
coordenadas de textura homogé-
N C S A (National Center for Supercompuling Applications), 70
Objeto:
nea, 679-80
componente de imagen, 156
coordenadas homogéneas, 89
N C S A C A V E , 16, 688
no rígido (flexible), 526-9
copia de patrones de textura,
Newton, segunda ley del movimien-
opaco, 597
to, 768-9
rígido, 768-9
Newton-Raphson, determinación de raíces, 841
Objeto gráfico, 128 estándar, 128, 416
Nicholl-Eee-Nicholl, recorte de lineas de, 333-5 Niveles cuánticos de energía, 37 Niveles de intensidad del sistema, 603
turas, 676-7 doble búfer, 150-1, 772-5 efectos atmosféricos, 665
OpenGL:
(véase también CiLUT;
GLU)
73-74
coordenadas de proyección, 361,
denominación de patrones de tex-
Open Inventor, 74
Architecture Review Board,
coordenadas, 307
curvas de recorte, 484-5
Objetos sin forma, 429-31
A G L (interfaz Apple), 75
Normalizado:
675-6
archivos de cabecera, 76
espacio de texturas bidimensional (volumen), 672-3 espacio de texturas tridimensional (volumen), 673-4 espacio de texturas unidimensional (lineal), 669-72
biblioteca básica, 74-75
estados de textura actual, 676-7
cuadrado, 311-3
biblioteca de núcleo, 74-75
focos, 661 -2
visor, 310-1
bibliotecas relacionadas ( G L U T y
fuente luminosa infinitamente dis-
370-2, 379, 392-5
volúmenes de visualización, 370-2, 379, 392-4
bién
(véase tam-
Recorte)
N T S C (National Televisión System Committee), 604, 743, 744 Número complejo:
GLU), 75
tante, 659-60
bordes de texturas, 668-9, 678-9
fuente luminosa local. 659-60
búfer auxiliar, 151-2
fuentes de luminosas direcciona-
búfer de acumulación, 187 búfer de color frontal-izquierdo, 150-1
conjugado, 826
búfer de patrones, 150-1, 187
fórmula de Euler, 826-7
búfer de profundidad, 150-1, 187
les (focos), 661-2 función de cara frontal, 216 función de mapa de bits, 148-50 función de mapa de píxeles, 150-1
índice función de matriz de búler de selección, 711-2
(unciones de fuentes luminosas
tiva general, 398 -9 función de proyección en perspectiva simétrica, 398 función de proyección ortogonal,
identificadores de selección, 711
funciones de iluminación, 659-67 funciones de líneas, 91-92
(tetera), 425
dad con la profundidad, 571 función de ventana de recorte. 314-5.396-7
interfaz de sistema X W i n d o w
148-53 funciones de menú, 717-24
(GLX), 75 interfaz I H M / O S (PGL), 75
funciones de pila de nombres,
listas de interpolación de vectores normales, 667-8
funciones de proyección en perspectiva. 398-9
funciones de antialiasing, 228 funciones de aproximación de
splines, 474-85
matrices de coordenadas de
gonales, 139-45,416
relleno, 211-6
funciones de representación de
667-8
superficies, 667-8
matriz actual, 294
poligonales de relleno, 211-6 funciones de atributo de caracteres, 22Ü
B-sp/ine
t
196-8
funciones de superficie de Bézier,
195-6 funciones de búfer de profundidad, 568-71
funciones de textura lineal,
funciones de color, 183-8 funciones de composición de imágenes, 185
B-spline, 480
funciones de curva de Bézier, 474-7
modelado jerárquico, 787
funciones de texturas de superfi-
modelo de iluminación, 665
cies, 672 3
modo de color, 293-4
cas, 673-4 funciones de transformación geométricas, 292-9
funciones de visualización bidi-
funciones de visualización tridi-
m o d o de textura, 293-4
funciones para poliedros regula-
gonos (eliminación de caras ocultas), 569 funciones de entrada interactiva,
[véase también
minado, 199, 666-7 m o d o de selección, 711
funciones de delección de visibili-
funciones de eliminación de polí-
m o d o de representación predeter-
mensional, 78-79, 314-22
funciones para poliedros, 416-9
traseras, 569
293-4, 314 m o d o de realimentación, 711-2
funciones de curvas, 103-4
dad, 568-71
m o d o de índice de colores, 184-5 m o d o de proyección, 78-79,
mensional, 396—401
funciones de eliminación de caras
mezcla de color, 78-79, 185, 666 mip maps, 677-8
funciones de transparencia, 666
funciones de consulta. 229 funciones de curva
570-1
funciones de textura, 213, 668-80
funciones de texturas volumétri-
funciones de caracteres, 155
ción, 213 métodos de visibilidad alámbrica,
477-80
669-72
funciones de atributo de puntos,
métodos alámbricos, 214-6 métodos de relleno por interpola-
482-4
funciones de tetera, 425
funciones de atributo de líneas,
matriz entrelazada, 186 matriz modelview, 293-4
lizaron, 81 funciones de superficie
funciones de atributo de áreas
textura, 676 matrices de vértices, 145-8,
funciones de respuesta a la visua-
funciones de atribulo de áreas de
listas de visualización, 156-8, 787 matrices de color, 186-7
funciones de puntos, 88-90 funciones de relleno de áreas poli-
función de visor, 315, 399
GLUT)
interfaz Apple (AGL), 75
712-3
función de variación de la intensi-
indicadores de aristas de polígonos, 214-6
funciones de matriz de píxeles,
{véase también G L U T )
78-79, 397 función de superficie cúbica
699-724
grupos de atributos, 229 30
puntuales, 659-63
función de proyección en perspec-
res, 416-9
m o d o de visualización de color, 183 modos de representación, 667-8 modos R G B y R G B A , 183-8
funciones para superficies cuádricas, 424 5, 425-8
(véase tam-
bién G L U T ; G L U ) gestión de ventanas de visualiza-
nombres de texturas, 676-7 opciones de color de texturas, 674 opciones de mapeado de texturas, 674-5
ción (véase también G L U T ) ,
opciones de textura, 680
76-79, 158-61,315-20, 399
operaciones de barrido, 151 —2
G L X (extensión a X Windows), 75
881
operaciones de selección, 711-7
(véase también G L U )
882
índice
O p e n G L (con/.)
subconjunto de procesamiento de
Operaciones de semitonos, 668
imágenes, 185
parámetros de iluminación,
subpatrones de textura, 677
659-67 parámetros de iluminación ambiente (fondo), 662-3 parámetros de iluminación de fondo, 662-3
superficies, 662-5
662-3 parámetros globales de iluminación, 662-3 patrones de reducción de texturas,
muhipanel, 54-58
tipos de datos, 74-75
no emisiva (no emisor), 44
tipos de fuentes luminosas, 660
procesador de, 53-54
transformaciones de barrido, 266
vectorial, 41
PGL(intcrfaz I B M OS/2
bitmap, 40 búfer de color, 39
variables de estado, 180
búfer de imagen. 39
vector de posición del observador.
búfer de refresco, 39 color, 40 entrelazado, 40 escala de grises, 40
ventana de selección, 712-3
imagen, 39
W G L (interfaz Windows). 75
línea de barrido, 39
Operaciones de selección en
pila de atributos, 230
aleatorio, 41-42
UtilityToolkil(GLUT), 75
superficie, 667-8
677 8
Pantalla de barrido (monitor), 38-41
Utility(GLU), 75
vectores unitarios normales a la
patrones de textura reducidos,
Présenla! ion Manage), 75
emisiva (emisor), 44
396 7
677 8
fina, 44
texturas proxy, 679
ortogonal, 397
parámetros de reflexión especular,
eleciroluminiscenles de película
texturado automático, 679
transformaciones de proyección
parámetros de iluminación de
electroluminiscente, 44
O p e n G L , 711-7
monocromo, 40 pixel, 39
pila de atributos de cliente, 230
Operaciones lógicas, 200-1
pixmap, 40
pila de atributos de servidor, 230
Operador laplaciano. 831-2
planos de bit. 40
pila de nombres. 711-2
Operadores diferenciales, 829 32
profundidad, 40
pilas de matrices, 295-6
direccional, 831
relación de aspecto, 39
plano de recorte lejano, 396-7
divergencia, 832
resolución, 39
plano de recorte próximo, 396-7
gradiente, 830-1, 831
retorno de haz, 40
planos de recorte, 396-7, 409-10
I,aplace, 831 2
retrazado horizontal, 40
planos de recorte opcional, 409
ordinario. 829-30
rctrazado vertical, 40
posición de barrido actual, 148
parcial, 830
velocidad de refresco, 40 41
primitivas, 78 79 procedimientos de animación,
rotacional, 832 Orden (continuidad de curvas
sp/ine), 434-5
772-5 programa de ejemplo introductorio, 80 propiedades de la fuente lumino-
Ortogonales, coordenadas, 812-3 (íverhauser, sptinc, 441 -2
bidimensional, 51-53, 86-87. 809 tridimensional, 87, 395,812 Pantallas (control de iluminación), 582-3 Pantallas de panel plano. 44 47
P
de cristal líquido (LCD), 45-47
sa, 659 proxy de textura, 679
Pantalla, coordenadas de
Paneles táctiles, 64-66
de descarga de gas, 44
acústico, 66
diodo emisor de luz (LEP), 44-45
reiniciali/ación de texturas, 675 6
LEE)* 64
clectroluminiscenle de película
representación de superficies de
Óptico, 64
rampa de colores, 228
intensidad constante, 667-8 representación de superficies por el método de (iouraud, 667-8 representación plana de superficies, 667-8
resistivo, 64-66 Pantalla
fina. 44 emisiva, 44 matriz activa, 46-47
caligráfica (vectorial). 41
matriz pasiva, 47
de cristal líquido (LCD), 45-47
no emisiva, 44
de panel de plasma, 44
plasma, 44-45
sintaxis básica, 74-75
de trazo (vectorial). 41
Parábola, 121-2
sistema de referencia bidimen-
de vídeo, 35 (véase también
Parámetro
sional, 88
Monitor de vídeo)
beta, 464-5
Indice de continuidad, 444-5
de desplazamiento {spline), 444-5,454, 466
de grado (H-spiine), 454- 5 de tensión
{spline), 441-2, 461,
466 Parámetros de atribulo, 73, 179 áreas de relleno, 199 202 caracteres y texto, 217-20
Pipclinc de visualización:
ángulo interior, 129
bidimensional, 305-7
área, 836
tridimensional, 360-1
arista, 128
Pirámide de visión (proyección en perspectiva), 383 Pittcway-VValkins, antialiasing, 227-8
atributos, 199-200 cara frontal, 137-8 cara posterior. 137-8 característico, 433
Pixblt (transferencia de bloques de píxelcs), 265
centroide, 836-7 clasificaciones, 129
color. 180-1
Placel, 39
convexo, 129
escala de grises. 1X2
Pixel, coordenadas del, 86-87,
de control, 433
estilos de pincel y pluma, 191-2, 194-5
degenerado, 129
124-5 Pixmap, 40, 148
líneas curvas, 193-5
Planck, constante, 638-9
lista de sistemas, 179
Planificación de tareas, 5
polígonos, 199-200
Plano:
división de polígonos cóncavos, 130-1 división de polígonos convexos, 131-2
puntos, 188
de partida (trazado de rayos), 488
segmento lineal, 188-92
cara anterior, 137-8
efectos de costura, 214
símbolos marcadores, 220
cara posterior, 137-8
estándar, 128
Parte real (número imaginario), 824
coeficientes, 136-8
indicador de arista (OpenGL),
Particionamiento de imágenes, 156
complejo, 824
Paseo aleatorio, 501 4
ecuaciones, 136-8
intersección con rayos, 625-6
Patrones de pixel (semitono), 607
frontal (recorte), 370
lado, 128
Patrones de reducción (mapeado de
lejano (recorte). 370-2
lista de aristas activas, 205-6
parámetros, 136-8
malla. 128
posterior (recorte). 370
métodos de relleno, 199-206
textura), 655 Patrones de textura \ olumétricos. 654-5
próximo (recorte), 370-2
P C X , 805
recorte, 370-2, 407-9
Peano:
vector normal, 138-9
curva, 496-7, 498 9
Plano de visualización, 356. 361,
ecuaciones del plano, 136-8
214-6
(véase también Algoritmos de relleno de área) parámetros del plano. 136-8 simple. 128
362
tabla de aristas, 135-6
Pel, 39
posición. 362
tabla de caras de la superficie,
Penumbra, 635. 637
vector normal, 362
Período (onda luminosa monocro-
ventana de recorte, 370, 377-8
espacio, 498-9
mática), 735 Persistencia, 38 Personajes articulados (animación). 769-71 P G L (iniertaz de Presentation manager con OpenGL), 75 P H I G S (Programmer's Hierarchical Interactive G'aphics Standard), 73 PHIGS-, 73 Phong: modelo de reflexión especular, 588-93 representación de superficies, 617
Planos de bits (sistema de barrido), 40
135-6 labia de datos geométricos, 135-6 tabla de vértices, 135 6 tablar 135-6
Planos de recorte, 361 orientaciones arbitrarias. 407-9 próximo y lejano, 370-2
labias de aristas ordenada. 204 5
test interior-exterior, 132 4 (véase
también Plano)
PNG, 803-^
vector de la arista. 129 30
Polares, coordenadas, 788-89.
vector normal. 138-9
813^1
vértices, 128
Poliedros, 416
Polígono cóncavo, 129
intersecciones en trazado de rayos, 625-6 propiedades, 838 Polígono, 129
883
[véase también Arca
división, 130— 1 identificación, 129-30 recorte, 343-5 l'olilínea. 91, I6(M»2
PICT, 804
de relleno)
algoritmos de visualización, 100
Pincel y pluma, atributos, 191-2
ángulo convexo, 131-2
unión en bisel, 190
884
índice
Polilfnea, 91, 160-62 (cont.)
Proyección:
unión en punta, 190
axonométrica, 369
unión redondeada, 190
caballera, 376
matriz, 392-3 matriz de inclinación, 391 Proyección ortogonal:
Polimarcador, 153-4, 160-62
cabinet, 376
axonométrica, 369
Polinomios de Hernstein, 445-6
centro, 380
coordenadas de proyección, 369
Ponderación:
frustum, 384-5, 386-92
elevaciones, 368
máscara (pixel), 223
isométrica, 369
isométrica, 369
superficie, 224-5
plano, 356, 549
matriz de transformación de nor-
Posición actual, 87
punto de referencia, 380
Posición actual de barrido
vector (oblicua), 376-7
(OpenGL), 148
volumen de visualización, 370-2,
(véase también
Postfiltrado, 221 Amialiasing)
Precisión (atributo de texto), 220 Prefiltrado, 221
377-8, 383-5 Proyección de rayos
(véase también
Amialiasing) Presentation Manager, interfaz con O p e n G L (PGL), 75 Primitivas de salida gráfica, 72, 85
detección de superficies visibles, 563-4 geometría sólida constructiva, 486-9 Proyección en perspectiva, 356, 368,
malización, 373 transformación de normalización, 370-2 volumen de visualización, 370-2 volumen de visualización normalizado, 372 vista plana, 368 Proyección paralela, 356, 368 axonométrica, 369 caballera, 376
379-80
cabinet, 376
área de relleno, 124-39
ángulo del campo visual, 387-9
ejes principales, 369
carácter, 153-4
casos especiales, 381-3
isométrica, 369
círculo. 104 II
centro, 380
oblicua, 374-9
elipse, 111-20
cono de visión, 383
ortogonal, 368-73
mapa de bits, 148
coordenadas de transformación
transformación de inclinación,
mapas de pixel, 148
normalizadas, 393 5
374-6
marcador, 153-4
coordenadas, 381-3
matrices de pixel, 148
de dos puntos, 383
372-3, 379
poli línea, 91, 160-62
de tres puntos, 383
vector, 376-7
poiimarcador, 153-4, 160-62
de un punto, 383
vista de elevación, 368
polinomio, 123
frustum, 384-5, 386-92
vista superior, 368
punto, 86-87
frustum oblicuo, 390-2
volumen de visualización, 370-2,
sección cónica, 120-3
frustum simétrico, 386-90
segmento lineal, 92-102
matriz, 385-6,392 5
sp/ine, 123
matriz de inclinación, 391
coordenadas, 374
texto, 153-4
matriz de transformación normali-
en dibujo y diseño, 374 6
Primitivas para matrices de pixeles, 148 Problema del valor de contomo, 844
zada, 394-5 matriz de transformación oblicua, 392-3
Problema del valor inicial, 844
pirámide de visión, 383
Procedimiento registrado, 80
punto de fuga principal, 383
Procesamiento de imágenes, 31-32
punto de referencia, 380
Producto escalar (vectores), 816-7
puntos de fuga, 383
Producto vectorial (vectores), 817-8
representación en coordenadas
Profundidad (búfer de imagen), 40 Profundidad de campo, 632 Programas de dibujo, 23-26 Propiedades de coherencia, 203 Protocolo de transferencia de archivos (ftp), 70
homogéneas, 385-6, 393-4 volumen de visualización normalizada, 392-4 volumen de visualización, 383-5 Proyección en perspectiva oblicua: frustum, 390-2
transformación de normalización,
377-8 Proyección paralela oblicua:
matriz de transformación, 377-8 proyección caballera, 376 proyección cabinet, 376 transformación de normalización, 379 vector, 376 7 volumen de visualización, 377-8 Puesta en fase de los pixeles, 221, 225 Punto: atributos, 188 de foco (elipse), 111-2 de fuga principal, 383 de fuga, 383
Indice
de pivole (rotación), 240
Recorte de área, 336-46
leyes de Fresnel, 588-9
de referencia (proyección en pers-
Recorte de línea:
modelo de Phong, 588-93
pectiva), 380
bidimensional, 323-36
de referencia de visuali/ación, 380
Cohcn-Sulherland, 324-9 Cyrus-Beck, 330
885
vector, 588 vector del punto medio, 590-2 Refracción:
en el espacio de coordenadas, 814
Liang-Barsky, 330-3
ángulo, 598
fijo (cambio de escala), 242,
Nichol-Lee-Nichol, 333-5
coeficiente de transparencia, 600
tridimensional, 404—7
difusa, 597
observado, 362 3
ventana de recorte no lineal, 335
doble, 598
propiedades, 814
ventana de recorte no rectangular,
índice, 598
284-5
335
recorte, 323 Pureza (luz), 737
Recorte de polígonos:
R
bidimensionales, 336-46 métodos paralelos, 338-9
ley de Snell, 598 rayo, 598-9, 620 vector, 599-600 Refresco:
Radiancia espectral, 638-9
Sutherland-Hodgman, 338-43
archivo de visualizaeión, 42
Radiante:
tridimensionales, 406 -8
búfer, 39 (véase también Búfer de
energía (radiancia), 638-9
Weiler-Atherton, 343-5
exitancia, 638-9
Recorte de superficies, 406-8
flujo, 638-9, 639 40
Recuadro:
intensidad, 638-9, 639-40
de entrada de dial, 58, 59
potencia, 638-9
dimensión, 495-6
transferencia de energía, 640-3
filtro, 225-6
Radiosidad (exitancia radiante),
recubrimiento (fractal), 495-6
638^5
Redes gráficas, 69
cierre superficial, 640 1
Reducción de color:
ecuación, 640-1
de corte medio, 793
factor de reflectividad, 640-1
por popularidad, 792-3
factores de forma, 640-1 modelo básico, 638-43 refinamiento progresivo, 643-5
uniforme, 792 Refinamiento progresivo (radiosidad), 643-5
imagen)
TRC, 36-41 (véase también Tubo de rayos catódicos) velocidad (TRC), 36, 40-41 Regla de la mano derecha, 817-8 sistema cartesiano, 71,811 Regla de la mano izquierda, coordenadas cartesianas, 812-3 Regla de paridad (par-impar), 132 Regla del número de vueltas distinto de cero, 132-4 Regla del trapezo ide, 842 Regla par-impar de relleno de polígonos, 132
semicubo, 642-3
Reflectividad, 585
Reglas de producción. 521-2
semiesfera, 639-40
Retlector:
Relación de aspecto, 39
Raíces: de números complejos, 826-7 ecuaciones no lineales, 841-2 Ratón, 59-60
difuso ideal. 585, 639-40
Relativas, coordenadas, 87
lamberliano, 585, 639-40
Relleno
perfecto, 585, 639-40 Reflexión (luz):
Z, 60
de área, 202- 11 (véase también Algoritmos de relleno de área)
ángulo de incidencia, 585-6
mediante cuadrícula, 200
Rayo de sombra, 622
coeficientes, 584-88, 588-9
mediante patrones, 2 1 2 3
Rayo del píxel, 618-619
difusa, 584-88
suave, 200
Rayo secundario, 620
especular (modelo de Phong),
Rayos catódicos, 36 Realidad artificial
(véase Realidad
virtual) Realidad virtual: aplicaciones, 10-11 lenguaje de modelado ( V R M L ) , 70
588-92
tintado, 200 Representación, 358
(véase también
lambertiana, 585
Representación de superficies)
leyes de Fresnel, 588-9
de volúmenes, 530-2, 5 3 2 4
rayo, 620
mediante producto cartesiano
vector del punto medio, 590-2 Reflexión especular, 5 8 3 4 , 588-92
(spline superficial),
436, 454,
464
ángulo, 588
plana de superficies, 614
sistemas, 47-50, 62-63
coeficiente, 588-9
rápida de superficies por el méto-
Realimentación de eco, 695
exponente, 588-9
do de Phong, 617-8
886
índice
Representación de funciones: explícita, 828-9 implícila, 828-9 Representación de superficies, 358,
splines beta, 465-7
Retorno (haz de electrones), 40
spiines de Bézier, 445 54 splines racionales, 467 9
RKYLÍS, 553 RGB:
supercuádricas, 422-4
coordenadas cromáticas. 743
577, 613-45 (véase también
superficies cuádricas. 420-2
modelo de color. 42-44, 180-1.
Detalles de superficie)
superficies sin forma. 429-31
hundas de mach, 617
toro, 421-2
(iouraud, 614-7
visual ización de datos, 529-37
intensidad constante. 614 interpolación de intensidad, 614 7 interpolación de vectores normales, 617 trapeado de fotones, 646-7
Representaciones de particionamiento del espacio, 415 Representaciones no parametricas,
742^1 monitor, 44 (véase también Monitor de vídeo) Rotación: ángulo, 240 bidimensional, 240-2, 245-6,
828-9
254 5
Representaciones parametricas. 829
composición, 248
métodos poligonales. 613-8
círculo, 104-11.829-32
construcción de matrices, 254-5
Phong, 617
curva. 828-9
de los ejes de coordenadas, 272-4
Phong rápida, 617-8
elipse, 113
eje de coordenadas, 272-4
plana. 614
elipsoide, 421
eje de, 240
radiosidad, 638^t5
esfera, 420, 829-32
eje espacial general, 274-80
trazado de rayos, 618-38
parábola, 121
eje*. 273
segmento lineal, 323-4, 330,
eje y, 274
Representaciones de barrido, 4X5- 6 Representaciones de objetos:
380-1
árboles BSP, 492
spline,
árboles cuaternarios, 489
superficie. 829-32
árboles octales, 489-92 H - s p / i n e s , 454-64 contorno (B-rep), 415 curvas y superficies (raciales, 492-521 elipsoide. 420-1 estera, 420 (unciones de densidad, 429 31 graftal, 524 gramática L, 524
123,434,435, 436
toro, 422 Resaltado (método de selección). 693 Resolución: aproximaciones de semitono, 608-9 dispositivo de visuali/ación, 38 Resolución de ecuaciones integrales: aproximaciones mediante rectángulo, 842 3
eje z. 272-3 en las animaciones, 252-3, 771 -2 inversa, 246-7, 274 métodos de barrido, 265 métodos de euaternios, 280 4 punto de pivote, 240 representación matricial, 246 tridimensional, 271-84 vector del eje, 275-6 Rotacional, operador, 832 Ruido (tramado), 611 Runga-Kutta. algoritmo, 844
s
gramáticas de forma, 521-4
métodos de Monte Cario, 843
interpolación de splines cúbicos,
regla de Simpson, 842
Sans-serif. tipo de letra, 153
regla del trapezoide, 842
Saturación (luz), 737
437-44 metabolas, 430-1
Resolución de ecuaciones lineales:
métodos CSC i, 486-9
descomposición l.tJ, 840
métodos de particionamiento
eliminación gausiana. 839
espacial, 415 modelado tísico, 526-9 modelo de objeto suave, 430- I objeto gráfico estándar, 128, 416 poliedros, 416 polígonos, 128-39
Gauss-Scidel, 840 regla de Cramer. 839 Resolución de ecuaciones no lineales, 842-3 Resolución de sistemas de ecuaciones, 839-40
Secciones cónicas, 120-3 Segmento (subsección de imagen), 156 Segmento de línea dirigido (vector). 814 Seguimiento (animación), 760 Selección: coordenadas, 692 dispositivo de entrada. 690, 692-4
relieves gausianos, 430
Retrazado horizontal, 40
distancia, 692-4
representaciones de barrido. 485
Rctrazado vertical, 40
objeto, 692-4
sistemas de partículas. 524-5
Restricciones (dibujo interactivo),
resaltado, 693
splines, 431-73
696
ventana, 693
índice Semicubo (radiosidad), 642 3
C G API, 70
Semiesfera (radiosidad), 639-40
correspondencia de lenguaje, 74
Supercuádrica. 422 4
Semitono:
estándares, 73-74
Superelipse, 422-4
aleatorización. 610-3
887
m o d o de entrada, 694
funciones básicas. 72-73
Superelipsoide. 423
aproximaciones, 607-10
G K S , 73-74
Superficie:
métodos de color. 610
G L , 70, 73
circundante, 560
patrones, 607
Open Inventor. 74, 75
cuádrica, 420-2
Serif, tipo de letra, 153
operaciones de control, 73
curva de ajuste, 437
Servidor gráfico. 69
PIIIGS, 73
detalle, 647-49
setPixel, procedimiento, 87
PH1GS+, 73
exterior, 560
SIGGRAPII (Special Inierest Group
pipeline de visualización, 71-72
fractal, 498-9, 50O-I, 504-6, 519
Rcndcrman, 74
interior. 560
in Graphics), 70 Símbolo:
representaciones de coordenadas,
instancia, 779 jerarquías. 781—2 modelado, 779 Simetría
tridimensional, 73
representación explícita. 828-9
V R M L , 70, 74
representación implícita, 828-9 representación no paramétrica,
Sombra, 635, 637
círculo, 104
Sombras (color), 739
elipse, 113
Sombras:
en los algoritmos de dibujo decurvas, 121 Simpson. regla de. 842 Simulaciones, 6-7, 10-11, 12-23 Simuladores, 19-23
828-9 representación paramétrica, 829
modelado, 601-2
sin forma, 429-31
penumbra, 635, 637
solapada. 560
sombra, 635, 637
supercuádrica, 422-4
Sombreado
(véase Modelos de
ilu-
minación; Representación de
de vuelo, 19-22
plana, 416 ponderación, 224-5
70-72
superficies)
teselada, 128 Superficie curva, 420-2, 436, 530-2
B-spline, 464-5
Sistema de color completo, 44
Spaceball, 11,60-61
cuádrica, 420-2
Sistema de animación
SpaceGraph, sistema, 47
curva de ajuste. 468-9
parametrizado, 761
SP1FF, 802-3
elipsoide, 420-1
por scripl, 761
Spline cardinal, 441-4
esfera, 420
Spline Catmull-Rom, 441-2
gráficas de contorno, 530-2
Sistema de barrido, 50-54 codificación de celdas, 53 codificación de longitud de recorrido, 54
Spfíne cúbica, 123.435
ponderación. 224-5
Bézier, 451-3
representación [véase
controlador de pantalla, 50-51
B-spline, 460-1
controlador de vídeo, 51-53
interpolación, 437-44
controlador gráfica, 53
natural. 438
conversión de barrido, 53 coprocesador de pantalla, 53
Spline de aproximación, 432 Spline de interpolación, 432
Sistema de enfoque ( T R C ) 37
Spline hemiítica, 438-41 Spline racional, 467-9
Sistema de fotogramas clave, 760,
Stoke, teorema de, 833
procesador de pantalla, 53-54 t
Subdivisión espacial adaptativa:
762-7 Sistemas de entrada de voz, 67 Sistemas de pantalla grande, 54 58 Sistemas de partículas, 524-5 Snell, ley de, 598 Software gráfico:
(véase también
OpenGL) bidimensional, 73
isosuperficic, 530-2
beta. 466
Representación de superficies) representación no paramétrica, 828-9 representación paramétrica, 829 representaciones explícitas, 828-9 representaciones implícitas, 828-9
spline. 436 (véase también Superficie spline) spline de Bézier. 454
árbol BSP, 492
supercuádrica. 422-4
trazado de rayos, 627
loro, 421-2
Subdivisión espacial uniforme:
visibilidad, 565-6 [véase también
árbol octal. 489-92
Detección de superficies visi-
trazado de rayos, 627
bles)
Suceso: cola. 694
Superficie spline, 432, 436 ajuste. 437
888
índice
Superficie spline, 432,436 (cont.) Béááer, 454 tt-sptine, 464-5 representación mediante producto cartesiano, 436 visualización, 470-4 Supermucsireo, 221, 632 Sutherland-Hodgman, recorte de polígonos, 338-43
T TAC (Tomografia axial computerizada), 31 labias: de atributos ¡polígono), 135-6 de aristas, 135-6, 204-5, 205-6 de aristas ordenadas, 204-5 de coras de la superficie, 135 6 de consulta de vídeo, 604 de sustitución, 181-2, 604 de sustitución de colores, 181-2 de vértices (polígono), 135-6 geométrica, 135-6 Tableta, 62-63 (véase también Digitalizador) de datos, 62 gráfica, 62-63 Tamaño en puntos (carácter), 217 larga, 805 TCP/IP, 69-70 Teclado, 58 Técnicas de construcción interactiva de imágenes, 695-9 arrastre, 696 cam po de gravedad, 698-9 cuadrículas, 696 dibujo, 699 métodos de banda elástica, 696 posicionamiento, 695 restricciones, 696 Temporización (animación), 759 Tensor. 818 contracción, 536 dimensión, 818 métrico, 821 propiedades de transformación, 818 rango, 818 visualización de datos, 535-6
Teoremas diferenciales, 833-5 Teoría de los tres estímulos de la visión, 742 Terminación cuadrada saliente, 190 de linca redondeada, 189 plana, 189 Terreno (fractal), 505-7 Teselado de superficies, 128 Test interior-exterior: planos espaciales, 137-9 regla del número de vueltas distinto de cero para polígonos, 132-4 regla par-impar para polígonos, 132 Tetera. 425 Texel, 650-1 Texto: {véase también Carácter) alineación, 220 atributos, 217-20 precisión, 220 recorte, 347-8 trayectoria, 218-9 Textura sólida, 654-5 TGA, 805 TIFF, 803 Tintes (color), 739 Tipo de letra, 153 (véase también Fuente) legible, 153 Tomografia, 31 axial computerizada (TAC), 31 computerizada (TC), 31 emisiva de posición (TEP), 31 Tonalidades (color), 739 Tono, 737 Topológico dimensión, 495-6 recubrimiento (fractal), 496 Toro, 421-2 Traekball, 60-61 Tramado. 610 aleatorio (ruido), 611 matriz, 611 método de difusión de errores, 612-3 método de difusión de puntos, 613
método de tramado ordenado, 611 ordenado. 611 ruido, 611 Transferencia de bloques, 265 Transformación: afín, 292 cambio de escala, 242-4, 248 compuestas, 247-59, 287-9 conmutativa, 251-2 cuerpo rígido, 238-9, 2 5 3 ^ de barrido, 265-6 de coordenadas universales a coordenadas de visualización, 71,307, 308, 361, 366-7 de la estación de trabajo, 313 de ventana a visor, 306, 310-3 de visor, 395 eficiencia de cálculo, 252-3 geométrica bidimensional, 238-69 geométrica tridimensional, 270-1 geométrica, 73, 237 geométricas básicas, 238-44 inversa, 246-7 métodos de barrido. 265-6 modelado, 73, 237 no conmutativa. 251-2 representación matricial, 244-65, 270-91 rotación, 240-2, 246, 271-84 sistema de coordenadas, 267-9, 291-2 traslación, 238^10, 245-6, 270-1 Transformación de inclinación, 263-4 bidimensional, 263-4 dirección r, 263-4 dirección y, 264 dirección z, 290-1 eje, 263-4, 290-1 en proyecciones en perspectiva oblicuas, 391-2 en proyecciones paralelas oblicuas, 374-6 matriz, 263-4, 290-1 parámetros, 263-4, 264, 290-1 tridimensional, 290-1 Transformación de normalización: bidimensional, 310-3 proyección en perspectiva, 393-4
Índice
proyección ortogonal, 370 2 Transformación de proyección:
proyección en perspectiva simétrica, 386-90
cálculos de intersección con superficies, 623-30
axonométriea, 369
proyección ortogonal, 368-73
códigos, 634-5
caballera, 376
proyección paralela oblicua,
de distribución, 634-5
374-9
cabinet, 376
desenfoque de movimiento, 635-7
ejes principales, 369
proyección paralela, 368 9
ecuación del rayo, 622
isométrica, 369
proyecciones, 356
C Ice los de enfoque de cámara,
ortogonal, 368-73
punto de vista, 362
ortográfica, 368
transformación de coordenadas
paralela, 356, 368, 368-79
universales a coordenadas de
paralela oblicua, 374-9
visualización, 308, 366-7
perspectiva, 356, 368, 379-95 perspectiva oblicua, 390-2 perspectiva simétrica, 386-90 1 ransformación de reflexión, 260-3 bidimensional. 260-3 eje, 260, 290
transformación de estación de trabajo, 313
630-2 efectos del objetivo de la cámara, 634-5 en el modelo de radiosidad, 643 5 llucluación, 634-5 fuente de luz compleja, 635
transformación de visor, 395
haces, 628-30, 631
tridimensional, 355-60
intersecciones con la esfera,
vector de visualización vertical, 362
889
623-5 intersecciones con poliedros,
métodos de barrido, 266-7
ventana de recorte, 305, 307-9
plano, 290
ventana de visualización, 305
método del búfer de luz, 628-30
tridimensional, 290
visualización normalizado, 310-1
mueslreo adaplativo, 632
volumen de visualización norma-
muestren estocástico, 634-5
Transformación de visualización, 73
(véase también
Proyección)
algoritmos de recorte, 323-48, 401 10 bidimensional, 306 coordenadas de pantalla, 51-53, 86-87, 395, 809
lizado, 372, 379, 392^4 volumen de visualización, 361 Transmisión especular (refracción), 598
Transparencia: (véase también
625-6
rayo de sombra, 622 rayo del ojo (rayo del pixel), 618-619 rayo del pixel (primario), 618-619
Refracción; Trazado de rayos)
rayo luminoso invertido, 620
coeficiente, 600
rayo reflejado, 620
malizadas, 361, 372, 379,
factor, 200
rayo refractado, 620, 622
392-5
ley de Snell. 598
rayos distribuidos, 634-8
coordenadas normalizadas, 307
modelo básico, 600
rayos secundarios, 620
coordenadas uvn, 363-4
vector, 599-600
coordenadas de proyección nor-
recorrido de celdas, 627-8
cuadrado normalizado, 311-3
I ranspuesta (matriz), 823
subdivisión adaptativa, 627
efectos de pantalla dividida, 313,
traslación:
subdivisión del espacio, 627-8
bidimensional, 238-40, 245-6
subdivisión uniforme, 627
frustum, 384 5, 386-92
composición. 248
supermuestreo, 632
parámetros de la cámara, 355,
distancias, 238
trazado de conos, 633
inversa, 246-7, 271
vector de la trayectoria, 621-2
pipeline. 305-7, 360-1
métodos de barrido, 265
vector de transmisión, 622
plano de proyección, 356, 361,
representación matricial, 245-6,
320-2
360-1
362
270
volúmenes de contomo, 626 Trazadora de plumillas, 68, 69
plano de recorte lejano, 370-2
tridimensional, 270-1
Trazo descendente (carácter), 217
plano de recorte próximo, 370-2
vector, 238
Tubo de rayos catódicos (TRC), 35
plano de visualización, 356, 361-2
Trayectoria (texto), 218 9
(véase también Monitores de
planos de recorte, 361
Trazado de rayos, 619
vídeo; Pantalla de barrido)
proyección en perspectiva, 379-95 proyección en perspectiva oblicua. 3 W - 2
algoritmo básico, 620-2 ángulo de refracción, 622
antialiasing, 632-3 árbol, 620
alta definición, 38 ánodo de aceleración, 36 cañón de electrones, 36 cátodo, 36
890
ìndice
Tubo de rayos catódicos, (cont.) color, 42-44 componentes, 36-38 deflexión del haz, 37 enfoque, 37 filamento, 36 fósforo, 36 intensidad del haz, 37 máscara de sombra, 42-43 máscara de sombra delta-delta, 43 máscara de sombra en línea, 43 penetración del haz, 42 persistencia, 38 rejilla de control, 37 relación de aspecto, 39 resolución, 38 RGB, 42 44 tamaño de punto, 38 tensión de aceleración, 36 velocidad de refresco, 36
ü Unidad imaginaria, 825 Unión, polilíneas en bisel, 190 en punta, 190 redondeada, 190 Universales, coordenadas, 71-72 URL (Uniform Resource Locator), 69-70 Usuario: diálogo, 724 facilidades de ayuda, 725-6 interfaz, 724 {véase también Interfaz gráfica de usuario) modelo, 724 uvn, sistema de coordenadas, 363-4
y Valores cromáticos, 737, 741, 742 Variable: dependiente, 828-9 independiente, 828-9 Variación de intensidad con la profundidad, 356-7 Vector: ángulos directores, 815 arista, 129-30 columna (matriz), 821-2
cosenos directores, 815 de desplazamiento, 238 (véase también Traslación) de eje (rotación), 275-6 de nudos, 456 de posición, 818-9 de transmisión (refracción), 599600 de trayectoria (trazado de rayos), 621-2 del observador (modelo de iluminación), 588 del punto medio, 590-2 dimensión, 818
bidimensíonal, 308 tridimensional, 363 Vectores de los ejes de coordenadas (base), 819-20 Velocidad de la luz, 736 Ventana, 305 (véase también Ventana de recorte; Ventana de visualización; Transformación de visualización; Visor) Ventana de recorte, 305, 370, 377-8 efectos de ampliación, 306 efectos panorámicos, 306 en coordenadas de visualización, 308
en la representación de cuaternios, 827-8 espacio vectorial, 819-20 tila (matriz), 821-2 fuente luminosa, 586-7 módulo (longitud), 815 multiplicación por un escalar, 816 normal a la superficie, 138-9, 656, 658, 830-1 operaciones, 816-7 producto, 817-8 producto escalar, 816-7 producto vectorial, 817-8 propiedades, 814-6 proyección paralela oblicua,
en coordenadas universales, 308-9 mapcado de visor, 310-1 no lineal, 335-6, 346 no rectangular, 335, 345 Ventana de visualización, gestión, 305
376-7 punto medio, 590-2 reflexión especular, 588 suma, 816 transmisión (refracción), 599-600 traslación, 238 vertical (carácter), 218 visualización de dalos, 532-5 Vector base, 819 20 (véase también Base) ortogonal, 819 20 ortonormal, 819-20 Vector normal: interpolación (representación superficial de Phong), 617 plano de visualización, 362 promedio (malla poligonal), 614 superficie curva, 656, 658, 830 I superficie de un plano, 138-9 Vector vertical de visualización:
Vértice (polígono), 128 Visiocasco, I I , 47-50, 360 (véase también Realidad virtual) Visión (leona de los tres estímulos). 742 Visor, 305 (véase también Ventana de recorte) en coordenadas de pantalla, 311 3 normalizado, 310-1 tridimensional, 361 (véase también Volumen de visualización) Vista de elevación, 368 Vista superior, 368 Vistas en sección, 359 Visualización: archivo, 42 ampliación y reducción, 298-9 aplicaciones, 12-19 bidimensional, 305-14 científica, 12, 529 (véase también Visualización de datos) comrolador, 50-51 coprocesador, 53 dispositivos, 35-58 (véase también Monitores de vídeo; Procesadores de visualización) despieces y secciones transversales, 359
estereoscópica, 47-50, 360
V R M L (Virtual-reality modeling
funciones de respuesta, 81 lista de, 42 métodos, 529 37
(véase también
Visuali/ación de datos)
language), 70
w Warn, modelo (fuente luminosa),
panorámica, 306 programa de, 42
582-3 Weilcr-Atherton, recorte de polígo-
tridimensional, 71-72, 355-60, 362 96 ventana, 32, 305 Visuali/ación de datos: aplicaciones, 12-19 campos escalares, 529-33
nos, 343-5 W G L (interfaz Windows a O p e n G L ) . 75 World Wide Web, 69-70
X
campos multivariables, 536
X B M , 804
campos tensoriales. 535-6
X P M , 804
campos vectoriales, 532-5
X W i n d o w System, 75
escalares, 529-33
X Y Z , modelo de color. 739-40
glifos, 536
Y
gráficas de contomo, 530-2 isolincas, 530-2
YC C , modelo de color, 745
isosuperficies, 530-2
YIQ, modelo de color, 745
líneas de campo, 534
Y U V , modelo de color, 745
líneas de flujo, 534 métodos de codificación de color, 529 multivariados, 536 representación de volúmenes, 530-2, 532-4 Visualización de polígonos: bandas de mach, 6 1 7 Gouraud, 614-7 intensidad constante, 614 interpolación de intensidad, 614-7 interpolación de vectores normales, 617 Phong, 617 Phong rápido, 617-8 plano, 614 Volumen de visualización paralele pipédico, 371, 377-8, 390, 393-4 rectangular, 371 Volumen de visualización, 361 cubo unitario, 370-2, 378-9, 392-5 normalizado, 372-3, 379, 392-5 proyección en perspectiva, 383-92 proyección paralela, 370-2, 370-2 Vóxel, 491
r
h
Indice de funciones OpenGL Funciones de la biblioteca básica glBegin: banda de cuadriláteros, 143-4
glDrawElements, 145-7
glFIush, 80 I
glDrawPixels, 151, 266-7
gIFog, 571
banda de triángulos, 141-3
gIFronlFacc, 215-7
cuadriláteros, 143
gILdgeFlag, 215-6
polígono, 140-1
glFdgeFlagPointer, 215-6
polilínca, 91-92
glFnable:
glFrustum, 398-9
gIGenLists, 156-7
polilínea cerrada, 92
antialiasing, 228 9
gì Gen Tex tu res, 677
puntos, 88-90
comprobación de profundidad,
glGet**, 229, 295-6, 314-5, 410,
segmentos de linea, 79, 91
569-70
triángulo «ventilador», 142-3
curvas de Bézier, 474 5
triángulos, 141-2
eliminación de polígonos, 568-9
772 gIGetTex Level Parameter, 679
estilos de línea, 196-7
gllndex, 183-4
glBindTexturc, 676-7
estilos de relleno. 212-3
gllntcrleavedArrays, 186-7
glBitmap, 148- 50
fuente luminosa, 659 60
gllndexPointer, 187-8
gIBIendFunc, 185-6, 228-9
mezcla de color, 152-3, 184-5
gilnitNames, 712-3
normalización de vectores, 667-8
gllsList, 156-7
planos de recorte opcionales,
gllsTexture, 677-8
glCallList, 156-7 glCallLists, 157 8, 787
409-10 glClear, 78-9, 569-70 semitonos (tramado), 668-9 gKIearColor. 76 7. 187-8, 315-6 superficies de Bézier, 477-8 glClearDcpth, 569 70 lexlurado, 668 9, 671-2, 673-4 gK'learlndex, 187 8, 315-6 variación de la intensidad con la glClipPlanc, 409-10 profundidad, 571 glColor, 78-9, 183-4 glColorPointer, 186 7 glCopyPixels, 152-3, 266-7 glCopyTexlmage, 675-6 glCopyTexSublmage, 675-6 CulIFace. 568-9
glLight, 658 9 gILightModel, 662 4 gILineStipple, 196-7 gILinc Width, 195-6 glListBasc, 157-8 gILoadldentity, 88, 293-4, 314 glLoadMatrix, 293^4
glFnableClientSlate: glLoadName, 712-3 indicadores de aristas, 215 6 gILogicOp, 152-3 matrices de colores. 185-6 matrices de coordenadas de textugIMap: ra, 675-6 curva de Bézier, 474-5 matrices de vértices, 145-7 superficie de Bé/ier, 477-8
glDeleteLists, 158-9
normales a la superficie, 667-8 glMapGrid:
glDeleteTextures. 676 7
gILnd, 88-89
glDepthFunc, 569-70
gIRndIJst, 155-6, 787
glDepthMask, 570-1, 666-7
glEvalCoord;
glDcpthRange, 569-70
curva de Bézier, 474-5
glDisable. 184-5, 196-7,212-3,
superficie de Bézier, 477-8
409-10, 474-5, 568-9
giEvalMesh:
glDisableClientStale, 147-8
curva de Bézier, 477
glOrawBufier. 151 2,266-7
superficie de Bézier, 478-9
curva de Bézier, 477 superfìcie de Bézier. 478-9 gIMaterial, 664-5 gIMatrixMode, 78-9, 88, 294-5, 314, 396 gIMultMatrix, 294-5
gINewLisl. 155 6. 787
894 Indice de funciones OpenGL glNormal, 666 7
glPushMalrix, 295-6
glTexC'oordPointer, 675-6
glNormalPointer, 667-8
glPushName, 712-3
gITcxEnv, 674-5
glOrtho, 397
gIRaslerPos, 149-50, 155
glTexImage2D, 671-2
glTexImagcID, 668-9
glReadBuffer, 151-2
glTcxImagc3D, 673-4
gIPixelStorc, 149-50
gIReadPixels, 151-2, 266-7
glTexParamcfcr. 669-70, 672-6,
glPixel/oom, 267 8
gIRect, 139-40
gIPoimSize, 195-6
gIRenderMode, 7 1 1 2
glTexSublmage, 677-8
glPolygonMode, 214-6, 570 I
gl Rotate, 293
glTranslale, 293
glPolygonSlipple, 212-3
glScale, 293
gIVenex, 79. 88-90
gIPopAttrib, 229-30
glSclcclBuffbr, 711-2
gIVencxPoinler, 145-7, 186-7
gIShadcModcl, 197-8, 213-4, 666 7
gl Viewport, 314-5, 399
678-9
glPolygonOOset, 214-5
gIPopMatrix, 295-6 glPopName, 712-3 glPushAltrib, 229-30
gITexCoord, 669-70, 672-9
Funciones de la biblioteca GLU gluBegint'urve, 480-1
gkKielNurbsProperty, 482-3
gluBeginSurface, 481-2
gluPcrspective, 398-9 gluPickMatrix, 712-3
gluBeginTrim, 483-4
glul oadSamplingMatriccs, 483^1
gluBuild*MipmapLevels, 678 9
gluLookAt, 397
gluBuild*Mipuuips, 678-9
gluPwlCurvc, 483-4
gluQuadricCallback.427 8 gluNewNurbsRenderer, 480-2
gluQuadricDrawStyle, 425-6
gluNewQuadrio, 425 6
gluQuadricNormals, 427-8
gluNurbsCallback, 483-4
gluQuadricOrientation, 426 7
gluDeleteNLirbsRenderer, 480-1
gluNurbsCallbaekData, 483^4
gluQuadricTexture, 679
gluDeleteQuadric, 426-7
gluNurbsCurve, 480 1
gluSphere, 425-6
gluDisk, 426 7
gluNurbsProperty, 481-2. 482-3
gluCylinder, 426-7
gluNurbsSurface. 481 2 gluFndt'urve, 480-1 gluFndSurface, 481-2
glu()rtho2D, 79, 88,314-5
gluEndTrim, 483-4
gUiPartialDisk, 426-7
Funciones de la biblioteca GLUT glutAddMeiuil'jitry, 717-8
glutDestroyWindow. 316-7
glut leoni fy Window, 317-8
glutAddSubMenu, 720-1
glutüetacliMenu, 7 2 3 ^
glutldleFune. 319-20, 772
glutAttachMenu, 717-8
gluiDeviceCìet, 710
glutBilmapCharacier, 155
glulDialsFunc, 711
glutini!, 76 7, 314-5
glulDisplayFunc, 76 7, 319-20
glullnilDisplayMode, 76 7, 182-3,
glull-ullScreen, 316-7
glutlnitWindowPosition, 76-7, 315-6
gluiBullonBoxFune, 711
315-6, 568-9, 772
glutCreateMenu, 717
glutini!WindowSize, 76-7, 315-6
glutCreateSuhWindow. 318 9
glulGct, 320
glutCreateWindow, 76-7, 315-6
glutGctMenu, 720-1
glulKeyboardFunc, 705
gluKiet Window, 316-7 glutDestroyMenu, 720
glutllideWindow. 318 9
glutMainLoop, 76-7, 319-20
índice de funciones OpenGL 895 glulMotionFunc, 705
glulSelWindow, 316-7
glutSlrokeCharacler, 155
gluíMouseFunc, 700 I
glulSetWindowTitle, 317-8
glutSwaplìullcrs, 666-7. 772
gluiShowWindow, 318-9 ;
glutPassiveMotionl imc, 705
glulTablelliuttonFunc, 710
glutPopWindow, 317-8
glutSolidCone. 424-5
gluiPosítionWindow, 316-7
glutSolidCube, 417
gliUPostRcdisplay. 319-20
glulSolidDodecahedron, 417
gluiPushWindow, 317 В
gliitSolidlcosahedron, 417-9
glutWireCube, 417
glutSolidOclahcdron, 417
glutWircDodccahcdron, 417
glutRemoveMcnullem, 723-4
gluiSolidSphere,424
glutWircIcosahedron, 417
glutReshapeFunc, 158 9, 317-8
glutSolidTeapot. 425-6
glutWircOctahcdron, 417
gluiReshapeW'indow, 316-7
glutSolidíetrahedron, 417
glulWircSphcrc, 424
glulTablelMoíionFunc, 710
glutWircConc, 424
glutSolidTorus, 424-5
glutWircTcapol, 425-6
gluiSeiColor, 184-5
glutSpaceballHuttonFune, 710
gl ut W i re I с l ra h cd ron, 417
glutSeiCursor, 318-9
glutSpaceballMotionFunc, 710
glutWireTorus, 424-5
glutSetlconTitle, 317-8
glutSpacebalIRotationFunc, 711
glutSetMcnu, 720
glulSpecialFunc, 707