2017-10-10 29 views
3

私はの春の規制をテストしたいです。Bullet Physicsだから私は静的な箱を地面の上に置いて、それからぶら下がっている第二の動的な箱を作りました。しかし、春の行動を活性化することは何もしません!箱は実際に自由にぶら下がっている。自由に回転するので私はそれを知っています。しかし、それは振動するものではありません。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(); 
関連する問題