Как сделать пружинное ограничение с помощью Bullet Physics?

Я хочу проверить весеннее противопоказание Пуля Физика. Поэтому я создал статическую коробку, зависшую над землей, и вторую подвесную коробку, свисающую с нее. Но активация поведения весны ничего не делает! Коробка действительно висит свободно. Я знаю это, потому что он вращается свободно. Но это не колеблется или что-нибудь.

btCollisionShape *boxShape = createBoxShape(0.2f, 0.2f, 0.2f);

btRigidBody *box1 = createStatic(boxShape);
btRigidBody *box2 = createDynamic(1.0f /*mass*/, boxShape);

box1->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 2.0f, 1.0f }));
box2->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 1.0f, 1.0f }));

btGeneric6DofSpring2Constraint *spring = new btGeneric6DofSpring2Constraint(
*box1, *box2,
btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }),
btTransform(btQuaternion::getIdentity(), { 0.0f,  0.0f, 0.0f })
);

// I thought maybe the linear movement is locked, but even using these lines do not help.
// spring->setLinearUpperLimit(btVector3(0.0f,  0.1, 0.0f));
// spring->setLinearLowerLimit(btVector3(0.0f, -0.1, 0.0f));

// Enabling the spring behavior for they y-coordinate (index = 1)
spring->enableSpring(1,  true);
spring->setStiffness(1, 0.01f);
spring->setDamping  (1, 0.00f);
spring->setEquilibriumPoint();

Что случилось? Я много играл с Stiffness а также Damping параметры. Но это ничего не изменило. Установка линейного нижнего и верхнего пределов делает коробку подвижной в направлении y, но она все еще не колеблется. И да, гравитация активирована.

3

Решение

Хорошо, я нашел решение, проверив предоставленные примеры проектов Bullet (мог бы придумать идею раньше). Три вещи, которые я узнал:

  • Весеннее ограничение будет не нарушать линейные пределы. Проблема с моим прежним подходом состояла в том, что линейное движение было либо заблокировано, либо ограничено слишком маленьким диапазоном для назначенной жесткости пружины. Теперь ограничений больше нет (установив нижний предел выше верхнего).
  • Жесткость была слишком мала, поэтому соединяемые объекты действовали так, как будто они могли свободно перемещаться в пределах линейных пределов. Вы можете проверить значения в моем коде ниже, я получил их из примера проекта.
  • Существует небольшая разница в поведении между btGeneric6DofSpringConstraint а также btGeneric6DofSpring2Constraint, Первый, кажется, меньше фиолетовых осей без пружины (оси X и Z в моем случае). Последний, кажется, применяет более сильное демпфирование. Но это только первые наблюдения.
btGeneric6DofSpringConstraint *spring = new btGeneric6DofSpringConstraint(
*box1, *box2,
btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }),
btTransform(btQuaternion::getIdentity(), { 0.0f,  0.0f, 0.0f }),
true
);

// Removing any restrictions on the y-coordinate of the hanging box
// by setting the lower limit above the upper one.
spring->setLinearLowerLimit(btVector3(0.0f, 1.0f, 0.0f));
spring->setLinearUpperLimit(btVector3(0.0f, 0.0f, 0.0f));

// Enabling the spring behavior for they y-coordinate (index = 1)
spring->enableSpring(1,  true);
spring->setStiffness(1, 35.0f);
spring->setDamping  (1,  0.5f);
spring->setEquilibriumPoint();
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]