Wie kann ich in Box2D die Kompressionskraft auf einen bestimmten Körper erhalten?

8

Geben Sie hier die Bildbeschreibung ein

Ich benutze Box2D. Wie Sie sehen können, sind drei dynamische Körper miteinander verbunden (stellen Sie sich das als Tabelle aus der Vorderansicht vor). LEG1 und LEG2 sind mit dem statischen Körper verbunden (es ist der Bodenkörper). Ein weiterer dynamischer Körper fällt auf den Tisch.

Ich muss die Komprimierung in LEG1 und LEG2 separat erhalten.

Gelenke haben eine GetReactionForce()Funktion, die a zurückgibt b2Vec, was wiederum hat Length()und LengthSqd()funktioniert. Dies ergibt die Gesamtsumme der Kräfte in einem genommenen Gelenk. Was ich aber brauche, sind Kräfte in einzelnen Körpern, die mit Gelenken verbunden sind. Sobald Sie mehrere Körper mit einem einzigen Gelenk verbinden, wird erneut die Summe der Kräfte angezeigt, was nicht sinnvoll ist. Hier ist der Fall, über den ich spreche:

Geben Sie hier die Bildbeschreibung ein

Mikayil Abdullayev
quelle
1
>> Sobald Sie mehrere Körper verbunden haben Ein Gelenk kann nur zwei Körper verbinden. Verbinden Sie jedes Bein mit der Tischplatte, und Sie erhalten erneut den ersten Fall. Liege ich falsch?
Pavel
Entschuldigung, ich habe nur vergessen, dass ein Gelenk nur zwei Körper verbindet.
Mikayil Abdullayev

Antworten:

2

Sowohl die Distanzverbindung als auch die Schweißverbindung haben lokale Anker in sich. Jeder Anker ist relativ zu einem der Körper, die durch die Verbindung verbunden sind. Sie können Ihre Kompression eines einzelnen Gelenks ermitteln, indem Sie den Abstand zwischen den beiden Ankerpunkten im Weltraum ermitteln.

Mit diesen Funktionen können Sie sie abrufen:

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

Um diese Punkte in den Weltraum umzuwandeln, können Sie die Funktion für jeden Körper verwenden, die heißt:

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

Die Schweißverbindungen (oder Distanzverbindungen) sollten weiche Einschränkungen verwenden, da sonst der Fehler ohnehin meistens vernachlässigbar ist.

RandyGaul
quelle