6.5.9  Modificadores de objetos

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...

6.5.9.1  Recorte (clipped_by)

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.

Un objeto recortado por otro objeto
Un objeto recortado por otro objeto

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.

6.5.9.2  Acotación (bounded_by)

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.

6.5.9.3  Material

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.

6.5.9.4  Inversión (inverse)

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.

6.5.9.5  Hueco (hollow)

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
  }

6.5.9.6  Sin sombra (no_shadow)

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
  }

6.5.9.7  Sin imagen (no_image), sin reflexión (no_reflection)

Sintaxis:
  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...

6.5.9.8  Doble iluminación (double_illuminate)

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.

6.5.9.9  Sturm

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: