我有一个应该在某个点周围移动的身体。如果我按下“右”身体顺时针移动,如果我按下左身体逆时针方向移动。我应该使用哪种力量来做到这一点?
问问题
3274 次
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 回答