0

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

4

2 回答 2

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)。所以只要你用力,它就会继续旋转。如果你停止施力,它应该轻轻地停止。您可以通过加速度值和阻尼值参数来控制加速/减速。

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

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

这个有帮助吗?

于 2013-11-11T23:45:10.240 回答
0

你会使用

body->ApplyAngularImpulse(2.0);

或者

body->ApplyTorque(2.0);

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

于 2013-11-08T13:04:28.130 回答