请参阅
上的视频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
答案 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());