【问题标题】:Box2d Rotate body around point using forces or impulses [closed]Box2d使用力或脉冲围绕点旋转身体[关闭]
【发布时间】:2013-11-08 12:28:29
【问题描述】:

我的身体应该围绕某个点移动。如果我按下“右”身体顺时针移动,如果我按下左身体逆时针方向移动。我应该使用哪种力量来做到这一点?

【问题讨论】:

    标签: box2d geometry


    【解决方案1】:

    我认为您需要在要旋转的点处创建一个静态体,然后使用 b2DisanceJoint 连接您的旋转体和它。来自 Box2d 手册:

    b2DistanceJointDef jointDef;
    jointDef.Initialize(myBodyA, myBodyB, worldAnchorOnBodyA, worldAnchorOnBodyB); jointDef.collideConnected = true;
    world->CreateJoint(&jointDef);
    

    然后您必须对您的身体(假设是 myBodyB)施加一些力,以使其朝正确的方向移动,使其围绕 myBodyA 旋转。这将需要一些数学知识。

    您要做的是计算垂直于从 myBodyB 指向 myBodyA 的向量的向量。为此,您可以找到从 myBodyB 到 myBodyA 的向量,对其进行归一化,取其偏斜(按 PI/2 旋转),然后将其用作力方向。比如:

    // Calculate Tangent Vector
    b2Vec2 radius = myBodyB.GetPosition()-myBodyA.GetPosition();
    b2Vec2 tangent = radius.Skew();
    tangent.Normalize();
    
    // Apply some force along tangent
    myBodyB.ApplyForceToCenter(body->GetMass()*acceleration*vTangent);
    

    如果你没看错的话,你可以看到 F = m * a * tangentVector;也就是说,您正在向切线方向施加力。我相信它会顺时针旋转(如果我做对了)。无论如何,力的负数会将其向相反方向移动。

    要停止身体旋转,您可以在其上使用 SetLinearDamping(dampingValue)。所以只要你用力,它就会继续旋转。如果你停止施力,它应该轻轻地停止。您可以通过加速度值和dampingValue参数来控制加速/减速。

    如果你真的想很好的控制速度,我相信你可以这样做来钳制速度:

    b2Vec2 linVel = myBodyB.GetLinearVelocity();
    linVel.Normalize();
    linVel *= maxSpeed;
    myBodyB.SetLinearVelocity(linVel);
    

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      你可以使用任何一个

      body->ApplyAngularImpulse(2.0);
      

      body->ApplyTorque(2.0);
      

      顺时针旋转时使用正力,逆时针旋转时使用负力。

      【讨论】:

      • 没有。这将使身体围绕它的质心旋转身体。我需要绕世界的某个点旋转。
      • 在这种情况下,您必须设置另一个主体(可能是静态主体)作为锚点,并用旋转关节将它们连接起来。旋转关节的位置将是旋转轴。
      • 用关节怎么样?否则,您将需要同时移动和旋转身体,并自己计算必要的运动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多