3. Projection

3.1. Description

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.

3.2. Syntaxe

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.

Note :  Ce pattern peut être utilisé dans texture_map etc.

3.3. Exemples

3.3.1. Avec parallel

Un exemple en utilisant l'objet à texturer comme object pour le pattern projection.

projection
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.

projection avec blur
Pattern projection avec blur
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.

projection avec texture_map
Pattern projection avec texture_map
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.

3.3.2. Avec pointv

projection avec un point
Pattern projection avec un point
#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>] } }
}

3.3.3. Avec normal

Le mot clé normal, couplé à un blur 1, permet de construire une sorte de pattern d'accessibilité.

projection avec normal
Pattern projection avec normal
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 :

projection avec normal et textures
Pattern projection avec normal et textures

3.4. Program

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

  • Faster blurring with an adaptive number of samples
  • A distance keyword to specify a maximum for the distance of intersection (if the intersection occurs more far than distance then it does not count)
  • Not only projection of an object but projection of its pigment ?