19

私は現在、 C++とOgre3Dを使用して書いている3D宇宙ゲームのBulletPhysicsLibraryを評価しています。btMotionStateから派生し、SceneNodesをプラグインすることで、Ogre3DとBulletをうまく統合しましたが、達成するためにbtRigidBody::applyCentralImpulseメソッドとbtRigidBody::applyTorqueImpulseメソッドに渡す必要のある値を計算するのに多くの問題があります。私が探している結果。

キーボードのLEFTキーまたはRIGHTキーを押すと、宇宙船がローカルのZ軸上を回転するようになります。上または下を押すと、ローカルX軸にピッチングします。AまたはZを押すと、ローカルZ軸の方向に加速/減速したい。いくつかのクォータニオン数学を使用し、SceneNodeに直接変換/回転を適用することで、Ogreでこれを完全に達成できますが、force /トルクメソッドを使用してこれらの値をBulletエンジンに適用したいので、移動/ピッチ/ロールを継続しますユーザーがキーを押すのをやめた後でも、必要に応じてオブジェクトに摩擦が作用して速度が低下します。

では、インパルスが世界の軸を使用するのではなく、体の現在の向きに基づいて作用することを保証するために、これら2つのインパルスメソッドに提供するために必要な値を計算するにはどうすればよいですか?

ありがとう、マーク

アップデート:

前後の動きに必要なインパルスを計算することはできましたが、トルクインパルス法で使用するためにヨー/ピッチ/ロールの値の向きを変える方法にまだ苦労しています。これが私が前進/後退運動をした方法です:

if (mKeyboard->isKeyDown(OIS::KC_A))
    mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * 20 * time);
if (mKeyboard->isKeyDown(OIS::KC_Z))
    mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * -20 * time);
4

2 に答える 2

3

だから btRigidBody.h を見て

次のコードに気付きました。

     void applyTorqueImpulse(const btVector3& torque)
     {
                     m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
     }

私が理解しているように、トルクは、宇宙船に関連付けられた x (または z) 軸の周りの回転ベクトルの定数倍に等しくする必要があります。

私たちが知っているように、一般化された回転行列は次のように決定できます。

  1. 回転して軸プリフォームを整列
  2. 標準軸を中心とした回転
  3. ステップ 1 の逆

これは、軸に沿ったトルク (頭のてっぺんからはわかりません) を識別できる場合は、次のように変換できることを意味します。

mBody->getWorldTransform()*axisAlignedXTorque

http://www.bulletphysics.com/Bullet/BulletFull/classbtTransform.htmlによると 、ここの * 演算子は、Torque ベクトルでワールド変換を実行するためにオーバーライドされます。

于 2009-11-05T21:27:31.503 に答える
1
body->getInvInertiaTensorWorld().inverse()*(body->getWorldTransform().getBasis()*torque)

長い間フラストレーションを感じた後、ようやく上記を applyTorqueImpulse (または applyTorque) への入力として使用して、ボディ ローカル トルクが機能するようになりました。この時点でなぜそれが機能するのかを理解しているふりはしませんが、機能します。

ブレットから:

    void applyTorqueImpulse(const btVector3& torque)
{
        m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
}

おそらくこれは、軸に沿ったトルクの生成について tzenes が言及していたことです。しかし、この方法を行っている例が他にないことに困惑しています。他の誰かが体の局所空間にトルクを加えたいと思ったのでしょうか? しかし、オンラインで見つけたものは、本来あるべきように見えたにもかかわらず、まったく機能しませんでした。

transform*torque のみを適用すると、最初は機能しているように見えますが、世界の原点から離れ始めるまで続きます。そのため、原点から離れるほど回転しづらくなったり、本体の位置によって逆回転し始めたりする場合は、これが問題である可能性があります。

編集: ああ、これが私の翻訳方法です:

btVector3 m = body->getWorldTransform().getBasis()*btVector3(strafe,move,rise);

于 2013-05-11T23:37:35.633 に答える