【问题标题】:box2d revolute joint motorSpeed adjustment has no effectbox2d旋转接头电机调速没有效果
【发布时间】:2013-07-01 19:49:18
【问题描述】:

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

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

【问题讨论】:

  • 我怀疑你可以用恒定的电机速度做到这一点。尝试根据手臂/手与目的地的距离来调整速度。

标签: ios box2d revolute-joints


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多