6.5.6  Geometría constructiva de sólidos

Además de todas las formas primitivas que soporta POV-Ray, también puedes combinar múltiples formas simples para crear otras más complejas, usando la Geometría constructiva de sólidos (CSG es el acrónimo inglés, que usaremos como abreviatura para evitar confusiones). Existen cuatro tipos básicos de operaciones CSG: unión, intersección, diferencia y fusión. Los objetos CSG se pueden componer de primitivas u otros objetos CSG para crear formas todavía más complejas.

6.5.6.1  Interior y exterior

La mayoría de las primitivas, como las esferas, cajas y burbujas, dividen el espacio en dos regiones. Una región está dentro del objeto y la otra en su exterior. Dado un punto en el espacio, se puede saber si está en el interior o el exterior de un determinado objeto. Bueno, puede que esté exactamente en la superficie, pero este caso sería difícil de determinar debido a problemas numéricos.

Incluso los planos tienen un interior y un exterior. Por definición, la normal a la superficie del plano apunta hacia el exterior de éste. Observa que los triángulos y las formas basadas en ellos no pueden usarse como objetos sólidos en operaciones CSG, ya que no tienen un interior/exterior bien definido.

Nota: Aunque los triángulos, parches bicúbicos y algunas otras formas no tienen un interior y exterior bien definidos, si que tienen un "lado frontal" y otro "lado posterior", lo cual posibilita usar una textura para el lado frontal y otra textura interior (interior_texture) para el posterior.

La geometría constructiva de sólidos utiliza los conceptos de interior y exterior para combinar las formas, tal como se explica en las siguientes secciones.

Imagina que tienes dos objetos que se solapan parcialmente, tal como se ilustra en la siguiente figura. Se pueden distinguir cuatro áreas diferentes de puntos: los que están fuera de los objetos A y B, los que están dentro del objeto A pero no del B, los que están dentro de B pero no de A, y finalmente los que están dentro de ambos objetos.

Dos objetos solapados
Dos objetos solapados

Con esta información en la cabeza es más fácil entender cómo funcionan las operaciones CSG.

Cuando se construyen formas CSG, es útil a menudo invertir un objeto, de forma que su interior pasa a ser el exterior, y viceversa. La apariencia del objeto no cambia, sólo la forma en que POV-Ray lo trata. Para ello podemos utilizar el modificador de objetos inverse.

La distinción entre interior y exterior no es importante en una unión (union), pero sí lo es en las intersecciones (intersection), diferencias (difference) y fusiones (merge). Por ello, cualquier objeto puede ser utilizado en uniones, pero para el resto de operaciones CSG sólo pueden usarse objetos sólidos, con un interior y exterior bien definidos. Los objetos descritos en la secciones "Primitivas de parche finitas" no tienen un interior/exterior bien definido. Todos los objetos descritos en las secciones "Primitivas sólidas finitas" y "Primitivas sólidas infinitas" sí lo tienen.

6.5.6.2  Unión

Unión de dos objetos
Unión de dos objetos

La forma más simple de CSG es la unión (union). Su sintaxis es la siguiente:

UNION:
    union
    {
        OBJETOS...
        [MODIFICADORES_DE_OBJETO...]
    }

La unión consiste simplemente en "pegar" dos o más formas para formar una sola entidad, que puede manipularse como un solo objeto. La imagen superior muestra la unión de A y B. El nuevo objeto creado por la operación de unión puede escalarse, trasladarse y rotarse como si fuera un solo objeto. Toda la unión puede compartir una misma textura, aunque cada objeto contenido en la unión puede tener también su propia textura, que prevalece sobre la textura de su objeto padre.

Debes tener en cuenta que las superficies que queden dentro de la unión no desaparecen. Como puedes imaginar, esto es un problema cuando se crean uniones transparentes. Para hacer desaparecer estas superficies interiores debes usar la operación de fusión (merge), que se explica en una sección posterior.

La siguiente unión se compone de una caja y un cilindro:

  union {
    box { <-1.5, -1, -1>, <0.5, 1, 1> }
    cylinder { <0.5, 0, -1>, <0.5, 0, 1>, 1 }
  }

En las versiones más tempranas de POV-Ray existían restricciones sobre las uniones, que debían usarse con la sentencia composite (compuesto) para combinar objetos. Estas restricciones ya no existen, aunque los compuestos aun se soportan por compatibilidad con escenas antiguas.

6.5.6.2.1  Split_Union

split_union es un identificador booleano que puede emplearse en las uniones. Tiene dos estados, on/off (activado/desactivado), y el valor por defecto es on(activado).

El identificador split_union se usa con los fotones, cuando éstos se lanzan sobre el objeto CSG. Si está activado, el objeto se descompone en sus partes, y los fotones se lanzan contra cada parte por separado. Esto se hace para prevenir que se manden fotones hacia los "agujeros" o espacios vacíos del objeto CSG, como por ejemplo los agujeros en una parrilla. En el caso de objetos CSG compactos, sin espacios vacíos, usar split_union off puede mejorar la recogida de fotones.

  union {
    object {...}
    object {...}
    split_union off
  }

6.5.6.3  Intersección

La intersección (intersection) crea una forma que contiene sólo aquellas áreas de los objetos que se solapan. Un punto forma parte de la intersección si está en el interior de ambos objetos, A y B, según se muestra en la siguiente figura:.

Intersección entre dos objetos.
Intersección entre dos objetos.

Ésta es su sintaxis:

INTERSECCION:
    intersection
    {
        OBJETOS_SOLIDOS...
        [MODIFICADORES_DE_OBJETO...]
    }

Los objetos componentes deben tener un interior/exterior bien definido. Los objetos de parche no están permitidos.

Nota: Si los componentes no se solapan, el objeto intersección no aparecerá.

He aquí un ejemplo en el cual los objetos sí se solapan:

  intersection {
    box { <-1.5, -1, -1>, <0.5, 1, 1> }
    cylinder { <0.5, 0, -1>, <0.5, 0, 1>, 1 }
  }

6.5.6.4  Diferencia

La operación CSG de diferencia (difference) realiza una diferencia entre el primero de los objetos y la inversión de todos los demás. Así, la diferencia consiste sólo en los puntos que están en el interior del objeto A y en el exterior del objeto B, resultando en la substracción de la segunda forma en la primera, tal como se muestra en la siguiente ilustración:

Diferencia entre dos objetos
Diferencia entre dos objetos

La sintaxis es:

DIFERENCIA:
    difference
    {
        OBJETO_SOLIDO...
        [MODIFICADORES_DE_OBJETO...]
    }

Los componentes deben ser objetos con un interior/exterior bien definido. Los objetos de parche no están permitidos.

Nota: Si los objetos a substraer contienen totalmente al primero objeto, la diferencia no aparecerá. Veamos un ejemplo de diferencia bien construida:

  difference {
    box { <-1.5, -1, -1>, <0.5, 1, 1> }
    cylinder { <0.5, 0, -1>, <0.5, 0, 1>, 1 }
  }

Nota: Internamente, POV-Ray simplemente añade el modificador inverse a todos los objetos a partir del segundo inclusive, y entonces realiza una intersección.

El ejemplo anterior es equivalente al siguiente:

  intersection {
    box { <-1.5, -1, -1>, <0.5, 1, 1> }
    cylinder { <0.5, 0, -1>, <0.5, 0, 1>, 1 inverse }
  }

6.5.6.5  Fusión

Como hemos visto, la unión solamente junta los objetos, sin recortar las superficies interiores de los componentes. Normalmente, esto no es ningún problema. Sin embargo, cuando creamos una unión con una textura transparente, estas superficies interiores se hacen visibles. La operación CSG de fusión (merge) puede usarse para resolver este problema. Funciona exactamente igual que una unión, pero elimina las superficies internas, tal como se ilustra en la siguiente figura:

La fusión elimina las superficies internas
La fusión elimina las superficies internas

Ésta es su sintaxis:

FUSION:
    merge
    {
        OBJETOS_SOLIDOS...
        [MODIFICADORES_DE_OBJETO...]
    }

Los componentes deben ser objetos con un interior/exterior bien definido. Los objetos de parche no están permitidos.

Nota: En general, la fusión es más lenta de renderizar que la unión cuando se usa con objetos no transparentes. Deberíamos realizar unas cuantas pruebas para determinar la solución óptima teniendo en cuenta la velocidad y el resultado visual.