我目前正在評估我用C++編寫的3D空間遊戲Bullet Physics Library和Ogre3D。我已經通過派生自btMotionState並插入SceneNodes來很好地集成了Ogre3D和Bullet,但是現在我在計算應該傳遞給btRigidBody :: applyCentralImpulse和btRigidBody :: applyTorqueImpulse方法的值時遇到了很多麻煩,以便實現我正在尋找的結果。Bullet Physics - 在人體局部空間中應用轉矩脈衝
當我按下鍵盤上的LEFT或RIGHT鍵時,我想宇宙飛船在本地Z軸上滾動。當我按UP或DOWN時,我想讓它在當地的X軸上投球。當我按A或Z時,我希望它在本地Z軸的方向上加速/減速。我可以在Ogre中使用一些四元數學並在SceneNode上直接應用平移/旋轉來完美實現這一點,但我真的希望使用力/力矩方法在Bullet引擎中應用這些值,以便它繼續移動/俯仰/滾動即使在用戶停止按下按鍵之後,摩擦也會在物體上起作用,以便在必要時減慢它。
那麼,如何計算提供給這兩種衝動方法的必要值,以確保脈衝基於身體的當前方向而不是使用世界座標軸?
感謝, 馬克
更新:
我能計算出所需的向前和向後運動的衝動,但我仍然是如何重新定位偏航/俯仰/滾動值掙扎以便用扭矩衝擊法來使用它們。以下是我做的向前/向後移動:
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 2009-11-04 22:24:04
從我可以在API中看到的,它出現在線性脈衝法僅在世界座標接受一個x,y,z中的方向的矢量,和角脈衝法只接受一個Y,P,R矢量偏航,俯仰和滾動世界座標。雖然數學可以在我的頭上略(我有一個很難形象化的東西像點和跨產品),實際子彈API本身是遠遠超過我的頭,完全新的給我...這兩者的結合使我的現在的生活是不可能的。 – Lusid 2009-11-05 00:06:11