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

des motifs sur mesure

- Je veux une cadillac rose !!!!
- Ben voyons, avec des petits points blancs aussi ?
- Non ! Une cadillac rose avec des etoiles vertes !!!

Au fil du temps et des versions, le système de textures de POV-Ray s'est étoffé de nombreuses fonctionnalités (notamment dans MegaPOV, et la future version 3.5 de POV-Ray), dont on ne cesse de découvrir de nouvelles utilisations créatives. Nous allons donc tenter de créer, non pas une Cadillac, mais un cylindre rose, avec des petites étoiles vertes, si possible placées aleatoirement et de tailles diverses.

Pour bien comprendre ce qui suit, vous devez d'abord vous familiariser avec les motifs object et pigment_pattern, documentés dans la section appropriée.

Des petites étoiles vertes

MegaPOV

Le motif object va nous permettre de créer très facilement un motif représentant une étoile. En utilisant les warp{repeat}, cette étoile va pouvoir être dupliquée suivant les axes x et y. Voici le code:

// Définition d'un objet en forme d'étoile a 5 branches (approximation)

#local Points = array[10]

#local P = pi/5;

#local Points[0] = <cos(0*P), sin(0*P)>;
#local Points[1] = <.4*cos(1*P), .4*sin(1*P)>;
#local Points[2] = <cos(2*P), sin(2*P)>;
#local Points[3] = <.4*cos(3*P), .4*sin(3*P)>;
#local Points[4] = <cos(4*P), sin(4*P)>;
#local Points[5] = <.4*cos(5*P), .4*sin(5*P)>;
#local Points[6] = <cos(6*P), sin(6*P)>;
#local Points[7] = <.4*cos(7*P), .4*sin(7*P)>;
#local Points[8] = <cos(8*P), sin(8*P)>;
#local Points[9] = <.4*cos(9*P), .4*sin(9*P)>;

#declare O_Etoile = prism {
    linear_sweep
    linear_spline
    -50, 50,
    11,
    Points[0], Points[1], Points[2], Points[3], Points[4],
    Points[5], Points[6], Points[7], Points[8], Points[9],
    Points[0]
    rotate -x*90
    scale .25
}


// Définition du pigment P_Etoiles
#declare P_Etoiles = pigment {
    object { O_Etoile color Black, color White }
	translate .5*x + .5*y
	warp { repeat x }
	warp { repeat y }
}

Bof, un peu ennuyeux comme motif....

MegaPOV

Tout-à-fait. On va donc introduire un peu de "chaos" dans tout ça. Nous allons commencer par définir plusieurs motifs, avec une étoile ayant subi une rotation, une mise à l'echelle et une translation aléatoires (mais de telle manière qu'elle tienne toujours dans le carre <0,0>, <1,1> du plan xy, à cause des repeat). Pour cela, rien de mieux qu'une macro:

// Définition de la macro P_Etoiles
#macro P_Etoiles(rnd)
#local st=seed(123*rnd);
    object { O_Etoile color Black, color White }   // toujours notre étoile
    rotate z*360*rand(st)                          // rotation aléatoire
#local sc = (.5+rand(st));                         // facteur d'échelle aléatoire
    scale sc
#local depmax = .5-.25*sc;                         // calcul du déplacement maximum
    translate depmax*(-1+2*rand(st))*x             // déplacement aléatoire suivant x
    translate depmax*(-1+2*rand(st))*y             // et suivant y
    translate .5*x + .5*y                          // recentrage
    warp { repeat x }                              // et répétition suivant x
    warp { repeat y }                              // et suivant y
#end

Afin d'agencer ces différents pigments, on utilise le motif cells, qui renvoie une valeur aléatoire pour chaque "cube" de l'espace de dimension 1x1x1. Et hop ! Une bonne occasion d'utiliser une boucle #while....

#declare Plein_D_Etoiles = pigment {
    pigment_pattern {
        cells                              // pour une raison inconnue, cells semble renvoyer
        translate -z*.5 + 100*y + 100*x    // des valeurs proches les unes des autres autour
    }                                      // de l'origine....
    pigment_map {
        #local st = seed(1212);
        #local param = 9876*rand(st);
        [0 P_Etoiles(param)]
        #local i = 0.02;
        #while (i<1)
            [i  P_Etoiles(param)]
            #local param = 9876*rand(st);
            [i  P_Etoiles(param)]
            #local i=i+.02;
        #end
        [1 P_Etoiles(param)]
    }
}

En colorama.....

Voila notre motif prêt à l'emploi. Il ne renvoie que deux valeurs (0 là où c'est noir, et 1 là où c'est blanc). Il ne reste plus qu'à le peindre, et l'"enrouler" autour de notre cylindre....

#declare T_Rose = texture {
    pigment { color Pink }
    finish { brilliance .8 phong .3 phong_size 20 }
}

#declare T_Vert = texture {
    pigment { color SeaGreen }
    finish { brilliance 1.1 specular .7 roughness .01 }
}

cylinder {
    -10*y, 10*y, 1
    texture {
        pigment_pattern { Plein_D_Etoiles }        // le motif
        scale <1/15, 2*pi*1/15, 1>                 // mise a l'échelle avant "enroulage"
        warp { cylindrical }                       // autour du cylindre d'axe y
        texture_map {
            [0 T_Rose]
            [1 T_Vert]
        }
    }
    rotate x*40
    rotate -z*30
}

auteur : Christophe Bouffartigue (Bouf)