|
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 } }
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.
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 } }
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>;
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>;
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:
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.
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 } }
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);
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.
|