En plus de toutes les autres primitives que POV-Ray supporte, vous pouvez aussi combiner plusieurs formes simples en formes complexes avec la Constructive Solid Geometry (CSG). Il y a quatre types d'opérations CSG : l'union, l'intersection, la différence et la fusion. Les objets CSG peuvent être composés de primitives ou d'autres objets CSG, pour créer des formes de plus en plus complexes.
La plupart des primitives, comme les sphères, les boîtes et les blobs, séparent le monde en deux régions. L'intérieur et l'extérieur de l'objet. Pour chaque point de l'espace, vous pouvez dire s'il est en dedans, ou en dehors d'un objet particulier. Bien sûr, il peut être exactement sur la surface, mais ce cas est assez dur à déterminer, à cause des problèmes numériques.
Même les plans ont un dedans et un dehors. Par définition, la normale de surface des plans pointe vers l'extérieur du plan. Vous devez noter que les triangles, et les formes à base de triangles, ne peuvent pas être utilisés dans les CSG, car ils n'ont pas de dedans, et de dehors, bien défini.
Note : Bien que les triangles, surfaces bicubiques et quelques autres formes n'ont pas de dedans/dehors bien définis, ils ont un coté avant/arrière qui rend possible d'utiliser une texture sur la face avant et une texture d'intérieur sur la face arrière. Ces formes (mesh, mesh2) ne peuvent être utilisées dans une CSG que si ce sont des objets fermés et qu'elles ont un vecteur interne spécifié.
Note : De même, les triangles, surfaces bicubiques et d'autres formes n'ont pas d'intérieur et d'extérieur bien dfinis, elles ont un recto et un verso qui rendent possible l'utilisation d'une texture sur le recto et d'une texture d'intérieur sur le verso.
La CSG utilise le concept du dedans et du dehors pour combiner les formes, comme expliqué dans les sections suivantes.
Imaginez que vous avez deux objets qui se chevauchent partiellement, comme dans la figure ci-dessous. Quatre différentes aires de points peuvent être distinguées : les points qui ne sont dans aucun des deux objets, les points dans l'objet A mais pas dans le B, les points qui ne sont pas dans l'objet A mais dans le B, et enfin les points qui sont dans les deux objets.

En gardant cela en mémoire, il devient facile de comprendre le fonctionnement des opérations des CSG.
Pendant l'utilisation d'un CSG, il est parfois utile d'inverser un objet pour que l'intérieur devienne l'extérieur. L'apparence n'est pas changée, seule la perception qu'en a POV-Ray. Quand le mot clé inverse est utilisé, l'intérieur de l'objet devient l'extérieur, et vice versa.
La distinction dedans/dehors n'est pas importante pour une union, mais elle l'est pour une intersection, une différence ou une fusion. Tous les objets peuvent être combinés en utilisant une union, mais seul les solides, c'est à dire ceux qui un un intérieur bien défini, peuvent être utilisés pour les autres types de CSG. Les objets décrits dans "Les primitives de surface finies" n'ont pas de dedans/dehors bien défini. Tous les objets des sections sur "Les primitives solides finies" et "Les primitives solides infinies" ont un dedans et un dehors.

Le type de CSG le plus simple est l'union. Sa syntaxe est :
UNION: union { OBJECTS... [OBJECT_MODIFIERS...] }
Les unions sont simplement le collage de deux formes en une seule entité, qui peut être manipulée comme un objet unique. L'image montre l'union de A et B. Le nouvel objet créé par l'opération union peut être retaillé, déplacé et tourné, comme une forme unique. L'union entière peut porter une texture, mais chaque composant de l'union peut également avoir sa propre texture, qui écrasera toute texture partagée de l'objet parent.
Vous devez être averti que les surfaces internes ne sont pas ôtées. Comme vous pouvez le voir sur la figure, cela peut être un problème pour les unions transparentes. Si vous voulez que ces surfaces disparaissent, vous devrez utiliser l'opération de fusion, expliquée plus loin.
L'union suivante contient une boîte et une sphère.
union { box {<-1.5,-1,-1>, <0.5, 1, 1>} cylinder {<0.5, 0,-1>, <0.5, 0, 1>, 1} }
Les précédentes versions de POV-Ray plaçaient des restrictions sur les unions, vous demandant de combiner les objets avec des déclarations composite. Ces restrictions ont été supprimées, donc composite n'est plus nécessaire. Cet argument est encore supporté pour la compatibilité.
split_union est un mot clé booléen qui peut être ajouté à une union. Il a deux états on/off, le défaut est on.
split_union est utilisé quand des photons sont envoyés à l'objet CSG. L'objet est découpé en ses composants, les photons sont envoyés séparemment à chaque partie. C'est pour éviter que les photons soient envoyés à des 'espaces vides' dans l'objet, par exemple les trous d'une grille. Avec les objets compacts, sans 'espaces vides', split_union off peut améliorer la gestion des photons.
union { object {...} object {...} split_union off }
L'objet intersection crée une forme contenant seulement les aires où tous les composants se chevauchent. Un point est dans une intersection s'il est dans les deux objets A et B, comme dans la figure ci-dessous.

La syntaxe est :
INTERSECTION: intersection { SOLID_OBJECTS... [OBJECT_MODIFIERS...] }
Les composants doivent avoir un dedans/dehors bien défini. Les surfaces ne sont pas autorisées.
Note : si tous les composants ne se chevauchent pas, l'objet intersection disparaît.
Voici un exemple :
intersection { box {<-1.5,-1,-1>, <0.5, 1, 1>} cylinder {<0.5, 0,-1>, <0.5, 0, 1>, 1} }
L'opération différence CSG prend l'intersection entre le premier objet et la négation des objets qui suivent. Donc, seuls les points de A et en dehors de B appartiennent à la différence des deux objets.
Le résultat est une soustraction de la deuxième forme à la première, comme dans la figure ci-dessous.

La syntaxe est :
DIFFERENCE: difference { SOLID_OBJECTS... [OBJECT_MODIFIERS...] }
Les composants doivent avoir les propriétés dedans/dehors bien définies. Les surfaces ne sont pas autorisées.
Note : si le premier objet est entièrement dans les objets soustraits, l'objet différence disparaît.
Voici un exemple :
difference { box {<-1.5,-1,-1>, <0.5, 1, 1>} cylinder {<0.5, 0,-1>, <0.5, 0, 1>, 1} }
Note : POV-Ray ajoute seulement le mot clé inverse au second objet (et suivants), puis fait une intersection.
L'exemple précédent est équivalent à :
intersection { box {<-1.5,-1,-1>, <0.5, 1, 1>} cylinder {<0.5, 0,-1>, <0.5, 0, 1>, 1 inverse} }
L'opération union ne fait que coller les objets ensemble, elle n'enlève pas les surfaces internes. Dans la plupart des cas, cela n'a pas d'importance. Toutefois, si une union transparente est utilisée, ces surfaces deviennent visibles. L'opération fusion peut être utilisée pour éviter ce problème. Elle fonctionne comme l'union, mais en éliminant les surfaces internes, comme le montre la figure ci-dessous.

La syntaxe est :
MERGE: merge { SOLID_OBJECTS... [OBJECT_MODIFIERS...] }
Les composants doivent avoir des propriétés dedans/dehors bien définies. Les surfaces ne sont pas autorisées.
Note : la fusion est rendue plus lentement que l'union lors de son utilisation avec des objets non transparents. Un petit test peut être nécessaire pour déterminer la solution optimale pour la vitesse et le résultat visuel.
| 3.3.7 Les sources de lumière |