实施Hookes法/弹力绳的帮助不大?

时间:2011-08-10 07:49:40

标签: cocos2d-iphone physics box2d game-physics

请参阅

上的视频

http://www.youtube.com/watch?v=_DyzwZJaDfM

“棕色”的身体由鼠标控制,当按下鼠标时,我使用Hookes法则计算力量(参考http://www.box2d.org/forum/viewtopic.php?f=4&t=116),“蓝色”身体应该吸引到“棕色”身体。

但是正如视频中所见,“蓝色”的身体绕着轨道运转并且没有停止。我想要实现的是“弹力绳”之类的东西。 首先我尝试使用DistanceJoint,但我无法给关节提供静态距离。

这是我对霍克斯法的实施 -

-(void)applyHookesLaw:(b2Body*)bodyA:(b2Body*)bodyB:(float) k:(float) friction:(float)desiredDist
{
    b2Vec2 pA=bodyA->GetPosition();
    b2Vec2 pB=bodyB->GetPosition();
    b2Vec2 diff=pB- pA;
    b2Vec2 vA=bodyA->GetLinearVelocity();
    b2Vec2 vB=bodyB->GetLinearVelocity();
    b2Vec2 vdiff=vB-vA;
    float dx=diff.Normalize();
    float vrel=vdiff.x * diff.x + vdiff.y * diff.y;
    float forceMag= -k*(dx-desiredDist);//-friction*vrel;
    diff*=forceMag;
    bodyA->ApplyForce(-1*diff,bodyB->GetPosition());

    //bodyA->wakeUp() 

}

请提示?

PS - 世界的引力是0.0

1 个答案:

答案 0 :(得分:1)

Hooke's law合并到Newton's Second law时是二阶微分方程:m d^2 x/dt^2 = - k x,其中x is是向量。正如Beta在评论中指出的那样,你可以添加摩擦力。没有摩擦术语,像你观察到的轨道是常见的,它们将无限期地持续下去。通常添加摩擦的方法是添加一个与速度成比例的术语,就像胡克语术语(-k*x)一样,它也是负数,即它反对运动。

如果我正确地阅读了您的代码,那么在设置forceMag之后的评论中您已经有类似该术语的内容。但是,我不理解你对vrel的计算,它看起来像是相对速度和连接两个物体的矢量之间的点积。 vdiff已经是正确的形式。而且,与弹簧力不同,该力沿着相对速度(vdiff)被引导。因此,要实现它,我会更改您在ApplyForce上致电bodyA的行

bodyA->ApplyForce(-1*diff - friction*vdiff,bodyB->GetPosition());