Dans Box2D, comment puis-je obtenir la force de compression sur un corps spécifique?

8

entrez la description de l'image ici

J'utilise Box2D. Comme vous pouvez le voir, il existe trois corps dynamiques connectés les uns aux autres (pensez-y comme une table vue de face). LEG1 et LEG2 sont connectés au corps statique (c'est le corps de masse). Un autre corps dynamique tombe sur la table.

J'ai besoin d'obtenir la compression dans le LEG1 et LEG2 séparément.

Les joints ont une GetReactionForce()fonction qui renvoie a b2Vec, qui à son tour a Length()et LengthSqd()fonctionne. Cela donnera la somme totale des forces dans n'importe quelle articulation prise. Mais ce dont j'ai besoin, ce sont des forces dans les corps individuels qui sont liées aux articulations. Une fois que vous connectez plusieurs corps avec une seule articulation, cela montrera à nouveau la somme des forces qui n'est pas utile. Voici le cas dont je parle:

entrez la description de l'image ici

Mikayil Abdullayev
la source
1
>> Une fois que vous connectez plusieurs corps Un joint ne peut connecter que deux corps. Connectez chaque pied à l'assiette de la table et vous obtiendrez à nouveau le premier boîtier. Ai-je tort?
Pavel
Désolé, j'ai juste oublié qu'un joint ne joint que deux corps.
Mikayil Abdullayev

Réponses:

2

Le joint de distance et les joints de soudure contiennent des ancrages locaux. Chaque ancre est relative à l'un des corps reliés par l'articulation. Vous pouvez trouver votre compression d'une articulation individuelle en trouvant la distance entre les deux points d'ancrage dans l'espace mondial.

Vous pouvez utiliser ces fonctions pour les récupérer:

joint->GetLocalAnchorA( );
joint->GetLocalAnchorB( );

Pour transformer ces points en espace mondial, vous pouvez utiliser la fonction sur chaque corps appelée:

body->GetWorldPoint( v ); // Get the world coordinates of a vector given the local coordinates.

Les joints de soudure (ou joints de distance) doivent utiliser des contraintes douces, sinon l'erreur sera de toute façon négligeable de toute façon.

RandyGaul
la source