|
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.
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.
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.
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.
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 }
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:.
É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 } }
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:
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 } }
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:
É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.
|