Un nouveau pattern. Hmm, pas facile à décrire, donc voilà l'algorithme de calcul : à partir du point à évaluer un rayon est lancé (soit dans une direction donnée, soit vers un point, soit suivant la normale de l'objet) et le pattern retourne 1 si ce rayon rencontre un objet fourni, 0 sinon.
pigment { projection objet,pointv [blur blur_intensité,nb_samples] .... } pigment { projection parallel objet,dirv [blur blur_intensité,nb_samples] .... } pigment { projection normal objet [blur blur_intensité,nb_samples] .... }
si le mot clé parallel
est utilisé le pattern prend dirv
comme direction de lancé de rayon (Cf. exemple avec parallel), sinon pointv
est le point vers lequel le rayon est envoyé (Cf. exemple avec pointv) . Si le mot clé normal
est utilisé, la normale de l'objet est utilisée comme direction (Cf. exemple avec normal). objet
est l'objet pour le test d'intersection.
Avec l'option blur
: nb_samples
rayons sont envoyés, plus ou moins modifiés par rapport au rayon normal suivant blur_intensité
, et le pattern donne la valeur moyenne du nombre d'intersections avec l'objet.
Un exemple en utilisant l'objet à texturer comme object pour le pattern projection.
#declare obj = object { .. } object { obj pigment { projection parallel obj,<0,1,0> color_map { [0 color rgb <1,0,0>][1 color rgb <0,0,1>] } } }
Rayons parallèles envoyés suivant l'axe y. Si le rayon touche l'objet couleur bleue, sinon rouge.
object { obj pigment { projection parallel obj,<0,1,0> blur 0.2,10 color_map { [0 color rgb <1,0,0>][1 color rgb <0,0,1>] } } }
On ajoute du blur pour lisser la frontière des deux régions.
object { obj texture { projection parallel obj,<0,1,0> blur .2,10 texture_map { [0 txt_abime] [1 txt_ok] } } }
La même chose avec une texture map et deux textures suivant la région.
#declare etoile = object { .. } #declare pt_lum = <...>; sphere { 0,1 pigment { projection etoile,pt_lum color_map { [0 color rgb <1,0,0>][1 color rgb <0,0,1>] } } }
Le mot clé normal
, couplé à un blur 1
, permet de construire une sorte de pattern d'accessibilité.
object { buddha texture { projection normal buddha blur 1,60 texture_map { [0 TRouge] [1 TBleu] } } }
Et la même chose avec deux textures adaptées :
Look for #ifdef PROJECTION_PATCH in sources
The blur uses the "trig method" to pick a random point on the surface of a unit sphere.
Possible improvements/problems
distance
keyword to specify a maximum for the distance of intersection (if the intersection occurs more far than distance then it does not count)