|
Podemos pensar en un toride o toro como en un "donut" o un neumático. Es una forma que se usa mucho en operaciones de composición de objetos, de forma que POV-Ray ha adoptado esa función polinómica de cuarto grado como forma primitiva. Su sintaxis es muy sencilla, así que es sencillo aprender a usarla una vez que se ha comprendido lo que significan los dos valores que se deben indicar. En lugar de describirlos, creemos un objeto de este tipo y experimentemos con él.
Creamos un archivo llamado tordemo.pov
y escribimos:
#include "colors.inc" camera { location <0, .1, -25> look_at 0 angle 30 } background { color Gray50 } // para hacer el toro más visible light_source{ <300, 300, -1000> White } torus { 4, 1 // radio externo y grosor del toro rotate -90*x // para verlo de frente pigment { Green } }
Trazamos la escena. Bien, lo que vemos es una especie de neumático. Cambiemos el radio externo y el grosor y veamos qué pasa. Escribimos:
torus { 5, .25 // radio externo y grosor del toro
¡Esto parece un aro! Probemos lo siguiente:
torus { 3.5, 2.5 // radio externo y grosor del toro
Esto es... ¡Un neumático excesivamente inflado!
Con una sintaxis tan simple, no hay mucho que hacer con un toro salvo cambiarle la textura...¿no? Veamos...
Los toros son muy útiles en composición de formas. Hagamos un pequeño experimento. Veamos qué forma tiene la diferencia entre un toro y una caja:
difference { torus { 4, 1 rotate x*-90 // para verlo de frente } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } }
Interesante... medio toro. Ahora añadiremos otro al revés. Sólo hay que declararlo y hacer las transformaciones necesarias para usarlo en dos posiciones distintas:
#declare Medio_Toro = difference { torus { 4, 1 rotate -90*x // para verlo de frente } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } } #declare Rotacion = 180*x; #declare Trans_Toro = 8; // doble del radio externoAhora creamos la unión de dos semi-toros:
union { object { Medio_Toro } object { Medio_Toro rotate Rotacion translate Trans_Toro*x } }Esto produce un objeto con forma de S, pero no lo podemos ver totalmente desde la posición actual de la cámara. Añadamos unas cuantas piezas más de este tipo, moviendo nuestro objeto en la dirección del eje "z" y girándolo un poco con respecto al eje "y" para poder ver algo más. También observemos que aparece un pequeño vacío donde se juntan los dos semi-toros. Este defecto se debe al hecho de ver esta escena directamente desde el plano x-z (un defecto debido al tipo de cálculo que hace el programa; en general, no conviene que nuestra cámara coincida con un plano de alguna de las cajas usada en la imagen). Cambiamos la coordenada y de la cámara de 0 a 0.1 para evitar este defecto.
union { object { Medio_Toro } object { Medio_Toro rotate Rotacion translate x*Trans_Toro } object { Medio_Toro translate x*Trans_Toro*2 } object { Medio_Toro rotate Rotacion translate x*Trans_Toro*3 } object { Medio_Toro rotate Rotacion translate -x*Trans_Toro } object { Medio_Toro translate -x*Trans_Toro*2 } object { Medio_Toro rotate Rotacion translate -x*Trans_Toro*3 } object { Medio_Toro translate -x*Trans_Toro*4 } rotate y*45 translate z*20 }Al crear la imagen veremos una forma serpenteante muy curiosa. Pero querremos modelar algo más útil, que podamos encontrar en la vida real. ¿Qué tal una cadena?
Pensemos un momento. Hay que observar que un eslabón de una cadena
puede ser modelado de forma muy sencilla usando dos semi-toros y dos
cilindros. Creamos un nuevo archivo, en el que podemos usar el mismo
fondo, la cámara, la luz y las declaraciones de objetos que usamos en tordemo.pov
:
#include "colors.inc" camera { location <0, .1, -25> look_at 0 angle 30 } background { color Gray50 } light_source{ <300, 300, -1000> White } #declare Medio_Toro = difference { torus { 4,1 sturm rotate x*-90 // para verlo desde arriba } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } } #declare Rotacion = x*180; #declare Trans_Toro = 8;Ahora, creamos un toro completo a partir de dos semi-toros:
union { object { Medio_Toro } object { Medio_Toro rotate Rotacion } }Esto parece una forma algo artificiosa de crear un toro, pero realmente vamos a desplazar cada mitad para dejar sitio a los cilindros. Primero, declaremos los cilindros que vamos a usar:
#declare Segmento_Eslabon = cylinder { <0, 4, 0>, <0, -4, 0>, 1 pigment { Green } }Después añadiremos dos de estos cilindros a la unión de los dos semi-toros, trasladándolos de forma que queden alineados con el radio exterior de los toros a cada lado:
union { object { Medio_Toro } object { Medio_Toro rotate Rotacion } object { Segmento_Eslabon translate x*Trans_Toro/2 } object { Segmento_Eslabon translate -x*Trans_Toro/2 } }Ahora trasladamos los semi-toros en la dirección vertical para que sus extremos coincidan con los de los cilindros. La distancia coincide con la mitad de la definida como
Trans_Toro
:
union { object { Medio_Toro translate y*Trans_Toro/2 } object { Medio_Toro rotate Rotacion translate -y*Trans_Toro/2 } object { Segmento_Eslabon translate x*Trans_Toro/2 } object { Segmento_Eslabon translate -x*Trans_Toro/2 } }Trazamos el resultado y tenemos un eslabón de la cadena. ¡Pero aún no hemos acabado! ¿Alguien ha visto una cadena de color verde? Usemos una apariencia metálica sobre ellos. En primer lugar, borremos todos los pigmentos de las declaraciones de los toros y cilindros. Después, declaremos lo siguiente antes de la unión:
#declare Oro_Cadena = texture { pigment { BrightGold } finish { ambient .1 diffuse .4 reflection .25 specular 1 metallic } }Ahora, añadamos esta textura a la unión y nombrémosla apropiadamente:
#declare Eslabon = union { object { Medio_Toro translate y*Trans_Toro/2 } object { Medio_Toro rotate Rotacion translate -y*Trans_Toro/2 } object { Segmento_Eslabon translate x*Trans_Toro/2 } object { Segmento_Eslabon translate -x*Trans_Toro/2 } texture { Oro_Cadena } }por fin, uniremos dos eslabones. El segundo eslabón debe ser trasladado en dirección vertical de forma que su cara interior coincida con la cara interior del primer eslabón. La distancia adecuada debe ser el doble de la distancia
Trans_Toro
menos 2 (dos veces el radio
exterior). Esto puede escribirse mediante la expresión:
Trans_Toro*2-2*yDeclaramos la expresión como sigue:
#declare Trans_Eslabon = Trans_Toro*2-2*y;En el bloque en el que situemos el objeto, usaremos este valor multiplicándolo para insertar nuevos eslabones. Ahora, rotaremos el segundo eslabón
90*y
para que sea perpendicular al
primero (como los verdaderos eslabones de una cadena). Finalmente,
reduciremos el tamaño de la unión a un cuarto de su tamaño para poder
ver el resultado completamente:
union { object { Eslabon } object { Eslabon translate y*Trans_Eslabon rotate y*90 } scale .25 }Al trazar esto, podremos ver un par de eslabones muy realistas. Si queremos hacer una cadena completa, necesitamos declarar esta unión y crear otra unión usando como pieza este par de eslabones. Quitamos el escalado de la primera declaración para poder escalar sólo el objeto definitivo:
#declare Par_Eslabones = union { object { Eslabon } object { Eslabon translate y*Trans_Eslabon rotate y*90 } }Ahora declaramos nuestra cadena:
#declare Cadena = union { object { Par_Eslabones} object { Par_Eslabones translate y*Trans_Eslabon*2 } object { Par_Eslabones translate y*Trans_Eslabon*4 } object { Par_Eslabones translate y*Trans_Eslabon*6 } object { Par_Eslabones translate -y*Trans_Eslabon*2 } object { Par_Eslabones translate -y*Trans_Eslabon*4 } object { Par_Eslabones translate -y*Trans_Eslabon*6 } }Y, finalmente, situamos nuestra cadena añadiendo unas transformaciones para hacerla visible en su totalidad. Estas transformaciones incluyen escalarla un factor 1/10, trasladarla y girarla para poder ver bien todos los enlaces:
object { Cadena scale .1 rotate <0, 45, -45> }
El toro se puede usar para crear cadenas.
En la imagen podemos ver una cadena dorada que cruza diagonalmente
la pantalla.
|