【发布时间】:2013-11-08 12:28:29
【问题描述】:
我的身体应该围绕某个点移动。如果我按下“右”身体顺时针移动,如果我按下左身体逆时针方向移动。我应该使用哪种力量来做到这一点?
【问题讨论】:
我的身体应该围绕某个点移动。如果我按下“右”身体顺时针移动,如果我按下左身体逆时针方向移动。我应该使用哪种力量来做到这一点?
【问题讨论】:
我认为您需要在要旋转的点处创建一个静态体,然后使用 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);
这有帮助吗?
【讨论】:
你可以使用任何一个
body->ApplyAngularImpulse(2.0);
或
body->ApplyTorque(2.0);
顺时针旋转时使用正力,逆时针旋转时使用负力。
【讨论】: