Box2d使用力或冲动在身体周围旋转身体

时间:2013-11-08 12:28:30

标签: box2d geometry

我的身体应该在某个点上移动。如果我按“右”身体顺时针移动,如果我按左身体逆时针方向移动。我应该申请哪种力量?

2 个答案:

答案 0 :(得分: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);

这有用吗?

答案 1 :(得分:0)

你要使用

body->ApplyAngularImpulse(2.0);

body->ApplyTorque(2.0);

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