box2d旋转关节电机速度调节无效

时间:2013-07-01 19:49:19

标签: ios box2d revolute-joints

我认为是一个直接的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。减少这些密度将使手臂移动得更快,但它再次超过极限。

关于我做错的任何想法?如何在不超出极限的情况下让手臂移动得更快?

1 个答案:

答案 0 :(得分:0)

当自动失败时,是时候全力以赴了。可能有灵魂:

  1. 尝试通过预先计算的轨迹用b2MotorJoint(或b2MouseJoint,如果你的box2d是旧的)移动手臂。我认为,这是您的任务的最佳解决方案。
  2. 帮助关节限制,并在它到达时停止手臂移动(即设定速度为零)。例如,请参阅我的回答there。有了这个,就可以为maxMotorTorque设置更大的值。
  3. 使用冲动手动移动手臂。
  4. 也许,物理限制器可以使工作更好。我的意思是创造一些身体(有很好的固定装置),只与手臂碰撞(collision filtering)。