|
Existen diversos modificadores que pueden añadirse a los objetos. Los siguientes modificadores pueden usarse con cualquier objeto:
MODIFICADOR_DE_OBJETO: clipped_by { OBJETO_SOLIDO_SIN_TEXTURA... } | clipped_by { bounded_by } | bounded_by { OBJETO_SOLIDO_SIN_TEXTURA... } | bounded_by { clipped_by } | no_shadow | no_image [ BOOLEANO ] | no_reflection [ BOOLEANO ] | inverse | sturm [ BOOLEANO ] | hierarchy [ BOOLEANO ] | double_illuminate [ BOOLEANO ] | hollow [ BOOLEANO ] | interior { ITEMS_DE_INTERIOR... } | material { [IDENTIFICADOR_DE_MATERIAL][ITEMS_DE_MATERIAL...] } | texture { CUERPO_DE_LA_TEXTURA } | interior_texture { CUERPO_DE_LA_TEXTURA } | pigment { CUERPO_DEL_PIGMENTO } | normal { CUERPO_DE_LA_NORMAL } | finish { ITEMS_DE_ACABADO... } | photons { ITEMS_DE_FOTONES...} TRANSFORMACION
Las transformaciones, como traslación, rotación y escalado, ya han
sido explicadas. El modificador "texture" y sus complementarios
"pigment", "normal", y "finish", así como "interior", y "media" (que es
parte del interior) se describen en los siguientes capítulos. En las
subsecciones que siguen, detallaremos otros modificadores importantes: clipped_by
,
bounded_by
, material
, inverse
, hollow
,
no_shadow
, no_image
, no_reflection
, double_illuminate
y sturm
. Aunque los siguientes ejemplos utilizan el
comando object
e identificadores de objetos, los
modificadores pueden utilizarse también con cualquier tipo de objeto,
como sphere
, box
, etc...
La sentencia clipped_by
es técnicamente hablando un
modificador, pero permite realizar un tipo de CSG similar a la intersección. La sintaxis es la siguiente:
RECORTE: clipped_by { OBJETO_SOLIDO_SIN_TEXTURA... } | clipped_by { bounded_by }
Donde OBJETO_SOLIDO_SIN_TEXTURA es uno o más objetos sólidos sin ninguna textura aplicada. Por ejemplo:
object { My_Thing clipped_by{plane{y,0}} }
Cualquier parte del objeto My_Thing
no contenida en el
plano se recorta y se descarta. En una intersección típica, este hueco quedaría tapado, mientras que con el modificador clipped_by
queda al descubierto. Por ejemplo, la siguiente figura muestra el objeto A
recortado por el objeto B
.
Puedes usar clipped_by
para recortar porciones de
cualquier objeto. En muchos casos, resulta más rapido de renderizar que
otros métodos de recorte. Ocasionalmente, puede que necesites usar tanto clipped_by
como bounded_by
en el mismo objeto. A continuación se
muestra una forma de ahorrar código y memoria:
object { My_Thing bounded_by { box { <0,0,0>, <1,1,1> } } clipped_by { bounded_by } }
Esto le dice a POV-Ray que use para el recorte la misma caja que se usó para la acotación.
Los cálculos necesarios para comprobar si un rayo toca un objeto pueden ser bastante lentos. Cada rayo tiene que comprobarse contra cada objeto de la escena. POV-Ray intenta acelerar el proceso construyendo un conjunto de cajas invisibles, llamadas cajas de acotación, que agrupan los objetos. De esta manera, un rayo que viaja por una parte de la escena no necesita comprobarse contra un objeto que está en otra parte más lejana de la escena. Cuando existe un gran número de objetos, las cajas se anidan unas dentro de otras.
POV-Ray puede usar estas cajas de acotación con cualquier objeto finito, e incluso con algunas cuárticas y cuádricas que hayan sido recortadas o acotadas. Sin embargo, los objetos infinitos, como planos, cuádricas, cúbicas y polinomios, no pueden acotarse automáticamente.
Los objetos CSG se acotan automáticamente, siempre que contengan sólo objetos finitos, o incluso infinitos en algunos casos. El proceso
consiste en aplicar el conjunto de operaciones CSG a las cajas de acotación de los objetos que componen el objeto CSG. Sin embargo, con
diferencias e intersecciones, el automatismo no funciona de forma óptima. A veces es mejor, dependiendo de la complejidad del objeto CSG,
realizar una acotación manual usando el comando bounded_by
.
Normalmente las cajas de acotación no son necesarias, pero hay casos en los que pueden usarse para acelerar el renderizado de objetos complejos. Las cajas de acotación le dicen al trazador que determinado objeto está totalmente contenido en una forma simple. Al trazar los rayos, éstos se comprueban primero contra esta forma simple, y si la tocan, se prosigue la comprobación contra el objeto, más complejo, contenido en su interior. Si no toca la forma de acotación, se salta la comprobación contra el objeto, lo cual acelera sobremanera el proceso de renderizado.
La sintaxis es la siguiente:
ACOTACION: bounded_by { OBJETO_SOLIDO_SIN_TEXTURA... } | bounded_by { clipped_by }
Donde OBJETO_SOLIDO_SIN_TEXTURA consiste en uno o más objetos sólidos sin texturizar. Por ejemplo:
intersection { sphere { <0,0,0>, 2 } plane { <0,1,0>, 0 } plane { <1,0,0>, 0 } bounded_by { sphere { <0,0,0>, 2 } } }
Las formas más eficientes para la acotación son sphere
y box
, ya que su renderizado está muy optimizado, aunque
puede utilizarse cualquier forma. Si la forma usada para la acotación es
finita y responde a las cajas de acotación (bounding slabs), entonces el
objeto acotado también se podrá usar en el sistema de cajas de acotación.
Aunque puede ser buena idea añadir manualmente el comando bounded_by
a las fusiones (merge), intersecciones y diferencias CSG, en el caso de
la unión es mejor no hacerlo nunca. Si una unión no contiene
acotaciones manuales, POV-Ray puede dividirla internamente en sus
componentes, aplicando las cajas de acotacion automática a cada uno de
los componentes finitos. Observa que algunas utilidades, como raw2pov
,
pueden generar acotaciones más eficientes que la que implementa
POV-Ray. Sin embargo, la mayoría de uniones que crees manualmente
pueden ser fácilmente acotadas por el sistema automático. Por razones técnicas, POV-Ray no puede dividir un objeto de
fusión CSG, así que será
conveniente acotarlos manualmente, especialmente si es muy complejo.
Nota: si la forma de acotación es
demasiado pequeña o está posicionada incorrectamente, puede recortar el
objeto de manera indefinida, o incluso puede que el objeto no aparezca.
Para realizar un recorte "a propósito", usa el comando clipped_by
tal y como se explica en la sección anterior.
Ocasionalmente, puede que quieras usar ambos comandos en el mismo objeto; el siguiente ejemplo muestra un atajo que ahorra memoria y código:
object { My_Thing clipped_by{ box { <0,0,0>,<1,1,1 > }} bounded_by{ clipped_by } }
De esta forma le decimos a POV-Ray que use, para la acotacion, la misma caja que se especificó para el recorte.
En POV-Ray 3.1 se cambiaron varios ítems del acabado (finish{...}
),
que se movieron a la nueva sentencia interior
. Además, el halo
, que antes pertenecía a la textura, ahora se llama media
, y forma
parte del interior
Este cambio fue realizado deliberadamente para cumplir un propósito (véase "¿Por qué son necesarios el medio y el interior?"). Sin embargo, los probadores (betatesters) de POV-Ray, comentaron que, para hacer librerías de texturas, se echaba en falta una sentencia extra para agrupar todas las características de la superficie con un único identificador.
El resultado es que decidimos crear un envoltorio alrededor de la textura
y el interior
, al que llamamos material
. Su
sintaxis es la siguiente:
MATERIAL: material { [IDENTIFICADOR_DE_MATERIAL][ITEMS_DE_MATERIAL...] } ITEMS_DE_MATERIAL: TEXTURA | TEXTURA_INTERIOR | INTERIOR | TRANSFORMACIONES
Por ejemplo:
#declare MyGlass=material{ texture{ Glass_T } interior{ Glass_I }} object { MyObject material{ MyGlass}}
Internamente, el material no se adjunta al objeto, si no que actúa como un contenedor que lleva la textura y el interior hasta el objeto. Son realmente éstos los que van adjuntos al objeto. El usuario debería considerar la textura y el interior como dos ítems separados que pertencen al objeto.
Si el objeto ya tiene una textura, la textura del material se aplicará encima como una capa. Si el objeto ya tuviera un interior, el interior del material reemplazará totalmente al antiguo, que es destruido. Las transformaciones en la sentencia del material sólo afectan a las texturas e interiores dentro de esa sentencia. Por ejemplo:
object { MyObject material { texture { MyTexture } scale 4 //afecta a la textura, pero no al objeto o al interior interior { MyInterior } translate 5*x //afecta a la textura y el interior, pero no al objeto. } }
Nota: La sentencia material
no tiene nada que ver con el mapa
de materiales (material_map)
. Un material_map
NO
sirve para crear materiales con patrón. Véase "Mapas de materiales" para una
explicación de esta característica.
Cuando se realizan operaciones de CSG resulta útil, a menudo, la
posibilidad de invertir la forma de un objeto, de manera que se
intercambien su interior y exterior. La apariencia del objeto no cambia,
sino la manera en que POV-Ray lo percibe. Cuando se usa el modificador inverse
el interior del objeto pasa a ser
su exterior y viceversa. Por ejemplo:
object { MyObject inverse }
La distinción entre interior y exterior es importante también cuando
se adjunta una sentencia interior
a un objeto, especialmente si se usa el medio
. Además, el medio atmosférico y la niebla no
funcionarán como se espera si la cámara se
encuentra en el interior de un objeto. Para corregir este problema se
puede hacer uso de la inversion en algunas ocasiones.
Por defecto, POV-Ray asume que los objetos están hechos de un
material sólido que rellena completamente el interior de éstos.
Añadiendo el modificador hollow
en la definición del objeto
podemos hacerlo hueco (véase también la sección "Objetos sólidos y huecos".
Esta característica es muy útil cuando quieres crear efectos atmosféricos en el interior de un objeto. Es incluso necesario en
objetos que utilicen el medio atmosférico (media). El modificador puede
ir seguido opcionalmente de una expresión en coma flotante que se
interpretará como un valor booleano. Por ejemplo, puede utilizarse hollow
off
para forzar su desactivación. Cuando se especifica el
modificador sin este valor, se supone que se desea activar esta
caracteristica. Por defecto, hollow
está desactivado, esto
es, el objeto será sólido.
Para conseguir un objeto CSG hueco sólo tienes que hacer hueco el objeto del primer nivel. Todos los objetos hijos asumirán el mismo estado, salvo que se indique explícitamente en su definición. El siguiente ejemplo hace que las dos esferas de la unión sean huecas:
union { sphere { -0.5*x, 1 } sphere { 0.5*x, 1 } hollow }
Sin embargo, en este otro, sólo la segunda esfera es hueca, debido a que la primera se ha declarado explícitamente como sólida:
union { sphere { -0.5*x, 1 hollow off } sphere { 0.5*x, 1 } hollow on }
Puedes especificar el modificador no_shadow
cuando
quieras que un objeto no proyecte sombra. Esta característica es útil
para efectos especiales, o para crear la ilusión de fuentes de luz
visibles. Este modificador era necesario en versiones anteriores de
POV-Ray, cuando no existía el modificador looks_like
en las
fuentes de luz para adjuntar un objeto. Ahora es también útil para
crear efectos irreales. También se puede utilizar durante los
renderizados de prueba, para acelerar el proceso de creación del objeto.
Veamos un ejemplo:
object { My_Thing no_shadow }
OBJETO { [ITEMS_DE_OBJETO...] no_image no_reflection }
Estos dos modificadores son bastante similares a no_sadow
,
en cuanto a uso y funcionamiento. Controlan la visibilidad de un
objeto. Puedes usar cualquier combinación de los tres en un mismo objeto.
Cuando se especifica no_image
, el objeto no será visto
por la cámara, ni directamente ni a través de objetos transparentes o
refractantes. Sin embargo, sí provocará sombras y aparecerá en los
reflejos, a no ser que usen, respectivamente, no_shadow
y no_reflection
.
Cuando se usa el modificador no_reflection
el objeto no
será visible en los reflejos, pero sí será visto por la cámara, incluso
a través de objetos transparentes o refractantes, y proyectará sombras
(a no ser que se usen también no_image
y/o no_shadow
).
Usando hábilmente estos tres modificadores puedes crear efectos interesantes y extraños, como conseguir que una esfera provoque una sombra rectangular, que un cubo aparezca como un cono en los espejos, etc...
Sintaxis:
OBJETO { [ITEMS_DE_OBJETO...] double_illuminate }
Toda superficie tiene dos lados. Normalmente, sólo el lado expuesto
a la luz está iluminado, mientras que el otro permanece en la sombra.
Cuando se usa el modificador double_illuminate
, POV-Ray
ilumina también el lado en la sombra.
Este efecto puede ser útil para simular sucesos reales como la translucidez en una pantalla de lámpara, una hoja de papel o de un árbol, etc...
Nota: double_illuminate
sólo ilumina ambos lados de la superficie. Así, en una esfera, por
ejemplo, no verías el efecto a no ser que esta fuera parcialmente
transparente, o si la cámara estuviera colocada en el interior del
objeto estando la luz fuera de éste, o viceversa.
Algunos objetos de POV-Ray permiten escoger el modo en que se resuelve, matemáticamente, el cálculo de la forma, dando a elegir entre un modo rápido pero poco preciso y otro más preciso pero también más lento. Éste es el caso en todos los objetos cuya solución consiste en un polinomio de tercero o cuarto grado. En matemáticas existen soluciones analíticas para estos polinomios, que pueden ser utilizadas.
Los polinomios de menor orden tienen soluciones triviales, mientras que los de mayor orden requieren algoritmos reiterativos. Uno de estos algoritmos es el llamado "Sturmian". Por ejemplo:
blob { threshold .65 sphere { <.5,0,0>, .8, 1 } sphere { <-.5,0,0>,.8, 1 } sturm }
El modificador puede ir seguido de una expresion de coma flotante
para forzar su desactivación. Cuando se especifica sólo la palabra
clave, se supone que se desea activar este algoritmo (sturm on
),
que por defecto está desactivado (sturm off
).
La siguiente lista indica todos los objetos que aceptan este modificador:
|