2017-10-10 92 views
3

我想測試子彈物理的彈簧約束。所以我創造了一個靜止的箱子懸浮在地面上,第二個動態箱子從它上面垂下來。但激活彈簧行爲什麼也不做!盒子的確自由懸掛。我知道它是因爲它可以自由旋轉。但它不振盪或任何東西。如何用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(); 

出了什麼問題?我用StiffnessDamping參數玩了很多。但它沒有改變。設置線性下限和上限可使盒子在y方向上移動,但仍不會振盪。是的,重力被激活。

回答

2

好吧,我找到了一個解決方案,通過檢查Bullet提供的示例項目(可能已經提出了這個想法)。三件事情我已經學會:

  • 彈簧約束將違反線性限制。我以前的方法存在的問題是,線性運動要麼鎖定,要麼限制在指定彈簧剛度的太小範圍內。現在沒有更多的限制(通過設置高於上限的下限)。
  • 剛度太小,所以連接的物體就好像它們可以在線性限制內自由移動一樣。你可以查看下面我的代碼中的值,我從示例項目中獲得了它們。
  • btGeneric6DofSpringConstraintbtGeneric6DofSpring2Constraint之間的行爲有一個小的差異。前者似乎更少的非彈簧軸(在我的情況下是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();