|
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.
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:
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 :
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
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.
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...] }
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).
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...] }
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.
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...] }
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.
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
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.
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.
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
.
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!
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
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.
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.
La sintaxis del objeto sphere
es la siguiente:
SPHERE: sphere { <Center>, Radius [OBJECT_MODIFIERS...] }
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).
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] }
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:
linear_spline
: Interpolación mediante una función
lineal, lo cual hace que las esferas simples se conecten mediante tubos
rectos.b_spline
: Aproximación de los datos de entrada
mediante una función b-spline cúbica, lo que resulta en un objeto con
curvas.cubic_spline
: Aproximación mediante una spline cúbica, lo que resulta en un objeto curvado.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.
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).
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
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.
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.
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
sturm : off
donde Major
y Minor
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.
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.
|