2013-02-07 92 views
4

我想用box2djs模擬彈簧效果。 經過大量的搜索後,我覺得可以使用那個distancejoint(我不確定)。 我嘗試了下面的代碼,但我沒有看到身體之間的任何關節。box2djs中的彈簧效果

distance_joint = new b2DistanceJointDef(); 

distance_joint.body1 = Body1; 

distance_joint.body2 = Body2; 

distance_joint.localAnchorA = new b2Vec2(0, 0); 

distance_joint.localAnchorB = new b2Vec2(0, 0); 

distance_joint.length = 3; 

distance_joint.collideConnected = true; 

return world.CreateJoint(distance_joint); 

任何想法...

感謝

回答

3

你是對的,距離聯合可作爲春天。這在Box2D手冊中有說明:

距離接頭也可以做成柔軟的,就像彈簧減震器連接一樣。查看測試平臺上的Web示例,瞭解它的行爲。

通過調整定義中的兩個常量來實現柔軟度:頻率和阻尼比。將頻率看作諧波振盪器的頻率(如吉他弦)。頻率以赫茲爲單位。通常,頻率應該小於時間步長頻率的一半。所以如果你使用60Hz的時間步長,距離關節的頻率應該小於30Hz。原因與奈奎斯特頻率有關。

阻尼比是無量綱的,通常介於0和1之間,但可以更大。在1時,阻尼是關鍵的(所有振盪應該消失)。

jointDef.frequencyHz = 4.0f; 
jointDef.dampingRatio = 0.5f; 
+0

謝謝,現在問題的第二部分......爲什麼會出現兩個機構之間沒有形成任何距離聯合...有代碼中的任何問題.. 。我可以發佈更多的代碼,如果necesssary ... – Rajesh

+0

爲refernce這是我的主要功能 - > '$(函數(){ 世界 = createWorld(); 帆布=的document.getElementById(' 遊戲'); ctx = canvas.getContext('2d'); canvas_width = parseInt(canvas.width); canvas_height = parseInt(canvas。高度); createGround(canvas_width/2,canvas_height - iBorder,canvas_width/2,iBorder,0); Body1 = CreateObject1(); Body2 = CreateObject2(); \t \t CreateJoint(); (); $(canvas).mousedown(function() { \t \t ChangePosition(); }); \t \t frame(); });' – Rajesh

+0

請告訴,什麼返回CreateJoint方法。 – Pavel

0

CreateJoint返回b2Joint(創建關節),但是這不是問題...... 我發現了問題。 其實我設置本地錨點作爲

distance_joint.localAnchorA = new b2Vec2(0, 0);

distance_joint.localAnchorB = new b2Vec2(0, 0);

,而我想

distance_joint.anchorPoint1.Set(0.0, 0.0);

distance_joint.anchorPoint2.Set(0.0, 0.0);

創建的錨點世界現在,關節 正確創建。 還有一個問題......因爲我試圖實現春季效果,我嘗試在第二個身體中間設置錨點,但我沒有獲得成功。

任何想法..

感謝