私は現在、 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);