2014-07-25 32 views
-1

我正在玩子弹,我有一个地面和一个球,我希望球落在地面上弹跳。然而,这并没有发生,即使是非常高的值m_restitution,这应该是规范的反弹。子弹物理 - 球体不会弹跳

任何线索为什么会发生这种情况?这几个小时现在折磨我没有运气。

btBroadphaseInterface* broadphase = new btDbvtBroadphase(); 

btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); 

btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); 

btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; 

dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); 

dynamicsWorld->setGravity(btVector3(0,+9.8,0)); // GLWidget - y axis points downwards !!! 


///////////////////////////////////////////////////////////////////////////// 
//// Ground /////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////////////////// 

btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,0,0))); 

btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0, groundMotionState, groundShape, btVector3(0,0,0)); 

groundRigidBodyCI.m_restitution  = 1.0f; 
groundRigidBodyCI.m_friction  = 3.0f; 
groundRigidBodyCI.m_rollingFriction = 3.0f; 
groundRigidBodyCI.m_mass   = 0.0f; 

btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI); 

dynamicsWorld->addRigidBody(groundRigidBody); 


///////////////////////////////////////////////////////////////////////////// 
//// Ball ///////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////////////////// 

btDefaultMotionState* ballMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,-100,0))); 

btScalar ballMass = 1; 
btVector3 ballInertia;//(0,0,0); 
ballShape->calculateLocalInertia(ballMass, ballInertia); 

btRigidBody::btRigidBodyConstructionInfo ballRigidBodyCI(ballMass, ballMotionState, ballShape, ballInertia); 
groundRigidBodyCI.m_restitution = 1.0f; 
ballRigidBodyCI.m_friction  = 1.0f; 
ballRigidBodyCI.m_rollingFriction = 1.0f; 

btRigidBody* ballRigidBody = new btRigidBody(ballRigidBodyCI); 
dynamicsWorld->addRigidBody(ballRigidBody); 


//Without the next it doesn't bounce at all 
//With it, it bounces just a TINY little bit 
dynamicsWorld->getSolverInfo().m_splitImpulse = false; 
+1

只是说:读代码真的很痛苦,可以做些什么来缩进它,并将其更好地分开? –

+0

是的,现在我希望它更好。 –

回答

2

好的,上面的代码应该在理论上工作,但我不知道为什么它不起作用。

如上所述,调节弹性的属性为m_restitution。这可以通过两种方式来设置。第一种方式是在问题中提到的。另一种方式如下:

groundRigidBody->setRestitution(1.0); 
ballRigidBody->setRestitution(1.0); 

...它的工作原理。根据我在网上阅读的内容(例如here),两种方式都应该没问题,但在我看来,它只能用第二种方式。我在Ubuntu上使用bullet-2.82-r2704

只有m_restitution属性发生这种情况,所有其他属性设置正确,我的问题的方式。

此外,行dynamicsWorld->getSolverInfo().m_splitImpulse = false;不再需要。