vers l'index général de l'aide

Géométrie Constructive des Solides (CSG, Constructive Solid Geometry)

objectif

Grouper et combiner des solides.

compatibilité

POV-Ray 2.0+sup

explication

Un solide est un objet dont l'intérieur et l'extérieur sont bien définis.

La CSG permet de modifier des volumes solides. On peut, grâce aux fonctions intégrées : couper un objet avec un autre, faire une union de 2 objets (ou plus), créer un nouveau volume par l'intersection d'objets différents.

Les fonctions supportées par POV-Ray sont :

union : permet l'union de plusieurs volumes pour obtenir un seul objet.

merge : (fusion) permet, comme union, d'assembler plusieurs volumes en un seul mais ne laisse par apparaître les contours intérieurs (utile pour les objets transparents ou semi-transparents).

difference : permet d'obtenir un nouvel objet par soustraction de volume(s).

intersection : permet d'obtenir un nouvel objet dans lequel seules les parties communes sont visibles.

syntaxe

union {
	[forme1]
	[forme2]
	[forme3]
	[......]
	[formeN]
	
 [...modifications...]
       }
 

Les syntaxes de merge et intersection sont identiques.

difference {
	[forme1] //la forme de laquelle on va retrancher des parties.

	[forme2] //la première forme de soustraction
	[forme3] //la deuxième...
	[......] //...
	[formeN]
	
 [...modifications...]
       }
 

exemple

 
//travail sur 2 sphères
union{
	sphere{<-0.5,0,0>,1 pigment {YellowGreen}} 
	sphere{<0.5,0,0>,1  pigment {OrangeRed}}

  rotate 20*y	 
     }
     
 
fonction union fonction difference fonction intersection

précision

Les fonctions union et merge se comportent de même manière sur des volumes opaques. L'intérêt de la fonction merge est de permettre l'union de volumes transparents ou semi-transparents en supprimant les parties intérieures de l'assemblage .

 
//travail sur 2 sphères semi-transparentes
union{
	sphere{<-0.5,0,0>,1} 
	sphere{<0.5,0,0>,1 }
pigment {White filter 0.7} //filter détermine la valeur de transparence  d'une couleur 
rotate 20*y	 }
  
 
union normale union merge

Remarques

Assignation de matériaux

L'attribution des matériaux peut se faire de façon globale sur la totalité du nouveau volume généré, mais aussi de façon indépendante sur chaque volume composant la forme finale. Si certains composants de l'opération ont déjà un matériau, celui-ci restera, et seuls les composants sans matériau adopteront le matériau global.

Il en est de même pour les fonctions scale , rotate et translate.

Le nombre de volumes composant une CSG n'est pas limité.

Ces transformations sont combinables :

union{
	difference{
		{forme 1}
		{forme 2}
		      }
	union {
	    {forme 3}
	    {forme 4}	
		  }
   }	
   

Les objets ne possédant pas d'intérieur et d'extérieur (triangle, disque,..) ne fonctionnent pas avec difference et intersection. Par contre, ils fonctionnent normalement dans une union. La même remarque est valable pour les sources lumineuses.

En interne, POV-Ray traite la fonction difference comme une intersection dont le premier objet voit son intérieur/extérieur inversés.

Surfaces coïncidentes

cylinder {<0,0,0>,<5,0,0>,5 pigment {OrangeRed}}
box {<0,0,0>,<5,5,5> pigment {YellowGreen}}

Le code ci-dessus démontre un petit problème : certaines surfaces de ces deux volumes sont parfaitement coïncidentes, et, dans cette zone, les couleurs des deux volumes se mélangent de manière désordonnée. Cela est dû au fait que POV-Ray est incapable de décider si le point où le rayon a atterri appartient à l'un ou l'autre volume; alors, parfois c'est l'un, parfois c'est l'autre, et si leurs textures sont différentes, voilà le résultat :

problème des surfaces coïncidentes

La solution consiste à lééééégèrement décaler ou agrandir/réduire l'objet, afin de créer une différence microscopique et de permettre à POV-Ray de déterminer très nettement quelle surface il rencontre.

cylinder {<0,0,0>,<5,0,0>,5 pigment {OrangeRed}}
box {<0,0,0>,<5,5,5> translate x*0.0001 pigment {YellowGreen}} //décalage d'un 10 000ème d'unité

Le problème est résolu ! Précisons que le même problème (et la même solution) intervient dans le cas des opérations de différences.

problème résolu

Optimisation des différences

Dans certains cas, la façon de structurer une difference influence fortement le temps de parsing/calcul de l'image. Imaginez que vous voulez créer une boîte percée de nombreux trous à intervalles réguliers.

difference {
  box {<0,0,0>,<1,20,20> pigment {Red}}//la boîte dans laquelle on va percer les trous

        #declare i=0;    //la double boucle pour disposer les "soustrayants"
         #while (i < 10)
        #declare j=0;
         #while (j < 10)
                sphere {<1,1+i*2,1+j*2>,.5 pigment {Yellow}} //l'objet qui soustrait
         #declare j=j+1;
         #end
        #declare i=i+1;
        #end        
 }

L'inconvénient de cette façon de faire, c'est que, à chaque fois qu'il rencontre la boîte rouge, POV-Ray va faire un test d'intersection supplémentaire pour CHAQUE sphère jaune, pour voir si elles sont dans le trajet. Plus il y aura d'éléments soustrayants, plus le processus sera ralenti !

Le code qui suit adopte une autre approche, en créant une petite boîte percée d'une seule sphère, puis en faisant une union d'une centaine de ces boîtes.

#declare Element = 
difference {
  box {<0,0,0>,<1,2,2> pigment {Red}}
  sphere {<1,1,1>,.5 pigment {Yellow}}
  }

union {
        #declare i=0;
         #while (i < 10)
        #declare j=0;
         #while (j < 10)
             object {Element translate <0,i*2,j*2>}   
         #declare j=j+1;
         #end
        #declare i=i+1;
        #end        
 }

L'objet résultant est strictement identique, mais il est tracé SIX FOIS plus vite !!

À vous, donc, d'estimer, lorsque c'est possible, quelle est la meilleure approche dans la construction d'une CSG.

rédacteurs : Denis Noiret / Fabien Mosen