5

Bullet Physics を物理シミュレーション エンジンとして使用するキャラクター アニメーション レンダリング エンジンを作成しています。

シーケンスは画面にモデルが表示されていない状態で開始され、そのモデルにアニメーションが割り当てられ、モデルがアニメーションのフレーム 0 に移動され、エンジンがアニメーションを使用してモデルのレンダリングを開始します。

フレーム 0 で初期化されたときに、キャラクター モデルの剛体を再配置する正しい方法は何ですか?

現在、アニメーションがモデルに割り当てられ、ボーンがフレーム 0 の位置に移動された直後に呼び出されるこのコードを使用しています。

_world->removeRigidBody(_body);
bool k = (_type == Kinematics);
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans()));
tr *= _trans;
_body->setCenterOfMassTransform(tr);
_body->clearForces();
_body->setLinearVelocity(btVector3(0,0,0));
_body->setAngularVelocity(btVector3(0,0,0));
_world->addRigidBody(_body, _groupID, _groupMask);

問題は、これが機能する場合と機能しない場合があることです。例として、モデルのスカートを取り上げます。自然な位置に表示される場合もあれば、わずかにずれて所定の位置に収まる場合もあれば、衝突がオフになって何らかの力でその方向に押し出されたかのように、ボディを完全に切り取って表示される場合もあります。ほとんどの場合、これは理にかなっています。テスト アニメーションでは、モデルの初期位置が画面の中央にあるのに、アニメーションは画面の左側から開始されるためです。これを解決する方法を知っている人はいますか?

スカートのボーンが問題ではないことはわかっています。物理演算をオフにして、フレームごとに強制的にボーンの位置を手動で更新したため、アニメーション全体ですべてが正しい位置にありました。

編集:私にも制約がありますが、それが原因でしょうか?

4

3 に答える 3

4

これがまさにこれを行う私の再配置方法です。

void LimbBt::reposition(btVector3 position,btVector3 orientation) {
    btTransform initialTransform;

    initialTransform.setOrigin(position);
    initialTransform.setRotation(orientation);

    mBody->setWorldTransform(initialTransform);
    mMotionState->setWorldTransform(initialTransform);
}

モーション ステート mMotionState は、最初に btRigidBody 用に作成したモーション ステートです。clearForces() と速度を追加するだけで、ポータルを通過したかのようにボディが新しい位置から移動するのを止めることができます。それはそれを行う必要があります。ここでうまく機能します。

編集:すべてのリジッドボディを正しく再配置すると、制約が適応します。そのためには、相対位置を簡単に計算し、それに応じて拘束された Rigidbody コンストラクト全体を再配置できます。誤って行うと、コンストレイントが構造を数値的に調整しようとするため、深刻なけいれんが発生し、コンストレイントのギャップが大きい場合に大きな力が発生します。

Edit2: もう 1 つの問題は、決定論的な動作が必要な場合 (ボディをリセットするたびに、まったく同じになるはずです)、古い dynamicsWorld を強制終了し、再作成して、すべてのボディを再度追加する必要があることです。世界には、今のところクリアできない死体に関するいくつかの情報が保存されています。これは、bullet4 が確定的なリセットをサポートする予定であるため、将来変更される可能性があります。しかし今のところ、決定論的なリセットで実験を行う場合は、世界を落として再作成する必要があります。

ソース: Bullet Physics の開発者である Erwin Coumans とのディスカッション

于 2015-08-24T10:49:05.817 に答える