В Box2D, как я могу получить силу сжатия на конкретном теле?

8

введите описание изображения здесь

Я использую Box2D. Как вы можете видеть, есть три динамических тела, связанных друг с другом (представьте себе таблицу как вид спереди). LEG1 и LEG2 подключены к статическому телу (это заземление). Еще одно динамичное тело падает на стол.

Мне нужно получить компрессию в LEG1 и LEG2 отдельно.

Суставы имеют GetReactionForce()функцию, которая возвращает a b2Vec, которая, в свою очередь, имеет Length()и LengthSqd()функции. Это даст общую сумму сил в любом взятом суставе. Но мне нужны силы в отдельных телах, которые связаны с суставами. Как только вы соедините несколько тел одним соединением, оно снова покажет сумму сил, которая не нужна. Вот случай, о котором я говорю:

введите описание изображения здесь

Микаил Абдуллаев
источник
1
>> Как только вы соединяете несколько тел, одно соединение может соединить только два тела. Соедините каждую ножку с табличкой стола, и вы снова получите первый случай. Я ошибаюсь?
Павел
Извините, я просто забыл, что сустав соединяет только два тела.
Микаил Абдуллаев

Ответы:

2

Как на расстоянии, так и на сварных соединениях имеются локальные анкеры. Каждый якорь относительно одного из тел, соединенных суставом. Вы можете найти свое сжатие отдельного сустава, найдя расстояние между двумя опорными точками в мировом пространстве.

Вы можете использовать эти функции, чтобы получить их:

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

Чтобы преобразовать эти точки в мировое пространство, вы можете использовать функцию для каждого тела, которая называется:

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

Сварочные соединения (или дистанционные соединения) должны использовать мягкие ограничения, иначе ошибка в большинстве случаев будет незначительной.

RandyGaul
источник