Comment calculer les forces exercées par un fil tendu enveloppant des objets 2D?

10

Supposons que j'ai une primitive physique que je vais appeler un «fil», enroulé autour d'un environnement 2D (comme décrit dans cette question ).

Voici une illustration de ce à quoi cela pourrait ressembler:

fil enroulé autour d'objets de jeu statiques et dynamiques

Dans l'exemple d'illustration: La boîte est tirée vers le haut (maintenue) par le fil, et la boîte tire le fil vers le bas. L'objet sur le ressort est poussé vers le bas par le fil, mais pousse également le fil vers le haut.

Bien que je n'aie pas encore compris comment l'implémenter, supposons que le fil glisse librement sur les points autour desquels il est enroulé.

Dans une simulation physique 2D (c.-à-d. Basée sur une image), comment calculez-vous les forces (ou impulsions) à appliquer aux objets qui sont attachés à ou enroulés par un fil comme celui-ci?


Comme je l'ai mentionné dans ma première question , j'imagine que si le seul objet non statique "sur" le fil était la masse à la fin, alors la force serait identique à un joint de longueur fixe entre la masse et le point avant que sur le fil.

Andrew Russell
la source

Réponses:

9

La boîte tirant sur le fil applique une tension au fil. La tension est une force, mesurée en newtons. Si nous faisons quelques hypothèses simplificatrices (pas de frottement entre le fil et l'environnement), alors la tension est la même à tous les points le long du fil.

Si nous considérons que votre exemple est statique, alors la tension sur le fil n'est que le poids de la boîte:

T = m * g

où m est la masse de la boîte et g est l'accélération due à la gravité (soit 9,8 m / s ^ 2). Notez que cela n'est valable que dans le cas statique, voir ci-dessous pour une explication sur la façon de le calculer dans le cas dynamique.

La force à chaque courbure du fil n'est alors que la projection de la tension dans la direction appropriée. Par exemple, la force à la pointe de l'objet ressort est une force le long de la normale de contact, de magnitude:

F = T * cos(angle between wire and contact normal)

Dans ce cas, la direction normale de contact serait la bissection de l'angle entre les segments de fil. La force à votre deuxième point marqué sur l'environnement est sans importance, car elle n'a aucun impact sur la tension ou quoi que ce soit d'autre.

Maintenant, dans le cas dynamique, la tension est simplement la force de contrainte que vous appliquez à la boîte afin de la maintenir attachée au fil. Donc, si le moteur physique est basé sur l'impulsion, la tension est juste:

T = impulse / timestep

Cela conduit également à l'algorithme général pour enrouler le fil autour de l'environnement. La propriété importante est la longueur totale du fil. Seul le dernier segment doit être simulé, tous les segments précédents peuvent être considérés comme fixes. Ainsi, la longueur du dernier segment est connue, il suffit de soustraire les longueurs des segments précédents de la longueur totale. Le dernier segment peut alors être une simple contrainte de ressort. Ensuite, divisez simplement un segment chaque fois qu'il intersecte avec l'environnement et supprimez le fractionnement lorsque le virage se redresse.

Niall
la source
Donc - juste pour clarifier: j'aurais la masse libre sur un joint de longueur fixe qui s'attache au monde au prochain "coude" du fil. Je découvre quelle impulsion ce joint s'applique à la boîte à chaque cadre, et à partir de là, je peux obtenir la tension dans le fil?
Andrew Russell
Aussi - je m'inquiète F = T * cos(angle between wire and spring axis). Quel angle exactement? Aussi: Je ne pense pas que (dans la simulation) il existe un moyen sensé de faire "savoir" au fil qu'il y a un ressort attaché à cet objet.
Andrew Russell
@Andrew - Pour votre premier point, oui, la force appliquée à la boîte par le joint est par définition égale à la tension dans le fil. Pour votre deuxième point, vous avez raison, ce n'était pas très clair, c'est en fait l'angle entre le fil et le point de contact normal. J'ai édité la réponse pour rendre cela plus clair.
Niall
4

J'apprécie vraiment votre frustration dans ces fils à base de fil, c'est un problème difficile à résoudre. Nous n'avons jamais réussi à faire fonctionner les collisions de façon parfaite, mais la simulation de contraintes est définitivement réalisable et simple.

Une contrainte de fil est en fait presque identique à une contrainte de distance régulière. Au lieu de deux points de contrainte, vous avez n + 1 pour un fil à n segments, un pour chaque sommet - aux extrémités, le jacobien est identique à une contrainte de distance (c'est-à-dire quelque chose comme d / | d | où d est le vecteur entre les points), et pour les nœuds internes, le jacobien est quelque chose comme (a / | a | - b / | b |) où a et b sont les vecteurs du nœud aux nœuds adjacents. (Désolé, ça fait quelques années que j'ai touché à ça ...)

Vous ne pouvez pas le simuler à la "seul le dernier segment est dynamique" car, comme dans votre exemple, les objets peuvent interagir avec d'autres segments, mais vous avez seulement besoin de simuler des masses aux extrémités de la corde - en interne, la corde peut être sans masse. Les impulsions de contrainte calculées à chaque nœud doivent être appliquées à l'objet qui entre en collision avec ce nœud.

Voici quelques articles connexes:

Les trois premiers sont relativement récents et devraient beaucoup aider. La page 75 du document du bas décrit une contrainte "multibars" qui est essentiellement un fil.

Bonne chance :)

raigan

raigan
la source
0

L'idée de base est que la longueur de la corde reste la même. S'il est poussé vers le haut, vous devrez y créer un "point de partage". Ensuite, la corde détermine de quel côté elle est attachée, car elle ne peut pas "pousser" dans cette direction. Parce qu'il est attaché à quelque chose à droite, le morceau de corde à gauche deviendra plus court et la pièce entre le point de partage et le point attaché deviendra légèrement plus longue. Puis, comme l'a dit Niall, calculez la tension du fil. Comment je ferais cela est de calculer la tension de chaque "morceau" de corde. Vous pouvez ensuite l'utiliser pour déterminer les forces impliquées.

J'espère que cela t'aides.

chevalier666
la source
Pas vraiment, désolé.
Andrew Russell