0

我有一个我认为是直截了当的 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。降低这些密度将使手臂移动得更快,但它又一次突破了极限。

关于我做错了什么的任何想法?我怎样才能让手臂更快地移动而不会超出限制?

4

1 回答 1

0

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

  1. 尝试通过预先计算的轨迹使用 b2MotorJoint(或 b2MouseJoint,如果您的 box2d 旧)移动手臂。我认为,这是您任务的最佳解决方案。
  2. 帮助关节限制,并停止手臂移动(即,将速度设置为零),当它到达它们时。例如,请参阅我的答案。这样,就可以为 maxMotorTorque 设置更大的值。
  3. 通过施加脉冲手动移动手臂。
  4. 也许,物理限制器可以使工作更好。我的意思是创建一些仅与手臂发生碰撞的物体(具有出色的固定装置)(碰撞过滤)。
于 2013-07-02T04:55:52.947 回答