3.4.5  Objeto Parche Bicúbico

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.

Bicubic_patch with control points
Parche Bicúbico (Bicubic_patch) con puntos de control

¿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); 
patches, (un)smoothly connected
Parches unidos abruptamente

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.

3 patches, some control points
3 parches y algunos puntos de control.