2013-07-01 43 views
0

我認爲是一個直接box2d配置包括一個box2d手臂(上臂,前臂和手)靜態身體,其中手臂連接到身體與一個旋轉關節。目標是將手臂向後拉,這樣當手臂向前移動(即腋下投擲)時手中的物體可以被釋放。我已經使電機能夠協助手臂進行腋下運動。box2d旋轉關節馬達速度調整沒有效果

的問題是,我不能拿出的參數值,使不吹過去,我手臂上啓用了限制的現實手臂速度。如果我將maxMotorTorque設置爲一個較小的值(例如小於3.0的任何數字),手臂會逆時針旋轉,並且不會停在我設定的極限上。如果我在每秒5.0至15000.0弧度的範圍內電機轉速設置爲任何,當maxMotorTorque被設定爲4.0的臂的速度不會改變。如果我將maxMotorTorque減小到一個很小的值,那麼手臂會飛過去,但它又一次超過極限。

下面是我使用初始化轉動關節的代碼:

// Create a Revolute Joint at the shoulder 
b2RevoluteJointDef revJointDef; 
revJointDef.Initialize(body, upperArmBody, 
         upperArmBody->GetWorldPoint(b2Vec2(0, 15.0/100.0))); 

revJointDef.enableLimit = true; 
revJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(-45); 
revJointDef.upperAngle = CC_DEGREES_TO_RADIANS(20); 

revJointDef.enableMotor = true; 
revJointDef.motorSpeed = 15000.0; 
revJointDef.maxMotorTorque = 4.0; 

shoulderJoint = (b2RevoluteJoint*)world->CreateJoint(&revJointDef); 

臂的密度爲0.5和對象的手中的密度爲1.0。減少這些密度將使手臂移動得更快,但它又一次超過了極限。

什麼我做錯了任何想法?我怎樣才能讓手臂快速移動而不會超出極限?

+0

我懷疑你可以用恆定的電機速度來做到這一點。嘗試根據手臂/手到目的地的距離來調整速度。 – iforce2d

回答

0

當自動出現故障時,它的時間把所有的手。有可能soultions:

  1. 嘗試通過預先計算好的軌跡與b2MotorJoint移動臂(或b2MouseJoint,如果你的Box2D的是舊的)。我認爲,這是您的任務的最佳解決方案。
  2. 幫助關節限制,以及止動臂移動(即設定速度爲零),當它到達它們。例如,看我的回答there。有了這個,可以爲maxMotorTorque設置更大的值。手動施加脈衝
  3. 移動臂。
  4. 也許,物理限制器可以使工作做得更好。我的意思是創造一些身體(與偉大的裝置),只有與武器相撞(collision filtering)。