• Tutoriel : La CSG part 1 : union

    Bonjour à tous. 

    Voici le premier tutoriel de ce blog, qui concerne la CSG. CSG est l'abréviation de Constructive Solid Geometry. C'est une technique permettant de créer des objets complexes à partir de formes simples. Nous aborderons aujourd'hui la technique la plus simple : l'union.

    Prérequis

    Nous supposerons que vous savez créer une scène simple sous POV-RAY : une source de lumière, même basique, et une caméra. Il vous faudra connaître, au moins pour les bases, les objets box, sphere et cylinder dans un premier temps, et torus par la suite. 

    Quasiment tous les objets sont utilisables en CSG. Nous n'utiliserons que les plus simples pour l'instant.

    Les codes source donnés ci-dessous fonctionneront parfaitement à condition d'ajouter en début de votre fichier la ligne

    #include "couleur.inc" 

    et, bien évidemment, de posséder mon fichier du même nom (vous le trouverez dans les outils). Si vous ne souhaitez pas l'utiliser, libre à vous de remplacer les noms de couleur par des définitions "classiques". Par exemple, vous pouvez utiliser le "color.inc" livré avec le programme pour utiliser les couleurs anglaises.

    L'union : les bases

    Comme son nom l'indique, l'union permet de réunir plusieurs objets en un seul. Pour réaliser un union, il suffit d'écrire :

    union {
        objet1
        objet2
        .....
        dernier objet
    }

     Exemple :


     

     

     


    union {
        box {<-1,-1,-1>,<1,1,1>}
        box {<-0.5,1,-0.5>,<0.5,1.5,0.5>}
        pigment {color ROUGE}
    }

     

     

     

     

    Facile. Mais quel intérêt ?

    Les opérations de CSG mutualisent les textures

    Dans le code précédent, on voit que l'on n'a défini qu'une seule texture, commune aux deux objets. Cela permet d'économiser du code, et de gagner en lisibilité, ainsi qu'en facilité d'évolution. En effet, vous voulez changer la couleur de l'ensemble ? Une seule ligne à changer. Pas de risque d'oubli.

    Plus intéressant encore, la texture est réellement plaquée sur l'ensemble comme si c'était un seul et unique objet.

     

     

     

    union {
        box {<-1,-1,-1>,<1,1,1>}
        box {<-0.5,1,-0.5>,<0.5,1.5,0.5>}
        pigment {marble turbulence 1}
    }

     

     

     

     

     

    Pas de discontinuité. Pas de raccord.

    Les CSG peuvent être utilisés dans un #declare


     

     

     

    #declare tour=union {
        box {<-1,-1,-1>,<1,1,1>}
        box {<-0.5,1,-0.5>,<0.5,1.5,0.5>}
        pigment {marble turbulence 1}
    }
    object {tour}
    object {tour translate 3*y}

     

     

     

     

     Quelle économie de code !

    Les textures sont mutualisées, sauf si l'on demande le contraire

    Il est en effet possible de définir des textures spécifiques à une partie de l'union. Si un des éléments définit une texture de manière explicite, elle sera prédominante sur la texture de l'union :

     

     

     

    union {
        sphere {<-4,1,0>,1}
        sphere {<-2,1,0>,1}
        sphere {<0,1,0>,1 pigment {color BLEU}}
        sphere {<2,1,0>,1}
        sphere {<4,1,0>,1}
        pigment {color ROUGE}
    }

     

     

     

     

    Les Union permettent de créer des objets manquant à POV-RAY

    Ainsi, par exemple, voici un cylindre aux bords arrondis :

     

     

     

     

    union {
        cylinder {<-3,1,0>,<3,1,0>,1}
        sphere {<-3,1,0>,1}
        sphere{<3,1,0>,1}
        pigment {color ROUGE}
    }

     

     

     

     

    Evidemment, on ne fait pas tout avec un union. C'est pour celà que l'on verra plus tard les autres techniques de CSG.

    Pour terminer, un exemple plus complexe, qui ne fait appel qu'à des union :

    (adapté d'un précédent projet)

    #declare Cadre = union {
        sphere {<-3,0.2,-10>,0.2}
        sphere {<3,0.2,-10>,0.2}
        sphere {<-3,0.2,10>,0.2}
        sphere {<-3,0.2,-10>,0.2}
        sphere {<-3,8,-10>,0.2}
        sphere {<3,8,-10>,0.2}
        sphere {<-3,8,10>,0.2}
        sphere {<-3,8,-10>,0.2}
        cylinder {<-3,0.2,-10>,<-3,0.2,10>, 0.2}
        cylinder {<3,0.2,-10>,<3,0.2,10>, 0.2}
        cylinder {<-3,0.2,10>,<3,0.2,10>,0.2}
        cylinder {<-3,8,-10>,<-3,8,10>, 0.2}
        cylinder {<3,8,-10>,<3,8,10>, 0.2}
        cylinder {<-3,8,10>,<3,8,10>,0.2}
        cylinder {<-3,0.2,-10>,<-3,8,-10>,0.2}
        cylinder {<3,0.2,-10>,<3,8,-10>,0.2}
    }
    #declare Boule=union{ 
        cylinder{ <-3,0,0>,<0,-5.5,0>,0.02}
        cylinder{ <3,0,0>,<0,-5.5,0>,0.02}
        sphere{<0,-6,0>,1}
    }
    union {
        object {Cadre}
        object{Boule rotate 45*x translate <0,8,-6>}
        object{Boule translate <0,8,-4>}
        object{Boule translate <0,8,-2>}
        object{Boule translate <0,8,0>}
        object{Boule translate <0,8,2>}
        object{Boule translate <0,8,4>}
        object{Boule translate <0,8,6>}
        pigment {color ROUGE}
        scale 0.3
    }

     

    Prochain épisode : l'opération Merge.

    A bientôt

    « 100 !Tutoriel : la CSG part 2 : merge »

    Tags Tags : , , , , , , ,
  • Commentaires

    Aucun commentaire pour le moment

    Suivre le flux RSS des commentaires


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :