Я хочу проверить весеннее противопоказание Пуля Физика. Поэтому я создал статическую коробку, зависшую над землей, и вторую подвесную коробку, свисающую с нее. Но активация поведения весны ничего не делает! Коробка действительно висит свободно. Я знаю это, потому что он вращается свободно. Но это не колеблется или что-нибудь.
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, но она все еще не колеблется. И да, гравитация активирована.
Хорошо, я нашел решение, проверив предоставленные примеры проектов 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();
Других решений пока нет …