私は現在、C++とOgre3Dを使って書いている3D空間ゲームのためにBullet Physics Libraryを評価しています。私はOgre3DとBulletをbtMotionStateから引き出し、自分のSceneNodeをプラグインしてうまく統合しましたが、今はbtRigidBody :: applyCentralImpulseメソッドとbtRigidBody :: applyTorqueImpulseメソッドに渡すべき値を計算するのに苦労しています私が探している結果Bullet Physics - ボディのローカルスペースにトルクインパルスを適用する
キーボードの左または右のキーを押すと、宇宙船がローカルのZ軸上を回転します。 UPまたはDOWNを押すと、ローカルのX軸でピッチを調整します。 AまたはZを押すと、ローカルZ軸の方向に加減速します。私はいくつかの四元数学を使ってこれをOgreで完璧に達成でき、SceneNodeに直接平行移動/回転を適用することができますが、力/トルク法を使って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);
インパルスAPIに四元数を渡すことができますか、何らかの形で四元数を渡すことができるものに変換できますか? – fbrereto
APIからわかるように、線形インパルス法は、ワールド座標の方向のx、y、zベクトルのみを受け取り、角度インパルス法はヨーのy、p、rベクトルのみを受け取り、ピッチ、ロールをワールド座標系に変換します。数学は私の頭を少し上回っているかもしれませんが(私はドットとクロスのようなものを視覚化するのに苦労します)、実際のBullet API自体は私の頭を越えて全く新しいものです...これらの2つの組み合わせは私現時点では不可能な人生。 – Lusid