Faire un drapé

Toute la difficulté ici, ou l'astuce plutot, est de bien positionner son tissu au départ, et de faire en sorte qu'il ait tendance à se regrouper en tas.

L'environnement

Une fois de plus, on va faire simple: un cube (aux bords arrondis), posé sur le sol:

#declare R = .1;
#declare Cube = union {
    box { < R, 0, R>, < 1-R, 1, 1-R> }
    box { < R, 0, 0>, < 1-R, 1-R, 1> }
    box { < 0, 0, R>, < 1, 1-R, 1-R> }
    cylinder { < R, 0, R>,  < R, 1-R, R>, R }
    cylinder { < R, 0, 1-R>,  < R, 1-R, 1-R>, R }
    cylinder { < 1-R, 0, R>,  < 1-R, 1-R, R>, R }
    cylinder { < 1-R, 0, 1-R>,  < 1-R, 1-R, 1-R>, R }
    sphere { < R, 1-R, R>, R }
    sphere { < R, 1-R, 1-R>, R }
    sphere { < 1-R, 1-R, R>, R }
    sphere { < 1-R, 1-R, 1-R>, R }
    translate -.2*x
}

#declare Obstacle = union {
    plane { y,0 }
    object { Cube }
}

Premier essai

On réuitilise la macro WriteClothFile(...) de l'exemple précédent, et on crée un drap rectangulaire (30 x 50 points):

WriteClothFile("drape.cth", 30, 50, 2/50, 20, 1.5)

simcloth {
    environment Obstacle
    friction 0
    gravity -.5*y
    damping 0.9
    intervals 0.03
    iterations 200
    input "drape.cth"
    mesh_output "drape.msh"
    smooth_mesh on
    uv_mesh on
}

#declare Drap = mesh {
    #include "drape.msh"
    uv_mapping
    texture {
        pigment {
            checker color rgb<1, .5, .2> color rgb<1, .8 ,.4>
            scale <1/10, 3/50, 1>
        }
    }
}

Bon, c'est bien, mais ce n'est pas ce qu'on appelle un joli drapé (celui-ci est plutot banal...)

Positionnement du tissu au départ

On va modifier le positionnement de chaque point du tissu, dans la macro WriteClothFile(...), en effectuant une rotation de -60 degrés autour de l'axe z, et en le déplacant légèrement vers la droite, comme ceci:

    #local tempx = -l1/2 + i*nlng;
    #local tempz = -l2/2 + j*nlng;
    #local vtemp = ;
    #local vtemp = vaxis_rotate(vtemp, z, -60);
    #local tempy = ht + (-1+2*rand(st))*nlng*0.1;
    #local vtemp = vtemp + tempy*y + .2*x;
    #write(file, vtemp.x, ",", vtemp.y, ",", vtemp.z, ", 0.0, 0.0, 0.0,\n")

On n'oublie pas de "remonter" le tissu, et on visualise la position de départ:

Et ensuite, on laisse faire la nature... enfin ClothRay...

Pour les fainéants, le script complet: drape.pov

Le tissu commence à se "vautrer"...
Quelques itérations plus loin....
... et le résultat.

Evidemment, l'absence de test de collision interne (tissu contre tissu) provoque quelques "erreurs" (voir en bas du drap).... Mais, on peut quand même obtenir des choses plus ou moins satisfaisantes.