|
Los Parches Bicúbicos (bicubic_patch) son representaciones superficiales útiles porque permiten una sencilla definición de superficies usando pocos puntos de control. Los puntos de control sirven para determinar la forma del parche. En vez de definir los vertices de triángulos, simplemente daremos las coordenadas de los puntos de control. Un parche simple tiene 16 puntos de control, uno en cada esquina y el resto posicionados para dividir el parche en secciones más pequeñas. POV-Ray no genera los parches directamente, si no que utilizará triángulos del modo descrito en la sección Lenguaje de Descripción Escénica.
Los Parches Bicúbicos son casi siempre utilizados para importar objetos creados en un modelador aparte, pero, para este tutorial, los manipularemos manualmente. Una lista de modeladores que utilizan Parches Bicúbicos y pueden ser exportados a POV-Ray puede ser encontrada en la sección de enlaces de www.povray.org.
Y ahora, crearemos una escena básica y empezaremos a explorar los Parches Bicúbicos.
#version 3.5; global_settings {assumed_gamma 1.0} background {rgb <1,0.9,0.9>} camera {location <1.6,5,-6> look_at <1.5,0,1.5> angle 40} light_source {<500,500,-500> rgb 1 } #declare B11=<0,0,3>; #declare B12=<1,0,3>; // #declare B13=<2,0,3>; #declare B14=<3,0,3>; // fila 1 #declare B21=<0,0,2>; #declare B22=<1,0,2>; // #declare B23=<2,0,2>; #declare B24=<3,0,2>; // fila 2 #declare B31=<0,0,1>; #declare B32=<1,0,1>; // #declare B33=<2,0,1>; #declare B34=<3,0,1>; // fila 3 #declare B41=<0,0,0>; #declare B42=<1,0,0>; // #declare B43=<2,0,0>; #declare B44=<3,0,0>; // fila 4 bicubic_patch { type 1 flatness 0.001 u_steps 4 v_steps 4 uv_vectors <0,0> <1,0> <1,1> <0,1> B11, B12, B13, B14 B21, B22, B23, B24 B31, B32, B33, B34 B41, B42, B43, B44 uv_mapping texture { pigment { checker color rgbf <1,1,1,0.5> color rgbf <0,0,1,0.7> scale 1/3 } finish {phong 0.6 phong_size 20} } no_shadow }
Los puntos B11, B14, B41 y B44 son las esquinas del parche. Los demás puntos son puntos de control. El nombre de los puntos asignados se "traduce" por: B para el color del parche, el primer dígito es el número de la fila y el segundo, el número de la columna. Si generamos la escena anterior, obtendremos un cuadrado ajedrezado azul y blanco. A continuación añadiremos algunas esferas para visualizar los puntos de control. Para ahorrarnos el teclear el codigo de 16 esferas, usaremos un array y un bucle para construirlas.
#declare Points=array[16]{ B11, B12, B13, B14 B21, B22, B23, B24 B31, B32, B33, B34 B41, B42, B43, B44 } #declare I=0; #while (I<16) sphere { Points[I],0.1 no_shadow pigment{ #if (I=0|I=3|I=12|I=15) color rgb <1,0,0> #else color rgb <0,1,1> #end } } #declare I=I+1; #end
Si generamos esta imagen, veremos nuestro parche con sus esquinas en rojo y los puntos de control en cian. Ahora empecemos a "explorar"
Cambiamos B41 a <-1,0,0>
y generamos imagen.
Cambiamos B41 a <-1,1,0>
y generamos imagen.
Cambiamos B41 a < 1,2,1>
y generamos imagen.
Ahora unos ejercicios con los puntos de control. Empezaremos con el
parche plano de nuevo.
Cambiamos B42 a <1,2,0>
y B43 a <2,-2,0>
y generamos imagen.
Devolvemos B42 y B43 a sus posiciones originales y cambiamos ahora B34
a <4,2,1>
y B24 a <2,-2,2>
para
volver a generar la imagen.
Traslade los puntos a un par de sitios más e inténtelo también con
los puntos de control del interior.
¿Han notado ya estas dos cosas?:
Volvamos a nuestro taller de splines y hechemos un vistazo a la curva spline bezier. De hecho, los puntos B11,B12,B13 y B14, forman una curva Bezier. Al igual que los puntos B11,B21,B31,B41, y los puntos B41,B42,B43,B44, y también los puntos B14,B24,B34,B44.
Hasta ahora, sólo hemos utilizado un parche, pero una de las ventajas del parche Bicúbico reside en el hecho de que pueden unirse suavemente para crear formas más grandes. El proceso de unirlos es tan simple, que sólo hay dos reglas a seguir. Esto puede ser hecho, bien usando una serie de macros, bien utilizando un modelador externo. Para dar una idea de lo que se necesita, utilizaremos este sencillo ejemplo hecho a mano.
Primero, pondremos el parche en nuestra escena, de vuelta a su
posición plana. Ahora cambiaremos #declare
B14=<3,0,3>; #declare B24=<3,2,2>; #declare
B34=<3.5,1,1> ; #declare B44=<3,-1,0>; #declare
B41=<0,-1,0>;
Retrasamos un poco la cámara camera
{location <3.1,7,-8> look_at <3,-2,1.5> angle 40}
y eliminamos el código de las esferas. Ahora trataremos de "coser"
un nuevo parche a la derecha del actual. Por supuesto que los
puntos del lado izquierdo (columna 1) del nuevo parche, deben
estar en la misma posición que los del lado contrario (columna 4)
del parche azul.
Generamos la imagen, incluyendo nuestro nuevo parche.
#declare R11=B14; #declare R12=<4,0,3>; // #declare R13=<5,0,3>; #declare R14=<6,0,3>; // fila 1 #declare R21=B24; #declare R22=<4,0,2>; // #declare R23=<5,0,2>; #declare R24=<6,0,2>; // fila 2 #declare R31=B34; #declare R32=<4,0,1>; // #declare R33=<5,0,1>; #declare R34=<6,0,1>; // fila 3 #declare R41=B44; #declare R42=<4,0,0>; // #declare R43=<5,0,0>; #declare R44=<6,0,0>; // fila 4 bicubic_patch { type 1 flatness 0.001 u_steps 4 v_steps 4 uv_vectors <0,0> <1,0> <1,1> <0,1> R11, R12, R13, R14 R21, R22, R23, R24 R31, R32, R33, R34 R41, R42, R43, R44 uv_mapping texture { pigment { checker color rgbf <1,1,1,0.5> color rgbf <1,0,0,0.7> scale 1/3 } finish {phong 0.6 phong_size 20} } no_shadow }
Aqui hemos obtenido un resultado más bien decepcionante. Los parches
están conectados, pero no forman una superficie continua y lisa. En
la unión de parches se aplican los mismos principios que vimos en el taller de splines. El punto de
control, el punto de conexión y el siguiente punto de control
deben estar alineados para crear una curva suave. Además es
preferible, pero no obligatorio, que ambos puntos de control sean
equidistantes del punto de conexión. Para el parche bicúbico
tenemos que hacer lo mismo con cada punto implicado en la
"costura" de los parches. Así que, en nuestro caso, los siguientes
puntos deberían estar alineados:
Para conseguirlo, podemos usar el siguiente código:
#declare R12=B14+(B14-B13); #declare R22=B24+(B24-B23); #declare R32=B34+(B34-B33); #declare R42=B44+(B44-B43);
Esto genera una superficie suavizada. Añadir un tercer parche enfrente, es relativamente simple ahora:
#declare G11=B41; #declare G12=B42; // #declare G13=B43; #declare G14=B44; // fila 1 #declare G21=B41+(B41-B31); #declare G22=B42+(B42-B32); // #declare G23=B43+(B43-B33); #declare G24=B44+(B44-B34); //fila 2 #declare G31=<0,0,-2>; #declare G32=<1,0,-2>; // #declare G33=<2,0,-2>; #declare G34=<3,2,-2>; // fila 3 #declare G41=<0,0,-3>; #declare G42=<1,0,-3>; // #declare G43=<2,0,-3>; #declare G44=<3,0,-3> // fila 4 bicubic_patch { type 1 flatness 0.001 u_steps 4 v_steps 4 uv_vectors <0,0> <1,0> <1,1> <0,1> G11, G12, G13, G14 G21, G22, G23, G24 G31, G32, G33, G34 G41, G42, G43, G44 uv_mapping texture { pigment { checker color rgbf <1,1,1,0.5> color rgbf <0,1,0,0.7> scale 1/3 } finish {phong 0.6 phong_size 20} } no_shadow }
Finalmente, pondremos unas esferas de vuelta en la escena y algunos cilindros para visualizar qué está ocurriendo. Observe qué sucede si movemos, por ejemplo B44, B43, B33 o B34.
#declare Points=array[8]{B33,B34,R32,B43,B44,R42,G23,G24} #declare I=0; #while (I<8) sphere { Points[I],0.1 no_shadow pigment{ #if (I=4) color rgb <1,0,0> #else color rgb <0,1,1> #end } } #declare I=I+1; #end union { cylinder {B33,B34,0.04} cylinder {B34,R32,0.04} cylinder {B43,B44,0.04} cylinder {B44,R42,0.04} cylinder {G23,G24,0.04} cylinder {B33,B43,0.04} cylinder {B43,G23,0.04} cylinder {B34,B44,0.04} cylinder {B44,G24,0.04} cylinder {R32,R42,0.04} no_shadow pigment {color rgb <1,1,0>} }
Las complicaciones al utilizar Parche Bicúbicos no vienen por usar varios parches. La dificultad estriba en mantener el control sobre la forma que queremos construir. A medida que se añaden más parches para conseguir un resultado suavizado, se complica la colocación de un monton de puntos de control.
|