2009-11-04 23 views
18

我目前正在評估我用C++編寫的3D空間遊戲Bullet Physics LibraryOgre3D。我已經通過派生自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); 
+0

你可以通過四元數的衝動API或以某種方式四元數轉換的東西,你可以通過? – fbrereto 2009-11-04 22:24:04

+0

從我可以在API中看到的,它出現在線性脈衝法僅在世界座標接受一個x,y,z中的方向的矢量,和角脈衝法只接受一個Y,P,R矢量偏航,俯仰和滾動世界座標。雖然數學可以在我的頭上略(我有一個很難形象化的東西像點和跨產品),實際子彈API本身是遠遠超過我的頭,完全新的給我...這兩者的結合使我的現在的生活是不可能的。 – Lusid 2009-11-05 00:06:11

回答

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 這裏的*運算符被覆蓋以預製轉矩矢量的世界變換。

1
body->getInvInertiaTensorWorld().inverse()*(body->getWorldTransform().getBasis()*torque) 

後挫折長時間的,我終於體本地扭矩使用上述作爲輸入到applyTorqueImpulse(或applyTorque)工作。我不假裝爲什麼在這一點上起作用,但它確實如此。

從子彈:

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

也許這就是tzenes剛提過關於生產對準扭矩軸。但我感到困惑的是,我找不到任何其他人這樣做的例子。當然其他人已經想要在人體局部空間施加扭矩?但是,儘管它看起來應該如此,但我在網上找到的任何東西都無法工作。

如果僅應用變換*扭矩,它會像它工作在第一,直到你開始從你的世界的起源移開。所以,如果感覺難以進一步您遠離原點,或者如果事情開始依賴於在身體轉動相反,這可能是你的問題旋轉。

編輯: 哦,這裏就是我有我的翻譯:

btVector3 M =身體 - > getWorldTransform()getBasis()* btVector3(掃射,移動,上升);