3.4.1  Objeto Torno (Lathe)

En el mundo real, el torno se usa para perfilar formas redondeadas sobre una pieza del material deseado, mientras ésta gira sobre su eje. El resultado es un artefacto elegantemente redondeado que puede ser usado en una gran diversidad de situaciones (patas de mesas, piezas de cerámica, etc). En POV-Ray, un objeto torno (lathe) se usa para crear el mismo tipo de objetos, a pesar de que nos referimos al objeto en sí, y no al modo de producirlo. Aquí incluimos algo de código para crear una pieza torneada muy sencilla (llamada lathdem1.pov)

  #include "colors.inc"
  background{White}
  camera {
    angle 10
    location <1, 9, -50>
    look_at <0, 2, 0>
  }
  light_source {
    <20, 20, -20> color White
  }
  lathe {
    linear_spline
    6,
    <0,0>, <1,1>, <3,2>, <2,3>, <2,4>, <0,4>
    pigment { Blue }
    finish {
      ambient .3
      phong .75
    }
  }
A simple lathe object
Un sencillo objeto torneado

Primero, se declaran seis puntos que el programa conecta con líneas. Observe que sólo indicamos dos componentes en los vectores que describen los puntos. Se asume que las líneas están trazadas sobre el plano x-y, y que el tercer componente es siempre 0 -imagine que estamos dibujando sobre una hoja de papel, sólo necesitamos dos dimensiones-. Es obligatorio usar vectores de dos componentes ya que usar vectores tridimensionales genera mensajes de error... con una excepción que veremos más adelante, cuando estudiemos las curvas spline.

Una vez que las líneas están determinadas, el programa rotará esta línea alrededor del eje Y, y si imaginamos que esta línea va dejando un rastro conforme gira, tendremos lo que será la superficie de nuestro objeto (al igual que un torno real, recortamos sobre un cilindro de material usando esta línea como patrón, y descartamos todo lo que queda en el exterior de ésta).

Los puntos especificados se conectan con líneas rectas ya que hemos utilizado un modo lineal llamado "linear_spline" para conectar los puntos. Hay más tipos de curvas spline disponibles para el torno que producirán curvas más suaves, redondeando las transiciones entre un tramo y otro, pero volveremos a ello en un momento.

Primero, comparemos las diferencias que hay entre el torno y la superficie de revolución (abreviado SOR, en inglés). El objeto SOR, descrito en un tutorial aparte, puede parecer similar al torno a primera vista. También hay que declarar una serie de puntos, conectarlos mediante una serie de líneas curvas y luego rotarlos sobre el eje Y. El torno tiene ciertas ventajas, como el hecho de poder elegir entre diferentes tipos de curvas: lineales, cuadráticas o cúbicas, y una cosa más:

El tipo de ecuaciones usadas para generar los objetos SOR, no permite girar las curvas sobre la misma coordenada Y. Esto es, cualquier curva que vuelva a pasar por la misma altura que una anterior, producirá un mensaje de error. Por ejemplo, imagine que queremos moldear un objeto con el torno desde <0,0> a <2,2>, y luego otra vez hacia abajo, a <4,0>. Rotar esto sobre el eje Y, producirá algo similar a un molde de gelatina - medio toro perforado en el centro. Intentar generar este objeto con una SOR, tan pronto como la curva gira hacia abajo se convierte en un mensaje de error.

A pesar de esto, las superficies de revolución tiene al menos un punto fuerte, debido a que las ecuaciones para generarlas son de orden inferior, suelen ser calculadas más rápidamente que un torno que tenga la misma forma. Para abreviar, usaremos una SOR si sus limitaciones nos lo permiten, pero cuando necesitemos una forma más flexible, usaremos el torno.

3.4.1.1  Entendiendo El Concepto de Curvas Spline

Durante el proceso de diseño de edificios, automóviles o aviones, las formas finales de los objetos se modelaban a tamaño real (o casi real) donde las curvas se representaban usando splines, largas tiras de plástico o metal moldeadas por pesos ubicados en posiciones específicas. Matemáticamente, estas curvas pueden ser descritas por la unión de secciones de polinomiales cúbicas cuyas primera y segunda derivadas son continuas entre cada sección de la curva. En Computación Gráfica, una spline es comúnmente referida como una curva compuesta de secciones polinomiales satisfaciendo ciertas condiciones de continuidad entre ellas.
(Extraído de http://www.dcc.uchile.cl/~cc52b/apuntes/CurvasSuperficies/curvas.html)

Sería de utilidad, para entender las curvas spline, que tuviéramos un Taller de Curvas Spline donde poder practicar manipulando tipos y puntos de curvas spline y observar los cambios producidos. Bueno, ¡hagamos uno!, ahora que sabemos cómo crear un torno básico, será fácil;

#include "colors.inc"
  camera {
    orthographic
    up <0, 5, 0>
    right <5, 0, 0>
    location <2.5, 2.5, -100>
    look_at <2.5, 2.5, 0>
  }
  /* éstos son los puntos de control que usaremos */
  #declare Punto_Rojo    = <1.00, 0.00>;
  #declare Punto_Naranja = <1.75, 1.00>;
  #declare Punto_Amarillo = <2.50, 2.00>;
  #declare Punto_Verde  = <2.00, 3.00>;
  #declare Punto_Azul   = <1.50, 4.00>;
  /* usaremos unos cilindros para visualizarlos */
  cylinder { Punto_Rojo, Punto_Rojo - <0,0,20>, .1
    pigment { Red }
    finish { ambient 1 }
  }
  cylinder { Punto_Naranja, Punto_Naranja - <0,0,20>, .1
    pigment { Orange }
    finish { ambient 1 }
  }
  cylinder { Punto_Amarillo, Punto_Amarillo - <0,0,20>, .1
    pigment { Yellow }
    finish { ambient 1 }
  }
  cylinder { Punto_Verde, Punto_Verde - <0,0,20>, .1
    pigment { Green }
    finish { ambient 1 }
  }
  cylinder { Punto_Azul, Punto_Azul- <0,0,20>, .1
    pigment { Blue }
    finish { ambient 1 }
  }
  /* y ahora crearemos un objeto torno, usando los puntos de control para ver la curva hemos creado */
  lathe {
    linear_spline
    5,
    Punto_Rojo,
    Punto_Naranja,
    Punto_Amarillo,
    Punto_Verde,
    Punto_Azul
    pigment { White }
    finish { ambient 1 }
  }
A simple "Spline Workshop"
Taller de Splines Casero

Todo esto puede parecer un poco complicado, pero con unas sencillas aclaraciones, entenderemos cómo funciona.

Primero, estamos usando una cámara ortográfica. Si aún no hemos leído nada sobre cámaras lo podemos resumir en que este tipo de cámaras elimina toda distorsión causada por la perspectiva y genera imágenes planas. Si tomamos una imagen lateral de nuestro objeto, el resultado es igual que si viéramos un panel de diseño de un programa CAD o dibujáramos el contorno del objeto sobre una hoja de papel. Hay varios modos de usar este nuevo modo de cámara, pero aquí lo estamos usando para poder ver el contorno de nuestro objeto torno y los cilindros que usamos para representar los puntos de control, lo que vemos en la imagen, es la curva que crea el torno, y no el torno en sí mismo. Para aumentar el efecto, eliminamos el sombreado con el acabado ambient 1, que además elimina la necesidad de crear fuentes de iluminación. También hemos situado este particular punto de vista de forma que <0,0> aparece en la parte inferior izquierda de nuestra escena.

Lo siguiente que hemos hecho es declarar un conjunto de puntos. Observe que hemos usado vectores tridimensionales para ello, en vez de los bidimensionales que se supone que han de tener los objetos torno. Ésta es la excepción que mencionamos antes. Cuando declaramos un vector tridimensional, y luego lo usamos en un objeto torno, éste sólo toma los dos primeros componentes del vector, ignorando el tercero, cualquiera que sea su valor. Esto nos es muy útil aquí, ya que nos permite simplificar el ejemplo.

Después hemos hecho un par de cosas con los puntos que hemos declarado. Primero los hemos usado para situar pequeños cilindros coloreados con su parte plana orientada hacia la cámara, y después, los hemos reutilizado para determinar la curva del torno.

Ya que intentar declarar vectores 2D puede ocasionar resultados no esperados, y no es precisamente lo que necesitan nuestras declaraciones de cilindros, podemos aprovechar la tendencia del torno a ignorar el tercer componente ajustando a 0 la coordenada z de los vectores 3D.

El resultado final es que: cuando generamos este código, vemos un torno blanco contra un fondo negro mostrándonos la curva que hemos declarado, mientras que los cilindros nos muestran dónde están los puntos de control sobre el plano XY. En este caso, es muy simple. Ya que hemos usado la spline lineal, nuestra curva son unas cuantas lineas rectas zigzagueando entre los puntos de control. Ahora cambiaremos las declaraciones de Punto_Rojo y Punto_Azul:

  #declare Punto_Rojo  = <2.00, 0.00>;
  #declare Punto_Azul = <0.00, 4.00>;
Moving some points of the spline
Moviendo algunos puntos de la spline

Volvemos a generar y vemos que las líneas de la curva del torno se han ajustado a la nueva posición de los puntos rojo y azul. ¿No es tan difícil, verdad?

Ahora intentaremos algo diferente. Primero, cambiamos la situación de los puntos de control:

  #declare Punto_Rojo    = <1.00, 0.00>;
  #declare Punto_Naranja = <2.00, 1.00>;
  #declare Punto_Amarillo = <3.50, 2.00>;
  #declare Punto_Verde  = <2.00, 3.00>;
  #declare Punto_Azul   = <1.50, 4.00>;
A quadratic spline lathe
Un torno con spline cuadrática

Ahora cambiaremos la declaración del torno sustituyendo linear_spline por quadratic_spline. Generamos y ¿qué tenemos?, bien, hay un par de cosas más que observar esta vez. Primero, vemos que en vez de líneas rectas hay tramos curvos conectando los puntos. Estos arcos están hechos a partir de curvas cuadráticas, por lo que nuestro torno parece más interesante ahora. Y además, Punto_Rojo ya no está conectado a la curva. ¿Quieren saber por qué?

Mientras que dos puntos cualesquiera son suficientes para determinar una recta, hacen falta al menos tres para determinar una curva cuadrática. POV-Ray necesita además de los dos puntos que conectan la curva que exista uno precedente para determinar la fórmula que los une. El problema viene al principio de la curva. Antes del primer punto de control no hay ningún punto previo. Así que necesitamos declarar uno. De otro modo, cuando usemos una curva cuadrática, debemos recordar que el primer punto que especificamos sólo le sirve al programa para determinar la curva que conectará los dos primeros puntos y que no se muestra como parte de la curva actual.

Una última cosa acerca de este ejemplo. A pesar de que nuestra curva está ahora formada por líneas redondeadas, las transiciones entre un punto y otro son... bueno, un poco bruscas, ¿no? Parece que las líneas hubieran sido conectadas en los puntos de forma equivocada. Dependiendo de lo que intentamos conseguir, esto puede ser aceptable, o podemos desear una forma más redondeada. Afortunadamente tenemos otra opción.

Las splines cuadráticas toman más tiempo de cálculo para ser procesadas que las splines lineales debido a que las matemáticas usadas son más complejas. Pero más tiempo requieren las splines cúbicas, que es el único modo de conseguir una figura realmente estilizada. Volvamos a nuestro ejemplo y reemplacemos quadratic_spline por cubic_spline. Generamos el fichero una vez más, y veamos los cambios producidos:

A cubic spline lathe
Un torno con spline cúbica

Mientras que una spline cuadrática necesita tres puntos para determinar la curva, una spline cúbica necesita cuatro. Así que, como era de esperar, Punto_Azul ha sido desconectado de la curva al igual que pasó antes con Punto_Rojo, ya que el primer y último punto declarados son tomados ahora como puntos de control para deformar la curva entre los puntos restantes. Pero, atentos a la transición que hay ahora desde Punto_Naranja hasta Punto_Amarillo y de nuevo hacia Punto_Verde. Ahora, en vez de tener transiciones bruscas, los segmentos de nuestra curva parecen unirse suavemente.

Para acabar, aún hay otro tipo de spline cuadrática, la bezier_spline. Este modelo necesita cuatro puntos por sección. El punto de inicio, el punto final, y dos puntos intermedios. Para usarla, necesitamos realizar unos pequeños cambios en nuestro modelo. Borremos el punto Amarillo y el cilindro Amarillo. Cambiemos los puntos a:

  #declare Punto_Rojo    = <2.00, 1.00>;
  #declare Punto_Naranja = <3.00, 1.50>;
  #declare Punto_Verde  = <3.00, 3.50>;
  #declare Punto_Azul   = <2.00, 4.00>;

Y cambiemos el torno a:

  lathe {
    bezier_spline
    4,
    Punto_Rojo,
    Punto_Naranja,
    Punto_Verde,
    Punto_Azul
    pigment { White }
    finish { ambient 1 }
  }

Los puntos de control verde y naranja no están conectados a la curva. Vamos a cambiarlos un poco de sitio, por ejemplo

#declare Punto_Naranja = <1.00, 1.50>;

Si dibujáramos una línea desde el punto de inicio hasta el siguiente punto de control, tendríamos una tangente de la curva que pasaría por el punto de inicio. Al igual que para el punto final, del azul al verde.

a bezier_spline lathe
un torno mediante curvas bezier

Un segmento spline es muy lindo, pero dos lo son aún más todavía. Así que añadiremos otro segmento y lo conectaremos con el punto azul. Un segmento tiene cuatro puntos de control, luego dos segmentos debe tener el doble, ocho puntos de control. El primer punto del segundo segmento es el mismo que el último punto del primero; es decir, el punto azul. Así que sólo hemos de añadir tres puntos más. También alejaremos un poco la cámara y añadiremos más cilindros para visualizar los nuevos puntos de control. He aquí la escena completa:

#include "colors.inc"
  camera {
    orthographic
    up <0, 7, 0>
    right <7, 0, 0>
    location <3.5, 4, -100>
    look_at <3.5, 4, 0>
  }
/* éstos son los puntos de control que usaremos */
  #declare Punto_Rojo    = <2.00, 1.00>;
  #declare Punto_Naranja = <1.00, 1.50>;
  #declare Punto_Verde  = <3.00, 3.50>;
  #declare Punto_Azul   = <2.00, 4.00>;
  #declare Punto_Verde2 = <3.00, 4.50>;
  #declare Punto_Naranja2= <1.00, 6.50>;
  #declare Punto_Rojo2   = <2.00, 7.00>;
/* usaremos unos cilindros para visualizarlos */


  cylinder { Punto_Rojo, Punto_Rojo - <0,0,20>, .1
    pigment { Red } finish { ambient 1 }
  }
  cylinder { Punto_Naranja, Punto_Naranja - <0,0,20>, .1
    pigment { Orange } finish { ambient 1 }
  }
  cylinder { Punto_Verde, Punto_Verde - <0,0,20>, .1
    pigment { Green } finish { ambient 1 }
  }
  cylinder { Punto_Azul, Punto_Azul- <0,0,20>, .1
    pigment { Blue } finish { ambient 1 }
  }
  cylinder { Punto_Verde2, Punto_Verde2 - <0,0,20>, .1
    pigment { Green } finish { ambient 1 }
  }
  cylinder { Punto_Naranja2, Punto_Naranja2 - <0,0,20>, .1
    pigment { Orange } finish { ambient 1 }
  }
  cylinder { Punto_Rojo2, Punto_Rojo2 - <0,0,20>, .1
    pigment { Red } finish { ambient 1 }
  }
/* y ahora crearemos un objeto torno, usando los puntos de control para ver la curva hemos creado */
  lathe {
    bezier_spline
    8,
    Punto_Rojo, Punto_Naranja, Punto_Verde, Punto_Azul
    Punto_Azul, Punto_Verde2, Punto_Naranja2, Punto_Rojo2
    pigment { White }
    finish { ambient 1 }
  }
two bezier_spline segments, not smooth
dos segmentos de un spline de tipo bezier, sin suavizar

Bonita curva, pero ¿y si lo que queremos es una curva más suave? Permítamonos hechar un vistazo a las tangentes que convergen en Punto_Azul, si dibujamos mentalmente unas líneas entre Punto_Verde y Punto_Azul, y entre Punto_Verde2 y Punto_Azul, obtendremos un ángulo, tan agudo como el "pico" de la curva. ¿Cómo conseguir un ángulo mayor? o ¿Qué hacer si queremos un ángulo de 180º? Intentemos mover el Punto_Verde2 a distintas posiciones para ver los cambios y situémoslo finalmente en : #declare Punto_Verde2 = <1.00, 4.50>; Una curva más estilizada. Si nos aseguramos de que los dos puntos de control y el punto que une ambos segmentos estén alineados, la curva es perfectamente suave. En general, esto puede ser conseguido mediante:

#declare Punto_Verde2 = Punto_Azul+(Punto_Azul-Punto_Verde);

smooth bezier_spline lathe
torno bezier_spline estilizado

El concepto de splines es útil y necesario, y volveremos a insistir en los objetos prisma y polígono. Pero no se preocupen, la única manera de aprender a hacer algo con ellas, es seguir experimentando.