• Tutoriel : la CSG part 3 : difference

    Bonjour à tous.

    Aujourd'hui, nous coupons, nous tranchons, nous évidons, nous perçons... troisième partie du tutoriel sur la CSG : la jonction Difference.

    Prérequis

    Vous avez lu et compris la partie 1 de ce tutoriel, et éventuellement la partie 2. 

    Les exemples fonctionnent avec la présence du fichier couleur.ini, présent dans les outils, ou après modification du pigment, sans outil supplémentaire. La scène de base est présente dans le menu include de la version 3.7 de POVRAY.

    La jonction Difference

    Comme son nom l'indique, cette jonction va permettre de faire la différence entre deux objets. L'objet résultant sera donc le premier objet, amputé des parties communes au second objet. Le second objet est invisible. L'exemple suivant sera plus parlant :

     

     

     

    union {
    box {<-4,0,-1>,<-2,2,1>}
    sphere {<-3,2,0>,1}
    pigment {color ROUGE}
    }
    difference {
    box {<4,0,-1>,<2,2,1>}
    sphere {<3,2,0>,1}
    pigment {color ROUGE}
    }

     

    Une différence peut compter plus de deux objets

    Dans ce cas, le résultat sera le premier objet, tronqué de tous les autres.

     

     

    sphere {<-3,1,0>,1 pigment {color ROUGE} }
    difference {
    sphere {<0,1,0>,1}
    box {<-2,1,-2>,<2,3,2>}
    pigment {color ROUGE}
    }
    difference {
    sphere {<3,1,0>,1}
    box {<1,1,-2>,<5,3,2>}
    sphere {<3,1,0>,0.9}
    pigment {color ROUGE}
    }

     

     

     

    Le pigment est commun à tout l'objet, sauf si on en précise un autre

    Si l'on précise un pigment pour un des objets soustraits, ce dernier ne sera évidemment pas affiché. Par contre, il colorera bien la face extrudée par celui-ci. Encore un moyen de créer des objets texturés complexes.

     

     

     

    difference {
    box {<-4,0,-1>,<-2,2,1>}
    sphere {<-3,2,0>,1}
    pigment {color ROUGE}
    }
    difference {
    box {<4,0,-1>,<2,2,1>}
    sphere {<3,2,0>,1 pigment {color VERT} }
    pigment {color ROUGE}
    }

     

     

    Un piège classique : les surfaces concourantes

    Rappelez-vous : les ordinateurs font des erreurs de calcul. Sous POVRAY, les erreurs en question ont en général des conséquences largement inférieures à la taille d'un pixel, et n'ont donc aucune conséquence. L'exception à cette règle est en CSG. 

    Ainsi, quand dans une différence, les deux objets ont une face commune, le système ne sait pas s'il doit garder cette surface ou la supprimer. Le même objet peut apparaître plein ou creux selon l'angle.

     

    difference {
        box {<-4,0,-1>,<-2,2,1>}
        box {<-3.5,0,-0.5>,<-2.5,2,0.5> pigment {color VERT}}
    pigment {color ROUGE}
    }
    difference {
        box {<4,0,-1>,<2,2,1>}
        box {<3.5,-0.0001,-0.5>,<2.5,2.00001,0.5> pigment {color     VERT}}
        pigment {color ROUGE}
    }

     

     

     

     

    Voyez sur le cube de gauche comment la surface apparaît vert mouchetée de rouge. Certains points de la surface sont supprimés, d'autres pas, et de manière imprévisible. 

    La solution ? Comme dans l'exemple de droite : faire dépasser, même d'un tout petit peu le second objet. Vous pouvez le faire dépasser de beaucoup ou peu, cela n'a aucune incidence, que ce soit au niveau du résultat ou de la vitesse d'éxécution.

    Ceci n'est pas un problème marginal : tous les débutants ont ce problème un jour et passent une éternité à se demander d'où vient cet effet bizarre sur leur objet. Une fois que l'on a compris l'astuce, et que l'on s'est fait avoir une ou deux fois, on prend l'habitude de "couper large".

    Vous pouvez mélanger des union, merge et difference ensemble.

    Un union, un merge ou une difference sont considérés comme un seul objet. Cet objet peut donc intervenir dans une autre CSG.

    L'exemple suivant montre la construction du bougeoir de notre scène. Les unités sont les vraies unités de la scène (1 unité = 1 cm). Il a donc été nécessaire  de recuer un peu la caméra.

     


    difference {
        torus {4.25,2.75 translate 2.75*y}
        box {<-8,2.75,-8>,<8,8,8>}
        pigment {color OR}
    }

     

     

     

     

     

     

     

     

     

     

     

     

    difference {
    torus {4.25,2.75 translate 2.75*y}
    box {<-8,2.75,-8>,<8,8,8>}
    torus {4.25,2.25 translate 2.75*y}
    pigment {color OR}
    }

     

     

     

     

     

     

     

    difference {
    torus {4.25,2.75 translate 2.75*y}
    box {<-8,2.75,-8>,<8,8,8>}
    torus {4.25,2.25 translate 2.75*y}
    scale <1,0.5,1>
    pigment {color OR}
    }

     

     

     

     

     

     

     

     

     

     

    difference {
    cylinder {<0,1.3,0>,<0,5,0>,2}
    cylinder {<0,0,0>,<0,7,0>,1.5}
    pigment {color OR}
    }

     

     

     

     

     

     

     

    union {
    difference {
    torus {4.25,2.75 translate 2.75*y}
    box {<-8,2.75,-8>,<8,8,8>}
    torus {4.25,2.25 translate 2.75*y}
    scale <1,0.5,1>
    }
    difference {
    cylinder {<0,1.3,0>,<0,5,0>,2}
    cylinder {<0,0,0>,<0,7,0>,1.5}
    }
    pigment {color OR}
    }

     

     

     

    union {
    difference {
    torus {4.25,2.75 translate 2.75*y}
    box {<-8,2.75,-8>,<8,8,8>}
    torus {4.25,2.25 translate 2.75*y}
    scale <1,0.5,1>
    }
    difference {
    cylinder {<0,1.3,0>,<0,5,0>,2}
    cylinder {<0,0,0>,<0,7,0>,1.5}
    }
    torus {1.75,0.25 translate 5*y}
    pigment {color OR}
    }

     

     

     

     

     

    union {
    difference {
    torus {4.25,2.75 translate 2.75*y}
    box {<-8,2.75,-8>,<8,8,8>}
    torus {4.25,2.25 translate 2.75*y}
    scale <1,0.5,1>
    }
    difference {
    cylinder {<0,1.3,0>,<0,5,0>,2}
    cylinder {<0,0,0>,<0,7,0>,1.5}
    }
    torus {1.75,0.25 translate 5*y}
    torus {6.75,0.25 translate 1.375*y}
    pigment {color OR}
    }

     

     

     

     

    A bientôt pour la partie 4 de ce tutoriel.

    « Allumer le feu...Tutoriel : la CSG part 4 : intersection »

    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 :