Résumé

Méthode pour créer une planète avec les patterns standards et les isosurfaces

Raisonnement

L'idée de base est la suivante : on peut utiliset les patterns standards de POVRay pour générer des terrains (heightfields par exemple), alors pourquoi ne pas faire la meme chose pour générer une planète ? On voudrait donc partir d'une sphère, et pour point de la sphère est éloigné du centre en fonction de la valeur donnée par une texture appliquée sur la sphère. Comme il n'y a pas de primitive pour ce la, on utilisera les isosurfaces

Equation de la sphère

On rappelle que l'équation d'une sphère est : x2+y2+z2=R2, avec R > 0 le rayon de la sphère. Pour simplifier, on prendra R = 1

Valeur du motif sur la sphère de rayon 1

Soit f la fonction représentant le pattern. Posons r = sqrt(x2+y2+z2) la distance d'un point M(x,y,z) à l'origine. Alors la valeur du pattern sur la sphère est f(x/r,y/r,z/r)

Equation de la planète

Soit 0 < a < 1 un coefficient utilisé pour combiner la sphère et le pattern. L'équation de la planète est alors : x2+y2+z2=a × R2 + (1 − a) × f(x/r,y/r,z/r)

Exemple

Extrait de code

#declare f_pattern = function{pattern{crackle form <1,0,0> poly_wave 2 turbulence 0.5 scale 0.5}}
#declare f_planete = function(x,y,z,r){x*x + y*y + z*z -(0.91 + 0.08 * f_pattern(x/r,y/r,z/r))}
#declare f_isosurface = function {f_planete(x,y,z,sqrt(x*x+y*y+z*z))}

isosurface {
    function { f_isosurface(x,y,z) }
    contained_by {sphere{0,1}}
    max_gradient 2.6

    //...etc...
}

Résultat

résultat obtenu avec l'extrait de code précédent