2011-08-10 60 views
0

請參閱視頻在執行Hookes法則/彈性繩索的幫助不大?

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

的「棕色」體控制與鼠標按下鼠標時我計算利用胡克定律(吹罰至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

你希望兩個機構完成了相互接觸?如何做你已經有的東西,再加上兩個身體之間的弱小鼠關節? – iforce2d

+0

哦,它沒有發生在我之前..謝謝小費! –

+1

您也可以添加一些摩擦,如空氣阻力。根據能量守恆,你看到的行爲是正確的。 – Beta

回答

1

Hooke's law當併入Newton's Second law是二階微分方程:m d^2 x/dt^2 = - k x,其中x是一個矢量。正如Beta在評論中指出的,你可以增加摩擦。如果沒有摩擦項,像你觀察到的軌道是常見的,它們將無限期地持續下去。通常的方式增加摩擦力是增加一個與速度成正比的項,並且像胡克文術語(-k*x)一樣,它也是負的,即它反對運動。

如果我正確地讀取了您的代碼,那麼在設置forceMag後面的註釋中已經有這樣的術語。但是,我不明白你對vrel的計算,它看起來像是相對速度和連接兩個物體的矢量之間的點積。 vdiff已經是正確的形式。此外,不像彈簧力,這個力沿着相對速度引導(vdiff)。因此,要實現它,我會改變行,你就bodyA打電話ApplyForce

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