6.5.1  Primitivas sólidas finitas

Existen catorce tipos distintos de formas primitivas sólidas finitas: burbuja (blob), cono (cone), cilindro (cylinder), campo de alturas (height_field), fractal julia (julia), torno (lathe), prisma (prism), esfera (sphere), tubo de esferas (spheresweep), superelipsoide (superellipsoid), superficie de revolución (sor), objeto texto (text) y toro (torus). Éstos tienen un interior bien definido, y pueden usarse en operaciones de Geometría Constructiva de Sólidos (CSG, véase la sección "Geometría Constructiva de Sólidos"). Son objetos finitos y responden a la acotacion automática. Puedes especificar un interior para estos objetos.

6.5.1.1  Burbuja (blob)

Las burbujas son un tipo de objeto interesante y flexible. Matemáticamente, son isosuperficies de campos escalares, esto es, su superficie está definida por la fuerza del campo en cada punto. Si esta fuerza es igual al valor de umbral, el punto está en la superficie.

Puedes imaginar cada componente del blob como un objeto flotanto en el espacio. Éste se rellena con un campo que tiene su máximo en el centro del objeto, y decae hasta cero en la superficie del objeto. La fuerza del campo de todos estos componentes se suma para formar el campo de la burbuja. Entonces POV-Ray busca los puntos en los que este campo tiene un valor dado, el valor del umbral. Todos estos puntos forman la superficie del objeto burbuja. Los puntos con un valor del campo mayor que el umbral están en el interior, mientras que los puntos con valor menor que el valor del campo se consideran exteriores.

Tambien puedes pensar en las burbujas de manera más sencilla, como si fueran una unión de componentes flexibles que se atraen o repelen entre ellos para formar una forma de burbuja, de aspecto orgánico. La superficie de los componentes se junta suavemente y los conecta como si estuviera hecha de miel o una sustancia similar.

La sintaxix del objeto blob es la siguiente:

BLOB:
    blob { BLOB_ITEM... [BLOB_MODIFIERS...]}
BLOB_ITEM:
    sphere{<Center>, Radius,
           [ strength ] Strength[COMPONENT_MODIFIER...] } |
    cylinder{<End1>, <End2>, Radius,
             [ strength ] Strength [COMPONENT_MODIFIER...] } |
    component Strength, Radius, <Center> |
    threshold Amount
COMPONENT_MODIFIER:
    TEXTURE | PIGMENT | NORMAL | FINISH | TRANSFORMATION
BLOB_MODIFIER:
    hierarchy [Boolean] | sturm [Boolean] | OBJECT_MODIFIER

Los valores por defecto son los siguientes:

hierarchy : on (activado)
sturm     : off (desactivado)
threshold : 1.0

La palabra reservada threshold va seguida de un valor de coma flotante que determina el valor de fuerza del campo para el que POV-Ray deberá buscar los puntos de la superficie. El valor por defecto es de 1.0. Siguiendo el rayo y viendo cómo le afecta cada uno de los componentes, POV-Ray encuentra los puntos del espacio en los que la fuerza del campo es igual al valor del umbral. La siguiente lista detalla algunas cosas que deberias conocer acerca del valor del umbral:

  1. El valor del umbral debe ser positivo.
  2. Un componente desaparece si el valor del umbral es mayor que la fuerza del componente.
  3. Tal como aumenta el valor del umbral, la superficie observable se acerca a los centros de los componentes.
  4. Tal como decrece el valor del umbral, la superficie observable se acerca a la superficie de los componentes.

Los componentes cilíndricos se especifican mediante la sentencia cylinder. El centro de las tapas del cilindro viene definido por los vectores <End1> and <End2>. A continuación va el valor de coma flotante que indica el radio, seguido del valor de coma flotante especificando la fuerza. Estos vectores y valores de coma flotante son obligatorios y deben de separase con comas. La palabra reservada strength puede preceder opcionalmente al valor de la fuerza. Las tapas en ambos extremos del cilindro son semiesfericas.

Los componentes esféricos se especifican mediante la sentencia sphere. La localizacion se define mediante el vector <Center>. A continuación vienen los valores de coma flotante que representan el radio y la fuerza. Estos vectores y valores de coma flotante son obligatorios y deben de separase con comas. La palabra reservada strength puede preceder opcionalmente al valor de la fuerza.

Normalmente usarás una sola textura para todo el objeto burbuja, y le aplicarás transformaciones para cambiar su tamaño, localización y orientación. Sin embargo, tanto las sentencias cylinder como sphere pueden poseer textura, pigmento, normal, acabado y transformación individuales. No puedes aplicar sentencias de interior individuales para cada componente, sólo para la burbuja completa.

Nota: mediante el escalado no uniforme de un componente esférico puedes crear componentes elipsoidales. La sección del tutorial acerca del "Objeto burbuja" ilustra el uso de texturas individuales para cada componente, y otros ejemplos con burbujas.


La palabra reservada component es un método obsoleto para especificar componentes esfericos, y se mantiene sólo por compatibilidad con versiones anteriores de POV-Ray. Si se usa, no puede llevar texturas o transformaciones individuales.


El parámetro strength de cada tipo de componente es un valor de coma flotante que especifica la fuerza del campo en el centro del componente. Ésta puede ser negativa o positiva. Un valor positivo hace que el componente atraiga a otros componentes, mientras que un valor negativo hace que los repela. Los componentes de burbujas diferentes no se influencian entre sí.

Deberías de tener en cuenta las siguientes consideraciones :

  1. El valor de la fuerza puede ser positivo o negativo. Cero no es un valor apropiado, ya que el resultado es como si no usaras este componente.
  2. Si la fuerza es positiva, POV-Ray añadirá el campo del componente en el espacio alrededor del centro del componente. Si la fuerza del campo añadida supera el umbral, la superficie se hará visible.
  3. Si el valor de la fuerza es negativo, POV-Ray restará el campo del componente del espacio alrededor del centro del componente. Esto sólo causará un efecto si hay componentes positivos en las cercanías, empujando la superficie de éstos desde el centro del componente negativo.

Tras los componentes y el valor opcional del umbral, puedes especificar opcionalmente los modificadores de burbujas. Éstos pueden ser cualquiera de los modificadores genéricos de objetos, o las palabras reservadas hierarchy (jerarquía) or sturm (método de cálculo más preciso).

Los componentes de cada burbuja se acotan internamente con una jerarquia de esferas de acotación, para acelerar las comprobaciones de intersección y otras operaciones. Usando la palabra reservada opcional hierarchy, seguida de un valor booleano opcional, se puede activar o desactivar esta característica, que por defecto está activada.

Los cálculos para las burbujas deben de ser muy precisos. Si se renderizan de manera incorrecta, puedes añadir la palabra reservada sturm, seguida de un valor booleano opcional, para activar o desactivar la resolución de raíces por el método Sturmian, más lento pero más preciso. Por defecto está desactivada.

Un ejemplo de burbuja de tres componentes:

BLOB:
 blob {
  threshold 0.6
  sphere { <.75, 0, 0>, 1, 1 }
  sphere { <-.375, .64952, 0>, 1, 1 }
  sphere { <-.375, -.64952, 0>, 1, 1 }
  scale 2
 }

Si tienes una burbuja de un solo componente, su superficie aparecerá idéntica al objeto usado, esto es, una esfera o un cilindro, con la superficie de la burbuja en el interior de la superficie del componente. La localización exacta de la superficie puede determinarse a partir de la ecuación de las burbujas ilustrada más abajo (probablemente nunca necesitarás conocerla, ya que las burbujas son más indicadas para modelar visualmente de forma aproximada).

Para los matemáticamente inclinados, he aquí la fórmula que POV-Ray usa internamente para crear las burbujas. No necesitas comprenderla para usar las burbujas. La densidad del campo de un componente es

Density of a blob field
Densidad del campo de una burbuja

donde distancia es la distancia desde un punto dado hasta el centro del componente esférico, o hasta el eje del componente cilíndrico. Esta fórmula tiene la bonita propiedad de que es exactamente igual la fuerza en el centro del componente, y decrece hasta 0 a una distancia del centro que es igual al valor del radio. La fórmula de la densidad para más de un componente es simplemente la suma de las densidades individuales de los componentes.

6.5.1.2  Caja (box)

Una simple caja puede definirse especificando dos de las esquinas de la caja, mediante la siguiente sintaxis de la sentencia box:

BOX:
    box
    {
        <Corner_1>, <Corner_2>
        [OBJECT_MODIFIERS...]
    }
The geometry of a box
Geometría de una caja

donde <Corner_1> y <Corner_2> son vectores que definen las coordenadas x, y, z de dos esquinas opuestas de la caja.

Nota: observa que las cajas siempre se definen con sus caras paraleas a los ejes de coordenadas. Más tarde puedes rotarlas para cambiar su orientación con la palabra reservada rotate.

Las cajas se calculan eficientemente, y sirven muy bien como forma de acotación (siempre que la acotación manual sea apropiada).

6.5.1.3  Cono (cone)

La sentencia cone crea un cono de longitud finita o un cono truncado. Su sintaxis es la siguiente:

CONE:
    cone
    {
        <Base_Point>, Base_Radius, <Cap_Point>, Cap_Radius
        [ open ][OBJECT_MODIFIERS...]
    }
The geometry of a cone
Geometria de un cono

Donde <Base_Point> y < Cap_Point> son vectores que definen las coordenadas x, y, z del centro de la base y cima del cono, y  Base_Radius y Cap_Radius son los valores de coma flotante de los radios correspondientes.

Normalmente, los extremos del cono están cerrados con discos planos paralelos entre sí y perpendiculares al eje del cono. Añadiendo la palabra reservada opcional open detrás de Cap_Radius se eliminan las tapas de los extremos, lo que resulta en un tubo cónico que parece un megáfono.

6.5.1.4  Cilindro (cylinder)

La sentencia cylinder crea un cilindro de longitud finita con tapas paralelas. Su sintaxis es la siguiente:

CYLINDER:
    cylinder
    {
        <Base_Point>, <Cap_Point>, Radius
        [ open ][OBJECT_MODIFIERS...]
    }
The geometry of a cylinder
Geometría de un cilindro

Donde <Base_Point> y <Cap_Point> son vectores que definen las coordenadas x, y, z de los extremos del cilindro, y Radius es un valor de coma flotante que especifica el radio.

Normalmente, los extremos del cilindro están cerrados por discos planos paralelos entre sí y perpendiculares al eje del cilindro. Añadiendo la palabra clave opcional open tras el radio, se eliminan las tapas de los extremos, siendo el resultado como un tubo hueco.

6.5.1.5  Campo de alturas (height_field)

Los campos de alturas son objetos rápidos y eficientes que se usan normalmente para crear montañas u otras superficies elevadas, con miles de triángulos en una malla. La sintaxis es la siguiente:

HEIGHT_FIELD:
    height_field{
      [HF_TYPE]
      "filename"
      [HF_MODIFIER...]
      [OBJECT_MODIFIER...]
    }
HF_TYPE:
    gif | tga | pot | png | pgm | ppm | jpeg | tiff | sys
HF_MODIFIER:
    hierarchy [Boolean]  |
    smooth               |
    water_level Level

Valores por defecto:

hierarchy   : on
smooth      : off
water_level : 0.0

Un campo de alturas es esencialmente un cuadrado de una unidad de lado con una superficie montañosa encima. La altura de la montaña en cada punto se toma del número de color, o índice de paleta, de los píxeles de una imagen gráfica. La altura máxima es 1, que corresponde al máximo valor posible del número de color o índice de paleta en el archivo de imagen.

The size and orientation of an un-scaled height field
Tamaño y orientación de un campo de alturas sin escalar.

La malla de triángulos corresponde directamente a los píxeles en el archivo de imagen. Cada cuadrado formado por cuatro píxeles vecinos está dividido en dos triángulos. Una imagen con resolución N*M píxeles tiene (N-1)*(M-1) cuadrados que están divididos en 2*(N-1)*(M-1) triángulos.

Relationship of pixels and triangles in a height field
Relación entre pixeles y triángulos en un campo de alturas.

La resolución del campo de alturas viene determinada por dos factores: la resolución de la imagen y la resolución de valores de color/índice. El tamaño de la imagen determina la resolución en las direcciones de los ejes X y Z. Cuanto más grande sea la imagen más triángulos se generaran, dando un aspecto más suave. La resolución de los valores de color/índice determina la resolución a lo largo del eje Y. Un campo de alturas generado a partir de una imagen de 8 bits sólo puede tener 256 alturas diferentes, mientras que con una imagen de 16 bits se pueden alcanzar hasta 65536 niveles diferentes. Lógicamente, la segunda imagen genera un campo de alturas con un aspecto mucho más suave en la dirección Y, siempre que la imagen se cree apropiadamente.

El tamaño o resolución de la imagen no afecta al tamaño del campo de alturas. Éste siempre tiene unas dimensiones de 1x1x1 antes de escalarse. Usar imágenes de mayor resoluciçón creará triángulos más pequeños, sin aumentar el tamaño del campo de alturas.

Existen ocho (o posiblemente nueve) tipos de archivos que pueden usarse para definir campos de alturas. El tipo de imagen usado en la generación del campo de alturas se especifica con una de las palabras claves gif, tga, pot, png, pgm, ppm, tiff, jpeg y posiblemente sys, que es el formato de imagen específico del sistema (p.ej. Windows BMP o Macintosh Pict). Si no especifica el tipo de archivo, se asume el mismo tipo que el archivo de salida, lo cual es útil si se está generando la imagen para el campo de alturas con otra escena de POV-Ray.

Los formatos GIF, PNG, PGM, TIFF y posiblemente SYS, son los únicos que pueden crearse usando programas de dibujo estándar. Aunque hay programas de dibujo capaces de manejar archivos TGA, no serán de mucha utilidad al crear los ficheros TGA especiales de 16 bits que requiere POV-Ray (véase más abajo y "HF_Gray_16" para conocer más detalles).

En los tipos de imagen que usan paleta de colores, como GIF, el número de color es el índice de la paleta en cada píxel. Usa un programa de dibujo para examinar la paleta de un archivo GIF. El primer color de la paleta corresponde al índice 0, el segundo al índice 1, el tercero al índice 2, y así sucesivamente hasta llegar al último índice, que es 255. Las partes de la imagen que usen valores bajos del índice corresponderán a las partes bajas del campo de alturas. Las partes de la imagen que usen valores altos del índice generarán las partes altas del campo de alturas.

Los campos de alturas creados a partir de archivos GIF sólo pueden tener 256 niveles de altura diferentes, ya que éste es el número maximo de colores que puede contener la paleta de un archivo GIF.

El color de la entrada en la paleta no afecta a la altura del píxel. La entrada 0 puede ser un color rojo, azul, negro o naranja, pero la altura de cualquier píxel que use esta entrada será siempre 0. El color de la entrada 255 puede ser índigo, rosa, blanco o azul celeste, pero la altura de cualquier píxel que use esta entrada será siempre 1.

Puedes crear imagenes GIF para usar como campos de alturas con un programa de dibujo, o un programa de generación de fractales como  Fractint.

Un archivo POT es esencialmente un GIF con una paleta de 16 bits. El máximo número de colores que puede almacenar un archivo POT es 65536. Ello significa que un campo de alturas basado en un archivo POT puede tener hasta 65536 niveles de altura, lo cual hace posibles campos de alturas mucho más suaves.

Nota: observa que la altura máxima sigue siendo 1, aunque con este tipo de archivo caben muchos más valores intermedios.

En el momento de escribir esta ayuda, el único programa que sepamos que crea  archivos POT es FRACTINT, un programa freeware para MS-DOS/Windows. Los archivos POT generados por este programa crean fantásticos terrenos.

Los formatos de archivo TGA y PPM pueden usarse como almacenamiento para números de 16 bits, el lugar de usarlos como archivos de imagen. Estos formatos usan los bytes verde y rojo de cada píxel para almacenar los bytes alto y bajo de un valor de altura. Resultan en campos de alturas tan suaves como los generados por archivos POT, pero tienen la ventaja de poder generarse con programas especiales o hechos a propósito. Existen varios programas que pueden generar archivos TGA para campos de alturas en el formato que usa POV, como  Gforge o Terrain Maker.

En el formato PNG, el campo de alturas se almacena normalmente en forma de una imagen de escala de grises, donde el negro corresponde a la altura más baja y el blanco a la más alta posible. Debido a que los archivos PNG pueden almacenar hasta 16 bits en este formato, resultan tan suaves como las imágenes TGA o PPM. Al ser una escala de grises, tienen la ventaja de que pueden ser visualizados con cualquier programa de visualizacion de imágenes. El programa gforge puede crear este tipo de archivos. Las imagenes PNG en color se usarán de la misma forma que las imágenes TGA o PPM.

El formato SYS es específico de la plataforma. Consulta la documentacion específica de tu plataforma (sección 1) para conocer más detalles.

Además de los modificadores normales de objeto, existen tres modificadores adicionales disponibles en los campos de alturas:

El parámetro opcional water_level tras el nombre del fichero, seguido de valor de coma flotante, indica a POV-Ray que debe ignorar las partes del campo de alturas por debajo de ese valor. El valor por defecto es 0, y los valores posibles van de 0 a 1. Por ejemplo,  water_level 0.5 le dice a POV-Ray que debe renderizar solo la mitad superior del campo de alturas, ya que el resto se considera por debajo del "nivel del agua" (water level). Usar este parámetro hace que renderice más rapido que si recortamos la parte inferior con una operacion CSG o de recorte.  El término proviene del uso popularizado de los campos de alturas para renderizar terrenos. Un campo de alturas puede usarse para crear islas, mientras que otra forma puede usarse para simular el agua alrededor de estas islas. La porción del campo de alturas que queda oculta por el agua puede eliminarse entonces con water_level. Este parámetro también se usa para recortar valores bajos no deseados en un capo de alturas. Si tuviéramos una imagen con un fractal sobre un fondo cuyo entrada de paleta es 0, podriamos usar  water_level 0.001 para eliminar la altura representada por el fondo en el campo de alturas.

Normalmente los campos de alturas tienen un aspecto facetado ya que están hechos de muchos triángulos planos. Añadiendo la palabra clave  smooth, POV-Ray modifica los vectores normales de la superficie de los triángulos, de manera que la iluminación y sombreado de éstos tenga un aspecto suave. Ello permite usar archivos con resolución más baja de la necesaria, aunque el tiempo de renderizado aumenta. Por defecto esta característica está desactivada.

Para acelerar las comprobaciones de interseccion, está disponible una jerarquia de acotación. Por defecto está activada, aunque puede desactivarse usando  hierarchy off para mejorar la velocidad de renderizado en campos de alturas pequeños (esto es, imágenes de baja resolución). Opcionalmente puedes usar un valor booleano, como  hierarchy on o hierarchy off.

6.5.1.6  Fractal Julia (julia_fractal)

El objeto fractal julia es un corte 3-D de un objeto 4-D creado por generalizacion del proceso usado en los clásicos conjuntos Julia. Puedes crear una gran variedad de objetos extraños con la sentencia julia_fractal, incluyendo algunos que asemejan a columnas retorcidas de caramelo. Su sintaxis es la siguiente:

JULIA_FRACTAL:
    julia_fractal
    {
        <4D_Julia_Parameter>
        [JF_ITEM...] [OBJECT_MODIFIER...]
    }
JF_ITEM:
    ALGEBRA_TYPE | FUNCTION_TYPE | max_iteration Count |
    precision Amt | slice <4D_Normal>, Distance
ALGEBRA_TYPE:
    quaternion | hypercomplex
FUNCTION_TYPE:
    QUATERNATION: 
         sqr | cube
    HYPERCOMPLEX:
         sqr | cube | exp | reciprocal | sin | asin | sinh |
         asinh | cos | acos | cosh | acosh | tan | atan |tanh |
         atanh | ln | pwr( X_Val, Y_Val )

Éstos son los valores por defecto:

ALGEBRA_TYPE    : quaternion
FUNCTION_TYPE   : sqr
max_iteration   : 20
precision       : 20
slice, DISTANCE : <0,0,0,1>, 0.0

El vector 4-D obligatorio <4D_Julia_Parameter> corresponde al parámetro p de los conjuntos Julia clásicos, según la formula f(h) + p. El objeto fractal julia se calcula usando un algoritmo que determina si un punto arbitrario h(0) del espacio 4-D está dentro o fuera del objeto. El algoritmo requiere que se genere la secuencia de vectores h(0), h(1), ... por iteración de la fórmula h(n+1) = f(h(n)) + p (n = 0, 1, ..., max_iteration-1), donde p es el vector 4-D fijo o parámetro del fractal julia, y  f() es una de las funciones sqr, cube, ... especificada por la presencia de la palabra clave correspondiente. El punto h(0) con el que comienza la secuencia se considera en el interior del fractal julia si ninguno de los vectores en la secuencia escapa de una hiperesfera de radio 4 alrededor del origen, antes de que el número de iteraciones alcance el valor entero max_iteration. Tal como incrementes max_iteration, algunos puntos que antes no escapan lo harán ahora, formando el fractal julia. Dependiendo del valor de <4D_Julia_Parameter>, el objeto fractal julia puede no tener una superfice conectada, estando formado por una nube de polvo fractal. Usando valores bajos de max_iteration podemos fundir este polvo para hacer un objeto sólido. Los valores altos de  max_iteration incrementan la precisión, pero también el tiempo de renderizado. Aunque no sean tan precisas, las formas que se pueden obtener con valores bajos pueden ser muy interesantes. Si no se pecifica, el valor por defecto es max_iteration 20.

Como el objeto matemático definido por este algoritmo es cuatridimensional, y POV-Ray renderiza solo objetos tridimensionales, debe haber alguna forma de reducir el número de dimensiones del objeto de 4 a 3. Esto se consigue intersectando el fractal 4-D con un "plano 3-D", definido por el modificador slice, y proyectando la intersección en el espacio 3-D. Este modificador va seguido de un vector 4-D y valor de coma flotante separados por una coma. El plano de corte (slice) es el espacio 3-D que es perpendicular a  <4D_Normal> y que está a  Distance unidades del origen. No sepuede usar vectores <4D_Normal> de longitud 0, ni con un cuarto componente igual a 0. Si no se especifica, el valor por defecto es slice <0,0,0,1>,0.

Podrás comprender mejor la naturaleza cuatridimensional del fractal julia si utilizas las posibilidades de animacion de POV-Ray para variar el parámetro de la distacia de corte Distance. Puedes hacer que el fractal julia aparezca de la nada, crezca y después disminuya hasta la nada otra vez, tal como varía la distancia de corte. El efecto es similar a la sección transversal de un objeto 3-D cuando se mueve el plano 2-D de corte.

El prametro precision es un valor de tolerancia que se usa al determinar si los puntos están dentro o fuera del objeto fractal. Los valores grandes dan resultados más precisos, pero también más lentos de renderizar. Usa valores tan bajos como te sea posible sin degradar visiblemente la apariencia del objeto fractal, aunque observa que los valores mayores de 1.0 se recortan a 1.0. El valor pordefecto si no se especifica es precision 20.

La presencia de las palabras clave quaternion o hypercomplex determina el tipo de algebra 4-D se usará para calcular el fractal. El algoritmo por defecto es quaternion. Ambos son generalizaciones 4-D de los números complejos, aunque ninguno satisface todas las propiedades el campo (todas las propiedades de los números reales y complejos). Los quaterniones tienen la propiedad de multiplicación no conmutativa, y los hipercomplejos pueden no tener la propedad multiplicativa inversa para algunos elementos distintos de 0 (está probado que no se pueden generalizar números complejos en cuatro dimensiones con todas las propiedades intactas,). Ambas algebras fueron descubiertas en el siglo XIX. De las dos, los quaterniones se conocen mucho mejor, aunque se puede argüir que los números hipercomplejos son más útiles para nuestros propósitos, ya que las funciones de valoración compleja como seno, coseno, etc..., pueden generalizarse para funcionar con números hipercomplejos de forma uniforme.

Para satisfacer la curisidad matemática de algunos, diremos que las propiedades algebraicas de estas dos álgebras pueden derivarse de los vectores unitarios base 1 = <1,0,0,0>, i=< 0,1,0,0>, j=<0,0,1,0> y k=< 0,0,0,1>. En ambas álgebras, se cumple que 1 x = x 1 = x para cualquier valor de x (1 es la identidad multiplicativa). Los vectores base 1 e i se comportan exactamente como los familiares números complejos 1 e i en ambas álgebras.

Reglas de multiplicacion de los vectores base del Quaternion
ij = k jk = i ki = j
ji = -k kj = -i ik = -j
ii = jj = kk = -1 ijk = -1    
Reglas de multiplicacion de los vectores base del Hypercomplex
ij = k jk = -i ki = -j
ji = k kj = -i ik = -j
ii = jj = kk = -1 ijk = 1    

Se usa un cálculo de estimación de la distancia para acelerar el cálculo de los quaterniones. La prueba de que esta fórmula de estimacion de la distancia funciona no se puede generalizar de dos a cuatro dismensiones, pero la fórmula parece funcionar bien de todas formas, ¡a pesar de la ausencia de prueba!

La presencia de alguna de las funciones sqr, cube, etc. determina la función que se usará para f(h) en la fórmula h(n+1) = f(h(n)) + p. La función por defecto es la raíz cuadrada sqr. La mayoría de las funciones sólo se pueden usar si la palabra clave hypercomplex está presente. Sólo las funciones sqr y cube funcionan con quaternion. Las funciones son funciones complejas típicas generalizadas a cuatro dimensiones. Veamos cómo se transforma el valor 4-D h para cada función:

Mapeo del valor 4-D h para cada función
sqr h*h
cube h*h*h
exp e elevado a la potencia h
reciprocal 1/h
sin seno de h
asin arcoseno de h
sinh seno hiperbólico de h
asinh seno hiperbólico inverso de h
cos coseno de h
acos arcocoseno de h
cosh coseno hiperbólico de h
acosh coseno hiperbólico inverso de h
tan tangente de h
atan arcotangente de h
tanh tangente hiperbólica de h
atanh tangente hiperbólica inversa de h
ln logaritmo natural de h
pwr(x,y) h elevado a la potencia compleja x+iy

Veamos un simple ejemplo de un objeto fractal julia:

 julia_fractal {
  <-0.083,0.0,-0.83,-0.025>
  quaternion
  sqr
  max_iteration 8
  precision 15
 }

Los primeros renderizados de fractales julia usando quaterniones fueron realizados por Alan Norton, y más tarde por John Hart en los años 80. Esta implementacion en POV-Ray sigue los pasos de Fractint más allá de la literatura conocida, por medio del uso de números hipercomplejos y mediante la generalizacion de la fórmula iterativa para usar varias funciones transcendentales en lugar de la clásica fórmula mandelbrot z2+c. Con dos dimensiones extra y ocho funciones a su disposición, los exploradores intrépidos deberían de ser capaces de localizar nuevas bestias fractales en el hiperespacio: ¡ponte a ello!

6.5.1.7  Torno (lathe)

El objeto lathe se genera por rotación de una curva bidimensional alrededor de un eje. Esta curva se define mediante un conjunto de puntos que se conectan de forma lineal o con curvas spline cuadráticas, cúbicas o bezier. La sintaxis es la siguiente:

LATHE:
    lathe
    {
        [SPLINE_TYPE] Number_Of_Points, <Point_1>
        <Point_2>... <Point_n>
        [LATHE_MODIFIER...]
    }
SPLINE_TYPE:
    linear_spline | quadratic_spline | cubic_spline | bezier_spline
LATHE_MODIFIER:
    sturm | OBJECT_MODIFIER

Los valores por defecto son:

SPLINE_TYPE   : linear_spline
sturm         : off

El primer ítem es la palabra clave que especifica el tipo de spline. El valor por defecto, si no se espcifica, es linear_spline. El valor entero obligatorio Number_Of_Points especifica cuántos puntos bidimensionales se usarán para definir la curva. Los puntos van a continuación especificados mediante vectores 2-D. La curva no se cierra automáticamente, esto es, los puntos primero y último no se conectan automáticamente: tendrás que hacerlo tú mismo si deseas una curva cerrada. La curva así definida se rota alrededor del eje y para formar el objeto torneado, centrado en el origen.

El siguiente ejemplo crea un simple objeto torneado que parece un cilindro de pared delgada:

 lathe {
  linear_spline
  5,
  <2, 0>, <3, 0>, <3, 5>, <2, 5>, <2, 0>
  pigment {Red}
 }

El cilindro tiene un radio interior de 2 unidades y un radio exterior de 3, resultando en un muro cilíndrico de 1 unidad de grosor. Su altura es de 5 unidades y está posicionado en el origen y apuntando hacia arriba a lo largo del eje y.

Nota: el primero y último puntos son el mismo para obtener una curva cerrada.

Las curvas spline que se usan en los objetos torno y prisma son algo difíciles de comprender. El propósito básico de las splines es dibujar una curva a lo largo de un conjunto de puntos dado, de una forma determinada. La spline lineal usada por defecto es la más simple, ya que consiste simplemente en unir los puntos consecutivos mediante una línea. Esto significa que la curva dibujada entre dos puntos sólo depende de estos dos puntos, sin tomar en cuenta ninguna información adicional. Las otras curvas son diferentes en cuanto que también tienen en cuenta otros puntos además de los que está conectando. Así se crea una curva suave y, en el caso de la spline cúbica, produce transiciones más suaves en cada punto.

La palabra clave quadratic_spline crea splines hechas con curvas cuadráticas. Cada una de ellas conecta dos puntos consecutivos. Como estos dos puntos (llamémosles segundo y tercero) no son suficientes para describir una curva cuadratica, el punto precedente al segundo se toma en cuenta para dibujar la curva. Matemáticamente, la relación (su localizacion relativa en el plano 2-D) entre el primer y el segundo punto determina la pendiente de la curva en el segundo punto. La pendiente de la curva en el tercer punto está fuera de control. Así, las splines cuadráticas son mucho más suaves que las lineales, pero las transiciones en cada punto no lo son, ya que las pendientes a ambos lados del punto son diferentes.

La palabra clave cubic_spline crea splines que solucionan el problema de transición de las cuadráticas, ya que toman en cuenta un cuarto punto al dibujar la curva entre el segundo y tercer puntos. La pendiente en el tercer punto está ahora bajo control y permite obtener transiciones suaves en cada punto. Así, las splines cúbicas producen las curvas más flexibles y suaves.

La spline bezier_spline es un tipo alternativo de spline cúbica. Los puntos 1 y 4 especifican los puntos finales de un segmento, mientras que los punos 2 y 3 son puntos de control que especifican la pendiente en los puntos extremos. Los puntos 2 y 3 no pertenecen a la spline, sólo ajustan su pendiente. Si dibujas una línea imaginaria entre los puntos 1 y 2, ésta representa la pendiente en el punto 1, ya que es tangente a la curva en este punto. Cuanto más grande es la distancia entre los puntos 1 y 2, más plana será la curva. Con tangentes más cortas la spline se dobla más. Lo mismo es cierto también para los puntos 3 y 4. Si quieres que la spline sea suave entre los segmentos, los puntos 3 y 4 de un segmento y los puntos 1 y 2 del siguiente deben formar una línea recta, y el punto 4 de un segmento debe ser el mismo que el punto 1 del siguiente segmento.

Observa que el número de segmentos de la spline, esto es, de curvas entre dos puntos, depende del tipo de curva spline utilizado. Con las splines lineales obtienes n-1 segmentos que conectan los puntos P[i], i=1,...,n. Una spline cuadrática genera n-2 segmentos, ya que el primer punto sólo se usa para determinar la pendiente, como se explicaba anteriormente (con lo que necesitas al menos 3 puntos para definir una spline cuadrática). Lo mismo podemos decir de las splines cúbicas, donde obtienes n-3 segmentos, ya que el primero y el último puntos sólo se usan para los cálculos de las pendientes (con lo cual necesitarás al menos 4 puntos). Las splines bezier necesitan 4 puntos por segmento, creando n/4 segmentos.

Si deseas obtener una spline cerrada con los tipos cuadrático o cubico, y con transiciones suaves en los puntos de los extremos, deberás asegurarte de que se cumplan ciertas condiciones. En el caso de las splines cúbicas, verifica que P[n-1] = P[2] (para cerrar la curva), P[n] = P[3] y P[n-2] = P[1] (para suavizar la transición). En el caso de las cuadráticas, debe cumplirse que P[n-1] = P[1] (para cerrar la curva) y P[n] = P[2].

La palabra clave sturm puede usarse para activar la utilización de la resolución de raíces "Sturmian", más lenta pero más precisa. Deberás usarla si la forma del objeto no se renderiza correctamente. En el caso de las splines lineales no es necesario su uso.

6.5.1.8  Prisma (prism)

El objeto prisma (prism) se genera especificando una o más curvas cerradas de dos dimensiones en el plano x-z, y girándolas alrededor del eje y. Estas curvas están definidas por un conjunto de puntos conectados por splines lineales, cuadráticas, cúbicas o bezier. La sintaxis del prisma es la siguiente:

PRISM:
    prism
    {
        [PRISM_ITEMS...] Height_1, Height_2, Number_Of_Points,
        <Point_1>, <Point_2>, ... <Point_n>
        [ open ] [PRISM_MODIFIERS...]
    }
PRISM_ITEM:
    linear_spline | quadratic_spline | cubic_spline |
    bezier_spline | linear_sweep | conic_sweep
PRISM_MODIFIER:
    sturm | OBJECT_MODIFIER

Valores por defecto del prisma:

SPLINE_TYPE   : linear_spline
SWEEP_TYPE    : linear_sweep
sturm         : off

Los primeros ítems definen el tipo de spline y el tipo de giro. Por defecto éstas serán lineales (linear_spline y linear_sweep). A continuación vienen dos valores de coma flotante Height_1 y Height_2 que representan las coordenadas y de los extremos superior e inferior del prisma. Tras ellos viene otro valor de coma flotante que especifica el número de puntos 2-D que se usarán para definir el prisma (incluyendo todos los puntos de control necesarios en el caso de splines cuadráticas, cúbicas o bezier). Después hay que especificar el número indicado de vectores 2-D que definen la forma en el plano x-z.

La interpretación de los puntos depende del tipo de spline. El objeto prisma permite usar cualquier número de sub-prismas contenidos en la sentencia del prisma (siempre del mismo tipo de spline y giro). Allí donde un número par de prismas se superpongan aparecerá un agujero.

Nota: no es obligatorio tener múltiples sub-prismas, y si los hay, no es necesario que se superpongan.

Cuando se usa linear_spline el primer punto especificado es el comienzo del primer sub-prisma. Los puntos siguientes se conectan con líneas rectas. Si especificas un valor idéntico al primer punto, se considera que se está cerrando el primer sub-prisma, con lo que el siguiente punto será el comienzo de un nuevo sub-prisma. Cuando vuelvas a especificar el valor del primer punto del sub-prisma éste se cerrará. Cada uno de los sub-prismas debe cerrarse mediante la repeticion del primer punto al final de la secuencia de puntos de ese sub-prisma. En el siguiente ejemplo tenemos dos sub-prismas rectangulares concéntricos para crear un marco.

 prism {
  linear_spline
  0, 1, 10,
  <0,0>, <6,0>, <6,8>, <0,8>, <0,0>,  //perfil exterior
  <1,1>, <5,1>, <5,7>, <1,7>, <1,1>   //perfil interior
 }

El último sub-prisma de un prisma con spline lineal se cierra automáticamente (al igual que el último sub-polígono en un objeto polígono) si el primero y último puntos del sub-prima no son el mismo. Esto hace que se pueda convertir fácilmente entre polígonos y primas. Las splines cuadráticas, cúbicas y bezier nunca se cierran automáticamente.

Cuando se usa quadratic_spline, cada sub-prisma necesita un punto de control adicional al principio de la secuencia de puntos de ese prisma, para determinar la pendiente al principio de la curva. El primer punto especificado es el punto de control, que en realidad no forma parte de la curva. El segundo punto es realmente el primero de la curva spline. El sub-prisma acaba cuando este segundo punto se repite. El siguiente punto es el punto de control del inicio del siguiente sub-prisma. El punto después de éste es el primer punto del segundo sub-prisma. Veamos un ejemplo:

 prism {
   quadratic_spline
   0, 1, 12,
   <1,-1>, <0,0>, <6,0>, //perfil exterior: <1,-1> es el punto de control y
   <6,8>, <0,8>, <0,0>,  //<0,0> es el valor del primer y último puntos

   <2,0>, <1,1>, <5,1>,  //perfil interior; <2,0> es el punto de control y 
   <5,7>, <1,7>, <1,1>   //<1,1> es el valor del primer y último puntos.
 }

CUando se usa cubic_spline, cada sub-prisma necesita dos puntos de control adicionales: uno al principio de la secuencia de puntos de cada sub-prisma para determinar la pendiente inicial de la curva, y otro al final. El primer punto especificado es el punto de control, que no forma parte de la curva. El segundo punto es el primero de la curva spline. El sub-prisma finaliza cuando éste se repite. El siguiente punto es el punto de control del final del primer sub-prisma. A continuación viene el punto de control inicial del siguiente sub-prisma. El siguiente punto es el primer punto del segundo sub-prisma.

Veamos un ejemplo:

 prism {
   cubic_spline
   0, 1, 14,
   <1,-1>, <0,0>, <6,0>, //perfil exterior; el primer punto de control es <1,-1> y
   <6,8>, <0,8>, <0,0>,  //<0,0> es el valor del primer y último puntos.
   <-1,1>,               //El punto de control final del primer sub-prisma es <-1,1>

   <2,0>, <1,1>, <5,1>,  //perfil interior; el punto de control incial es <2,0> y
   <5,7>, <1,7>, <1,1>,  //<1,1> es el valor del primer y último puntos.
   <0,2>                 //El punto de control final del segundo sub-prisma es <0,2>
 }

La curva bezier_spline es una forma alternativa de spline cúbica. Los puntos 1 y 4 especifican los puntos extremos del segmento, mientras que los puntos 2 y 3 son puntos de control que especifican la pendiente de la curva en los extremos. Los puntos 2 y 3 no pertenecen a la curva, sólo ajustan la pendiente de ésta. Si dibujas una línea imaginaria entre los puntos 1 y 2, ésta representa la pendiente en el punto 1. Es la tangente de la curva en el punto 1. Cuanto mayor sea la distancia entre los puntos 1 y 2, más plana será la curva. Usando tangentes cortas obtendrás curvas mas acentuadas. Lo mismo se puede decir de los puntos 3 y 4. Si quieres que la curva sea suave entre los segmentos, los puntos 3 y 4 de un segmento y los puntos 1 y 2 del siguiente deben formar una línea recta, siendo el punto 4 el mismo que el punto 1 del siguiente segmento.

Por defecto se usa un giro lineal para crear el prisma. Esto es, las paredes del prisma son perpendiculares al plano x-z (el tamaño de la curva no cambia durante el giro). Puedes usar también el giro cónico (conic_sweep)  que crea un prisma con muros cónicos por disminución de la curva durante el giro.

Al igual que los cilindros, los prismas están cerrados normalmente. Puedes quitar las tapas de los extremos mediante el modificador open. Si lo haces, no deberías usar el prisma en operaciones CSG, ya que los resultados pueden ser erróneos.

Para una explicación del concepto de spline, véase la descripción del objeto "Torno (lathe)". También deberías leer las partes de los tutoriales referentes a los objetos torno y prisma.

La palabra clave sturm especifica un método más lento, pero más preciso, para resolver raíces (Sturmian) que puede usarse con las splines cúbicas y bezier, si la forma del prisma no se renderiza correctamente. Los prismas que usan las splines lineal y cuadrática no necesitan usar este método.

6.5.1.9  Esfera (sphere)

La sintaxis del objeto sphere es la siguiente:

SPHERE:
    sphere
    {
        <Center>, Radius
        [OBJECT_MODIFIERS...]
    }
The geometry of a sphere
Geometría de una esfera

Donde <Center> es un vector que especifica las coordenadas x,y,z del centro de la esfera, y  Radius es un valor de coma flotante que especifica el radio. Las esferas pueden escalarse de forma no uniforme para crear formas elipsoides.

Debido a que la esfera está altamente optimizada, es una forma muy adecuada para usar en la acotación de otras formas (si es que ésta se cree conveniente).

6.5.1.10  Trayectoria de esferas (spheresweep)

La sintaxis del objeto sphere_sweep es la siguiente:

SPHERE_SWEEP:
sphere_sweep {
  linear_spline | b_spline | cubic_spline
  NUM_OF_SPHERES,

  CENTER, RADIUS,
  CENTER, RADIUS,
  ...
  CENTER, RADIUS
  [tolerance DEPTH_TOLERANCE]
  [OBJECT_MODIFIERS]
}

Valores por defecto:

tolerance : 1.0e-6 (0.000001) 

Este objeto equivale a la trayectoria de una esfera de radio variable en movimiento, o dicho de otra forma, el espacio ocupado por una esfera durante su movimiento a lo largo de una spline.

El objeto se modela especificando una lista de esferas simples que se interpolan. Se ofrecen tres tipos de interpolación:

La lista de esferas (centro y radio de cada esfera) puede usar tantas esferas como quieras para describir el objeto, pero necesitarás al menos dos esferas cuando uses linear_spline, y cuatro si usas b_spline o cubic_spline.

Opcionalmente, puedes especificar la tolerancia de profundidad que debe usarse para los cálculos de intersección. Esto se consigue mediante la palabra clave tolerance seguida del valor deseado: la distancia por defecto es 1.0e-6 (0.000001), y debería ser suficiente para la mayoría de los casos. Deberías cambiar este valor cuando observes puntos negros en la superficie del objeto, causados probablemente por un efecto llamado "autosombreado" (self-shading). Ello significa que el objeto provoca sombras sobre sí mismo en algunos puntos, como resultado de errores en el cálculo. Los programas trazadores normalmente definen la distancia mínima que un rayo debe viajar antes de chocar con otro (o el mismo) objeto, para evitar este problema. Si esta distancia es muy pequeña, el autosombreado puede producirse. Si así fuera, especifica una tolerancia de 1.0e-4 o incluso más alta.

Nota: si estos puntos negros siguen apareciendo tras incrementar la tolerancia, puede que desaparezcan usando el sobremuestreo adaptativo (método 2) para el antialias. Además, esto mejora siempre la imagen resultante.

Nota: La operación CSG de fusión (merge) no se recomienda con este objeto, ya que habría un pequeño hueco entre los objetos fusionados.

6.5.1.11  Elipsoide supercuadrático (superellipsoid)

El objeto superellipsoid crea la forma conocida como "elipsoide supercuadrático". Este objeto es una extensión del elipsoide cuadrático. Puede usarse para crear cajas y cilindros con aristas redondeadas, u otras formas interesantes. Matemáticamente, viene dado por la ecuación:


Los valores de e y n, llamados exponentes este-oeste y norte-sur, determinan la forma del elipsoide supercuadrático. Ambos deben ser mayores que 0. La esfera se consigue con e=1 y n=1.

Su sintaxis es la siguiente:

SUPERELLIPSOID:
    superellipsoid
    {
        <Value_E, Value_N>
        [OBJECT_MODIFIERS...]
    }

El vector 2-D especifica los valores e y n de la ecuación anterior. El objeto se posiciona en el origen y ocupa un espacio aproximado al de la caja box{<-1,-1,-1>,<1,1,1>}.

Dos objetos útiles que pueden obtenerse son la caja redondeada y el cilindro redondeado. Éstos se pueden conseguir de la siguiente forma:

 #declare Rounded_Box = superellipsoid { <Round, Round> }
 #declare Rounded_Cylinder = superellipsoid { <1, Round> }

El valor de  Round determina la "redondez" de las aristas, y debe ser mayor que 0 y menor que 1. Cuanto menor sea este valor, las aristas serán más pequeñas y afiladas.

Los valores muy pequeños de e y n pueden causar problemas en la resolución de raíces (el método Sturmian no puede utilizarse con este objeto).

6.5.1.12  Superficie de revolución (sor)

El objeto sor es una superficie de revolución generada mediante la rotación de una función alrededor del eje y. Esta función define la dependencia del radio de la posición en el eje de rotación. La sintaxis es la siguiente:

SOR:
    sor
    {
        Number_Of_Points, <Point_1>, <Point_2>, ... <Point_n>
        [ open ] [SOR_MODIFIERS...]
    }
SOR_MODIFIER:
    sturm | OBJECT_MODIFIER

  Valores por defecto:

sturm : off

El valor de coma flotante Number_Of_Points especifica el número de vectores 2-D que van a continuación. Los puntos <Point_1> ... <Point_n> son vectores bidimensionales que representan el radio y la correspondiente altura, esto es la posición en el eje de rotación. Estos puntos se conectan suavemente (la curva pasa por los puntos especificados) y se rotan alrededor del eje y para formar el objeto SOR. El primero y último puntos se usan solamente para determinar la pendiente de la función en los extremos, y no forman parte de la curva. La funcion que se usa en el objeto SOR es similar a las splines que se usan en el objeto torno (lathe), salvo que el objeto SOR es menos flexible debido a que para un punto dado en el eje de rotacion sólo puede haber un valor de radio. No puedes rotar curvas cerradas con el objeto SOR. Además, debes de asegurarte de que la curva no cruza el valor 0 del eje y, ya que esto puede afectar la perfección del acotado cilíndrico y POV-Ray dejaría de renderizar porciones de la spline en ese intervalo.

La palabra clave opcional open te permite quitar las tapas del objeto SOR. Si lo haces, no deberías de usar el objeto en operaciones CSG, ya que los resultados pueden ser erróneos.

El objeto SOR es útil para crear botellas, jarrones y formas parecidas. Un simple jarrón puede generarse con el siguiente código:

 #declare Vase = sor {
  7,
  <0.000000, 0.000000>
  <0.118143, 0.000000>
  <0.620253, 0.540084>
  <0.210970, 0.827004>
  <0.194093, 0.962025>
  <0.286920, 1.000000>
  <0.468354, 1.033755>
  open
 }

Puede que te preguntes si este objeto es necesario, pues ya existe el objeto torno (lathe), que además es mucho más flexible. La respuesta es sencilla: Las comprobaciones de intersección con un objeto SOR sólo necesitan el cálculo de un polinomio cúbico, mientras que el objeto torno necesita la resolución de un polinomio de sexto orden (puesto que se necesita una spline cúbica para conseguir la misma suavidad).
Como la mayoría de objetos SOR o lathe tiene bastantes segmentos, la diferencia de velocidad es importante. Las raíces de un polinomio de tercer orden son además más sencillas de resolver y más precisas.

La palabra clave sturm puede usarse para habilitar el uso del método Sturmian para la resolución de las raíces, más lento pero más preciso. Puedes usarlo si la superficie del objeto no se renderiza correctamente.

Las explicaciones a continuación son para aquéllos con un interés en la matemática que se esconde tras el cálculo de la superficie de revolución, y aunque no son necesarias para usar el objeto, pueden ayudar a comprenderlo mejor.

La función que se rota alrededor del eje y para obtener el objeto final viene dada por la ecuación:


donde r es el radio y h la altura. Como se trata de una función cúbica de h, posee flexibilidad suficiente para generar curvas suaves.

La curva en sí misma está definida por un conjunto de n puntos, P(i), i=0...n-1, los cuales se interpolan usando una función por cada segmento de la curva. Un segmento j, j=1...n-3, va desde el punto P(j) hasta el punto P(j+1) y usa los puntos P(j-1) y P(j+2) para determinar las pendientes en los extremos. Si hay n puntos, obtendremos n-3 segmentos. Esto significa que necesitamos por lo menos 4 puntos para obtener una curva correcta. Los coeficientes A(j), B(j), C(j) y D(j) se calculan para cada segmento usando la ecuación:


donde r(j) es el radio y h(j) es la altura del punto P(j).

La figura de abajo muestra la configuración de los puntos P(i), la ubicación del segmento j, y la curva que es definida por ese segmento.

Points on a surface of revolution
Puntos de una superficie de revolución

6.5.1.13  Texto (text)

El objeto text crea texto tridimensional mediante la extrusión de las letras. De momento sólo soporta fuentes TruType (ttf) y Colecciones TrueType (ttc), pero la sintaxis se ha diseñado para permitir el uso de otras fuentes en el futuro. Si se usan Colecciones TrueType, se usará la primera fuente contenida en la colección. La sintaxis es la siguiente:

TEXT_OBECT:
  text {
    ttf "fontname.ttf/ttc" "String_of_Text"
	Thickness, <Offset>
    [OBJECT_MODIFIERS...]
  }

Donde fontname.ttf o fontname.ttc es el nombre del archivo de fuentes TrueType. Debe de ser un literal de cadena entrecomillado o una expresión de cadena. La expresión de cadena a continuación es el texto que se quiere obtener, que tambien puede ser un literal entrecomillado o una expresión de cadenas. Véase la sección "Cadenas" para conocer más detalles acerca de las expresiones de cadenas.

El objeto texto se obtiene con un extremo inferior izquierdo frontal del primer carácter en el origen, extendiéndose en la dirección +x. La línea base del texto sigue el eje x, y los trazos descendentes bajan el dirección -y. El frontis del carácter se asienta sobre el plano x-y, mientras que el texto se extrusiona en la dirección +z. El grosor desde el frente hasta la parte trasera del texto se especifica mediante el valor obligatorio Thickness.

Los caracteres tiene un tamaño apropiado para usar un espaciado vertical de 1 unidad, y son de un tamaño de entre 0.5 y 0.75 unidades.

El espaciado horizontal es controlado por POV-Ray internamente, incluyendo cualquier información de ajuste del espaciado guardada en la propia fuente. El vector requerido <Offset> define un desplazamiento extra entre caracteres. Normalmente debes especificar 0 para este valor. Especificando 0.1*x conseguiremos poner un espacio adicional de 0.1 unidades entre los caracteres. Veamos un ejemplo:

  text {
    ttf "timrom.ttf" "POV-Ray" 1, 0
    pigment { Red }
  }

Sólo se permiten los caracteres imprimibles. Los caracteres especiales como retorno de carro, salto de línea, tabuladores, etc... no son soportados.

Para tener un acceso fácil a tus fuentes, puedes especificar una Trayectoria de Librerías para el directorio que contiene tu colección de fuentes.

6.5.1.14  Toroide o toro (torus)

Un torus es una forma polinómica de cuarto orden que asemeja un donut o tubo circular. Debido a que esta forma es muy útil y los polinomios cuárticos son difíciles de definir, POV-Ray te ofrece un atajo para definir toriodes mediante la siguiente sintaxis:

TORUS:
    torus
    {
        Major, Minor
        [TORUS_MODIFIER...]
    }
TORUS_MODIFIER:
    sturm | OBJECT_MODIFIER

Valores por defecto del toro:

sturm : off

donde MajorMinor son valores de coma flotante que especifican respectivamente el radio mayor y menor del toroide. El radio mayor se extiende desde el centro del agujero central hasta el eje circular interior del toroide, mientras que el radio menor es el radio de la sección de corte del tubo. El toroide está centrado en el origen y se alinea con el eje x-z, con el eje y penetrando por el agujero central.

Major and minor radius of a torus
Radios mayor y menor de un toroide

El toroide se acota internamente con dos cilindros y dos anillos formando un cilindro delgado. Con esta acotación cilíndrica se consigue mejorar mucho las comprobaciones de intersección del toroide. La resolución del polinomio de cuarto orden necesaria sólo se realiza si se toca el cilindro de acotación. Así se evita un montón de lentos cálculos.

Los cálculos necesarios para los polinomios de orden alto deben de ser muy precisos. Si la superficie del toroide se renderiza incorrectamente, puedes añadir la palabra clave sturm para que POV-Ray use el método Sturmian para resolver las raíces, más lento pero más preciso.