english version

ClothRay, comment ca marche ?

Au niveau du script, cette nouvelle fonctionnalité est implémentée sous la forme d'un nouveau bloc de déclaration:

simcloth {
  [ environment OBJECT ]
  [ friction FLOAT ]
  [ gravity VECTOR ]
  [ wind { PIGMENT } ]
  [ viscosity FLOAT ]
  [ neighbors 0|1 ]
  [ internal_collision on|off ]
  [ damping FLOAT ]
  [ intervals FLOAT ]
  [ iterations INTEGER ]
    input STRING   // seul parametre obligatoire
  [ output STRING ]
  [ mesh_output STRING ]
  [ smooth_mesh on|off ]
  [ uv_mesh on|off ]
}

environment

Cela permet de déclarer un objet qui va servir d'environnement. Il est fortement conseillé de le déclarer avant le bloc simcloth (pour des raisons évidentes de lisibilité). Bien que n'importe quel type d'objet puisse etre utilisé, ceux qui disposent d'un intérieur bien défini réagiront bien mieux aux tests de collisions.

friction

Il s'agit d'un coefficient de perte au contact de l'environnement. Une valeur nulle signifie que le tissu sera très fortement ralenti, alors qu'une valeur de 1 permettra au tissu de glisser sur les objets (mais pas de rebondir...). La valeur par défaut (si un environnement est défini) est 1.0.

gravity

Permet de spécifier la direction de la gravité. La gravité est nulle par défaut.

wind

Un pigment est utilisé pour définir la direction et la force du vent en chaque point de l'espace. En un point donné, le vent est défini par les composantes r, g et b du pigment en ce point. On peut utiliser une déclaration explicite de pigment, ou bien un identifiant déclaré auparavant. N'oubliez pas que les composantes d'une couleur peuvent prendre n'importe quelle valeurs (négatives, valeur absolue supérieure à 1, ...)

viscosity

Détermine l'influcence du vent et des frottements de l'air sur le tissu. La valeur par défaut est 0 (pas d'influence).

neighbors

Spécifie le nombre de voisins auxquels chaque point est relié par un ressort. neighbors 0 correspond à 8 voisins (calcul plus rapide, mais plus approximatif), et neighbors 1 (valeur par défaut) correspond à 24 voisins (calcul plus lent, résultat plus réaliste).

internal_collision

Active la détection des collisions tissu contre tissu. Ce problème est géré par l'ajout de ressort entre deux points du tissu qui se rapproche l'un de l'autre. Une instabilité du systeme peut apparaitre plus facilement et il faut généralement réduire le paramètre intervals (voir plus bas). Désactive par défaut (off).

damping

Coefficent de frottement plus général, il permet essentiellement de limiter l'accumulation des approximations du modèle physique qui pourraient conduire à son instablilité. En bref, un valeur inférieure à .95 (valeur par défaut) est très fortement recommandée.

intervals

Représente le delta de temps entre chaque itération. A laisser impérativement faible (enfin, ca dépend d'autres paramètres comme damping, ou le coefficient de raideur du tissu, mais bon....). Par défaut, 0.05 est utilisé.

iterations

C'est tout simplement le nombre d'itérations à effectuer (une seule, par défaut).

input

Nom du fichier .cth de départ. Seul paramètre obligatoire (ca se comprend...). Pour la description du format de ce fichier, voir plus bas.

output

Nom du fichier .cth d'arrivée. Si ce paramètre est spécifié, le résultat de la simulation sera sauvegardé. Utile pour une animation, ou une simulation en plusieurs étapes.

mesh_output

Permet de générer un fichier (du nom spécifié) contenant les triangles correspondants aux points du tissu a l'issu de la simulation. Cela permet de sauvegarder le résultat d'une simulation dans un format utilisable par une autre version de POV (qui aurait de nouvelles fonctionnalités).

smooth_mesh

Active ou désactive la création de smooth_triangle si l'option mesh_ouput est activée. Désactivée par défaut.

uv_mesh

Active ou désactive l'ajout de coordonnées UV lors de la création des triangle (ou smooth_triangle) si l'option mesh_ouput est activée. Les coordonnees UV s'étendent de < 0, 0 > à < 1, 1 >. Désactivée par défaut.

Description du format de fichier .cth

Le format du fichier est très simple: la première ligne décrit les dimensions de l'étoffe (nombre de points n1 et n2 dans les deux dimensions, longueur nominale entre deux points voisins nlng), et son coefficient de raideur ks. Ensuite, chaque ligne décrit la position dans l'espace et la vitesse de chaque point. Toutes les valeurs (3 pour la position, 3 pour la vitesse) sont séparées par des virgules, et chaque ligne se termine également par une virgule.

Vient ensuite la définition des contraintes sur certains points. Les contraintes sont des coefficients (1 pour chaque axe) qui vont pondérer les coordonnées du vecteur vitesse d'un point donné du tissu. On pourra, par exemple, freiner un coin du tissu suivant un axe, le stopper complètement sur un autre axe, alors qu'il sera totalement libre sur le dernier. Une contrainte est définie par un entier (l'index), et les 3 coefficients représentant la contrainte (respectivement sur les axes x, y, z), tous sur la même ligne et séparés par des virgules. L'index est le rang du point (en commencant à 0) dans l'ordre de déclaration des points. Les contraintes peuvent etre déclarées dans n'importe quel ordre.

Le tissu est en fait représenté par deux tableaux de vecteurs Points[n1][n1] et Vitesse[n1][n1], et ses contraintes Indexn, contn. Le fichier aura donc cette allure:

n1, n2, nlng, ks,
Points[0][0], Vitesse[0][0],
Points[0][1], Vitesse[0][1],
...
Points[0][n2-1], Vitesse[0][n2-1],
Points[1][0], Vitesse[1][0],
Points[1][1], Vitesse[1][1],
...
Points[1][n2-1], Vitesse[1][n2-1],
Points[2][0], Vitesse[2][0],
...
...
Points[n1-1][n2-1], Vitesse[n1-1][n2-1],
Index1, cont1[x], cont1[y], cont1[z],
Index2, cont2[x], cont2[y], cont2[z],
Index3, cont3[x], cont3[y], cont3[z],

Des exemples de macros pour créer et lire ces fichiers sont fournies avec le patch.