У меня есть проблема, которую я пытаюсь решить в течение нескольких дней.
Я пытаюсь сделать игру в боулинг, используя физику пуль, но булавка встряхивается, покачивается и перемещается в сторону после того, как я ее расположил, и она упала на пол.
Вот GIF того, что происходит:
http://imgur.com/7Mg41sf
Вот как я создаю Пин:
btCollisionShape* shape = createShape(pinVertices);
btScalar bodyMass = 1.6f;
btVector3 bodyInertia(0,0,0);
shape->calculateLocalInertia(bodyMass, bodyInertia);
btRigidBody::btRigidBodyConstructionInfo bodyCI = btRigidBody::btRigidBodyConstructionInfo(bodyMass, nullptr, shape, bodyInertia);
bodyCI.m_restitution = 0.7;
bodyCI.m_friction = 0.9f;
_physicsBody = std::unique_ptr<btRigidBody>(new btRigidBody(bodyCI));
_physicsBody->setUserPointer(this);
И вот как я создаю пол:
btCollisionShape* shape = createShape(laneVertices);
btScalar bodyMass = 0.0f;
btVector3 bodyInertia(0,0,0);
shape->calculateLocalInertia(bodyMass, bodyInertia);
btRigidBody::btRigidBodyConstructionInfo bodyCI = btRigidBody::btRigidBodyConstructionInfo(bodyMass, nullptr, shape, bodyInertia);
bodyCI.m_restitution = 0.6;
bodyCI.m_friction = 0.5;
_physicsBody = std::unique_ptr<btRigidBody>(new btRigidBody(bodyCI));
_physicsBody->setUserPointer(this);
Прямо сейчас пол btBoxShape
и булавка является btConvexHullShape
, но я попытался использовать цилиндр или конус, и они также скользят.
Несколько дней боролись, особенно если учесть, что сайт и форум Bullet Physics не работают.
Возможно, вам следует установить восстановление (отскок) штифта и пола на что-то меньшее (попробуйте сначала с 0,0). Это должно решить эту проблему, если штифт отскакивает.
Другая вещь, которую вы можете попробовать, — это деактивировать пин-код после его создания. Я не знаю в Bullet, но в JBullet это делается так:
body.setActivationState( CollisionObject.WANTS_DEACTIVATION );
Это остановит вашу булавку, пока какой-нибудь другой объект, такой как шар или другой булавка, не ударит его
Выглядит вполне разумно для меня. Твердое тело точно не отскочит и не разрушится.
У вас есть дальнейшие проблемы с несовершенным приближением реальности. Нижняя часть булавки, вероятно, плоская, что означает, что она теоретически мгновенно падает на пол в нескольких точках. Кроме того, из-за ограниченной точности FP, булавка не будет точно круглой, но тогда эта часть реалистична.
Таким образом, горизонтальные движения, вероятно, происходят из-за того, что небольшая доля свободного падения привела к небольшому отклонению от чистого вертикального падения. При ударе о землю этот компонент не был отменен, но трение при движении в конечном итоге остановило штифт. Так как штифт имел только небольшую горизонтальную скорость, трения было недостаточно, чтобы опрокинуть штифт.