Bullet物理エンジンでY軸の動きを無効にする方法


11

X軸とZ軸に沿って移動するだけでなく、Y軸を無効にしたままオブジェクトを作成したいと思います(2Dでの移動と同じで、オブジェクトが落ちることはありません)。

現在、Y軸の動きを制限するために6自由度の制約を使用していますが、機能しません。

btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();

btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);

constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));

constrict->setAngularLowerLimit( btVector3( 1,  1,  1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );

mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);

ありがとう!


多分これは役立ちます:bulletphysics.org/Bullet/phpBB3/...は、おそらくまた、代わりに1の、0にY軸の下限/上限の制限を設定
deceleratedcaviar

回答:


20

Bulletでこれを実現するための好ましい方法は、問題のボディの線形係数と、場合によっては角度係数を設定することです。このメソッドは、Bullet Wikiページでコードスニペットとして表示されます。

Y軸のみに沿った移動を許可するには、次のようなものを使用します。

body->setLinearFactor(btVector3(0,1,0));

特定の軸を中心とした回転をさらに無効にする場合は、同じ手順を使用しますが、setAngularFactor代わりに関数を使用します。

この単純な例のビデオ Iは、Y軸に沿っ無効移動するには、次の2つのコールを使用しているとだけY軸回りの回転を可能にします。これにより、ボディは効果的に、最初に作成されたXZ平面に留まります。

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

これを行う1つの方法は、物理ティックコールバックを作成することです。これは、弾丸が内部でティックするたびに呼び出されます。このコールバックでは、Y速度を0に設定して、Y移動を効果的に無効にすることができます。次のようになります。

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

シミュレーションティックコールバックの詳細については、こちらをご覧ください


ありがとうございました!これは、JBulletのJavaポートにも適用されるため、すばらしい答えです(他の答えとは異なります)。
joehot200
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.